웹(Web)/백엔드(Backend)

DTO vs VO 비교 (+Entity)

SK_MOUSE 2022. 2. 13. 13:34
반응형

先 요약

  DTO VO Entity
용도 레이어 간 데이터 전달 값 자체 표현 DB 테이블과 매핑되는 클래스
동등 결정 속성값이 모두 같다고 해서 같은 객체 X 속성값이 모두 같으면 같은 객체 O  
가변/불변 setter - 존재시:가변 / 비존재시:불변 불변 가변 객체 생성 후 상태 변경 O
로직 getter/setter 외의 로직을 갖지 않음 getter/setter외에도 다른 로직을 가질 수 있다. 로직 포함O

출처 : 우아한테크코스 인비 크루( https://www.youtube.com/watch?v=z5fUkck_RZM )


DTO(Data Transfer Oject)

: 데이터를 전달하기 위해 사용하는 객체

: 데이터를 담아서 전달하는 '바구니'

Controller <-> Service간의 전달 역할하는 DTO

  • getter/setter 메서드만을 갖는다!
  • 다른 로직 X

예시

DTO와 반환하는 방식

DTO(좌) --> CrewDto(우)에 값을 전달하는 역할

 

추가) DTO, Entity 분리

DTO와 Entity는 분리해야 View가 변화할때마다 바꿀필요가 없어진다.


VO(Value Object)

: 값 그 자체를 표현하는 객체

돈으로 VO의 예시를 들어보겠다.

고유번호가 같더라도 같은 만원인 경우도 있음!

돈의 고유번호 : 생성자를 통해서만 value값 초기화

  • getter/setter 중 보통 getter의 기능만 포함, 위에서는 생성자로만 값을 받음!
  • 이외의 로직 모두 가능!!

단 이경우, 속성값만으로 비교하지않기 때문에 equals와 hashCode 비교는 오류가 발생함.

=> 해결방법?

hashCode와 equals메소드를 Override해서 고유값만으로 비교하게 변경

코드는 아래와 같이 오버라이딩 하면 된다.

돈의 고유번호(value)로만 비교하여 일치하면 true를 반환하게 함.

위 과정을 통해 Money class를 완전한 VO로 만들어주었다.

 

반응형