본문 바로가기

JAVA

[JAVA] DTO와 VO

DTO (Data Transfer Object)

계층 간 데이터를 전달하는 객체로 로직을 갖고 있지 않은 순수한 데이터 객체이다.

데이터 전달 용도로만 사용하기 때문에, getter/setter 로직만 가지고 있다.

setter의 경우 변조 가능성이 있어, 생성자로 값을 넣어주어 전달 과정에서 변조가 불가능 하도록 할 수 있다.

public class UserDTO {
    
    private String name;
    private String id;

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

    public void setId(String id) {
        this.id = id;
    }
}

// 생성자 이용
public class UserDTO {
    
    private String name;
    private String id;
    
    public UserDTO(String name, String id) {
    	this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }
    
	public String getId() {
        return id;
    }
}

 

VO (Value Object)

도메인에서 한 개 또는 그 이상의 속성들을 묶어 특정 값을 나타내는 객체이다.

로직을 포함할 수 있고, 특정 값 자체를 나타내기 때문에 불변성 보장을 위해 생성자를 사용해야 한다.

 

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

핸드폰 색깔의 값을 가진 VO를 만들어 값이 같은 두개의 객체를 생성하고 동일성 비교해보면 다른 객체로 구별이 된다.

public class PhoneVO {

    private final String color;

    public PhoneVO(String color) {
        this.color = color;
    } 
}

// Test
@Test
void equals() {
	final String color = 'red';
    
    PhoneVO phone1 = new PhoneVO(color);
    PhoneVO phone2 = new PhoneVO(color);
    
    assertThat(phone1 == phone2).isFalse();	// 동일성 비교
}

 

동일성(==) 비교는 객체의 주소값을 비교하기 때문에, 값이 같은 것과 별개로 에러가 난다.

객체가 포함하고 있는 속성 값들을 기준으로 객체를 비교하려면 동등성 비교를 통해 비교해야한다.

어떤 속성값들을 기준으로 동등성 비교를 할 지는, equals 메서드와 hashCode 메서드를 오버라이딩(재정의)을 통해 정해야 한다.

 

...
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PhoneVO phoneVO = (PhoneVO) o;
        return Objects.equals(color, phoneVO.color);
    }

    @Override
    public int hashCode() {
        return Objects.hash(color);
    }
...

 

참고

https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/

https://maenco.tistory.com/entry/Java-DTO%EC%99%80-VO%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

'JAVA' 카테고리의 다른 글

[Java] 다형성(polymorphism)  (0) 2023.07.05
[Java] 상속(Inheritance)  (0) 2023.07.05
Annotation 어노테이션  (0) 2023.04.12
컬렉션(자료구조)  (0) 2023.04.04
배열(자료구조) Array  (0) 2023.04.04