DTO : 데이터 전달용
VO : 값 표현용
DTO
= Data Tranfer Object
= 데이터를 전달하기 위해 사용하는 객체
= 데이터를 담아서 전달하는 바구니
특성
- 오직 getter/setter 메서드만 갖는다.
- 다른 로직은 갖지 않는다.
setter 메서드를 가질 경우 setter 메서드로 새로운 값 설정이 가능하므로 데이터가 가변적이라 할 수 있다. setter 메서드를 삭제한다면 생성자를 통해 속성값을 초기화하게 만들어 불변객체로 만들면 DTO가 전달하는 데이터가 전달 과정 중에 변조되지 않음을 보장할 수 있다.
Entity Class는 DB와 매핑되어 있는 핵심 클래스이기 때문에 절대로 요청이나 응답 값을 전달하는 클래스로 사용하면 안된다. 또한 Entity 클래스를 요청, 응답 값을 전달하는 클래스로 사용한다면 뷰가 변경될때마다 매번 같이 변경을 해야 한다. 따라서 요청이나 응답 값을 전달하는 클래스로는 뷰 변경에 영향을 받지 않고 자유롭게 변경할 수 있는 DTO를 사용해야한다.
VO
= Value Object
= 값 그 자체를 표현하는 객체
특성
- 값 자체를 표현하기에 불변객체여야 하므로 setter 사용하지 않고 생성자를 통해서만 값을 초기화한다.
- 다른 로직 포함 가능
아래와 같이 일반적인 객체는 기본적으로 equals와 hasCode를 사용한 비교 테스트가 모두 실해하는 것을 볼 수 있다.
public class Money {
private final int value;
public Money(int value) {
this.value = value;
}
public int getHalfValue() {
return value/2;
}
}
@Test
void test() {
final int MONEY_VALUE = 10000;
Money money1 = new Money(MONEY_VALUE);
Money money2 = new Money(MONEY_VALUE);
assertThat(money1).isEqualTo(money2); // 실패
assertThat(money1).hasSameHashCodeAs(money2); // 실패
}
두 객체가 동등한지 비교할 때 아래와 같은 과정을 거친다.
완전한 VO로 만들기 위해 객체를 속성 값들로만 비교하도록 equals 메서드와 hasCode 메서드를 모두 오버라이딩 해주어야 한다.
public class Money {
private final int value;
public Money(int value) {
this.value = value;
}
public int getHalfValue() {
return value/2;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Money)) {
return false;
}
Money money = (Money) o;
return value == money.value;
}
@Override
public int hashCode() {
return Objects.hash(value);
}
}
다시 test()를 실행해보면 통과하게 된다.
정리
참고
https://www.youtube.com/watch?v=z5fUkck_RZM&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC
'개발 관련 강의 정리 > 10분 테코톡' 카테고리의 다른 글
[10분 테코톡] 차리의 Stream (0) | 2023.07.19 |
---|---|
[10분 테코톡] 🎼라흐의 DTO vs VO 정리 (0) | 2023.07.12 |
[10분 테코톡] 💫두강의 Generics 정리 (0) | 2023.07.06 |
[10분 테코톡] 🌳 나봄의 CORS 정리 (0) | 2023.07.05 |
[10분 테코톡] 크리스, 로마의 stream vs for (0) | 2023.07.02 |
댓글