나를 기록하다
article thumbnail
Published 2023. 9. 12. 15:47
[테코톡] DTO와 VO Review/Techotalk
반응형

우테코

DTO(Data Transfer Object)

예시) OMR 카드

  • 계층(Layer)간 데이터를 전달하기 위해 사용하는 객체
  • getter와 setter 메서드 외에 특별한 기능을 가지지 않음
    → 정렬 직렬화 등 데이터 표현을 위한 기능은 가질 수 있음
  • 데이터의 캡슐화를 통해 유연한 대응이 가능
    → 데이터 요청 수 감소 효과. 각기 다른 API 요청 대신, DTO에 데이터를 묶어서 보냄으로 요 청 수 감소 효과 기대 가능
  • setter가 아닌 생성자를 이용해서 초기화 할 시 불변 객체로 활용 가능.
    → 불변 객체로 만들 시 데이터 전달 과정에서 데이터가 변조되지 않음을 보장
  • 비즈니스  로직을 포함하지 않음
public class OrderDTO {
    private Long orderId;
    private String customerName;
    private double totalPrice;

    // 게터와 세터 메서드 생략
}

VO(Value Object)

예시) 돈(money)

  • 값 자체로 의미를 갖는 객체, 주로 도메인 모델에서 사용
  • 변하지 않는 값을 가지는 객체(데이터 불변성)
    → 불변성을 보장하며 코드의 안정성과 효율성을 높임
  • 값이 같다면 동일한 객체(값에 대한 동등성)
    → 각 객체를 비교하는데 사용되는 ID 없음, 같은 객체인지 판단하기 위해 각 속성들의 값 비교

equals() & hashCode() 메서드

  • 두 객체가 동등한지 비교할 때 hashCode()의 리턴값을 비교 → 같을 시 equals()로 한 번 더 비교
    VO를 같은 객체로 판단하려면 모든 필드값을 hashCode() 메서드와 equals() 메서드로 비교할 수 있게 오버라이딩 필수
    (객체의 주소값은 달라도 모든 필드값이 같으면 같은 객체인 것이 VO이다)
  • 값을 변경할 수 있는 setter 메서드를 포함해서는 안된다.(Getter만 포함할 것)
    → 생성자를 통해서만 값을 초기화
  • 비즈니스 로직 포함 가능
public class CoordinateVO {
    private final double latitude;
    private final double longitude;

    public CoordinateVO(double latitude, double longitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    }

    // 게터 메서드만 포함
}

 

공통점과 차이점

공통점
  1. 레이어 간 데이터를 전달할 때 사용 가능(VO는 불변성 보장 → 데이터 전달 용도 사용 가능)
차이점
  1. DTO는 값 변화 가능 ↔ VO는 불변 객체
  2. DTO는 레이어와 레이어 사이에서 사용 가능 ↔ VO는 모든 레이어에서 사용 가능
  3. DTO는 dto1(1) != dto2(1) ↔ VO는 vo1(1) == vo2(1)
  4. DTO는 데이터 접근 이외의 기능을 가지지 않음 ↔ VO는 특정한 비즈니스 로직을 가질 수 있음
정리
DTO는 데이터 전달만을 위한 객체. 데이터 전달 이외의 비즈니스 로직을 가지지 않는다.
VO는 두 객체의 모든 필드 값들이 동일하다면, 두 객체는 같다는 것이 핵심.
equals()와 hashCode() 메서드의 오버라이딩이 가장 중요하고 setter와 같이 값을 변화시키는 메서드는 포함해선 안된다.(불변)

참고자료

https://www.youtube.com/watch?v=EeJnNaiMy3U&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=372 

 

반응형

'Review > Techotalk' 카테고리의 다른 글

[테코톡] Stream - 스트림, 알고 쓰자!  (2) 2023.10.24
[테코톡] MVC 패턴  (1) 2023.10.14
[테코톡] OCP와 전략패턴  (0) 2023.09.11
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...