심심한잉여의 잡동사니

[JAVA] DTO와 VO 본문

코딩일기/Java

[JAVA] DTO와 VO

심심한잉여 2022. 3. 30. 23:51
반응형

DTO와 VO에 대해 같은 것을 나타내는 것이라 생각을 했으나 이 둘의 용도차이가 있었다.

그 차이가 무엇인지 알아보자


DTO란?
순수하게 데이터를 담아 계층간으로 전달하는 객체

로직을 갖고 있지 않은 순수한 데이터 객체이며 메소드로는 getter/setter 만을 갖는다.

여기서 getter/setter 이외의 다른 로직이 필요 없는 이유를 자세히 알아보자면, 만약 DTO가 데이터를 전달만을 위한 객체라고 했을 때 완전히 데이터 전달 용도로만 사용하기 때문에 getter/setter로직 외의 다른 로직이 필요 없기 때문

 

public class UserDTO { 
	private String name; 
    private String id; 
    
    public String getName() {
    	return name; 
    } 
    
    public void setName(String name) { 
    	this.name = name; 
    } 
    
    public String getId() { 
    	return id; 
    } 
    
    public void setId(String id) { 
	    this.id = id; 
    } 
}

필요에 따라 setter를 없애 생성할 때 말고는 값에 접근을 하지 못하게 하여 전달하는 과정에서 변조가 불가능하게 하는 방법도 있다.


VO란?
값 그 자체를 나타내는 객체

DTO와 다르게 로직을 포함할 수 있으며, VO의 경우 특정 값 자체를 표현하기 때문에 불변성의 보장을 위해 생성자를 사용해야한다.

VO는 서로 다른 이름을 갖는 VO 인스턴스라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체인 것이 핵심이다.

public class CarVO { 

	private final String color; public CarVO(String color) { 
    	this.color = color; 
    }
    
    @Override public boolean equals(Object o) {
    
        if (this == o) return true; 

        if (o == null || getClass() != o.getClass()) return false;

        CarVO carVO = (CarVO) o; return Objects.equals(color, carVO.color); 
    
    } 
    
    @Override public int hashCode() { 
   	 	return Objects.hash(color); 
    } 
}

DTO와 VO의 차이

DTO는 계층간의 데이터 전송을 위한 객체로 getter/setter를 사용하여 보내는 사람은 setter를 사용해 값을 담고 받는 사람은 getter를 이용해 값을 꺼내 쓴다. 이 때 값의 변조를 막고 싶다면 setter를 없애 불변 객체로 만들면 된다.
DTO특성 상 데이터 전달만을 목적으로 하기 때문에 getter/setter 외 다른 로직이 필요없다.

VO의 경우 값 그 자체를 나타내는 것이며 핵심은 필드 값이 같다면 두 객체는 같은 객체로 볼 수 있다는 것.
이 때 주소값을 비교하는 경우에 문제가 생길 수 있으니 hashcode(), equals()에 대해 재정의를 하여 필드 값이 같다면 같은 객체로 인식이 될 수 있도록 해주는 것이 필요하다.

반응형

'코딩일기 > Java' 카테고리의 다른 글

[JAVA]POJO, DTO, DAO, VO  (0) 2022.04.07
[JAVA] 추상 클래스 VS 인터페이스  (0) 2022.03.31
[JAVA] 디자인패턴 - 싱글톤  (0) 2022.03.20
[JAVA] JAVA8 버전과 JAVA 11 버전의 특징  (0) 2022.03.15
HTTP와 HTTPS의 이해  (0) 2022.03.12