DTO vs VO

작성일

DTO

  • Data Transfer Object
  • 데이터를 전달하기 위해 사용하는 객체
  • 데이터를 담아서 전달하는 바구니

“계층 간” 데이터를 전달하기 위한 객체

image
Controller와 Service에 데이터를 전달하기 위해 DTO를 사용한다.

  • 오직 getter/setter 메서드만 갖어야한다.
  • 다른 로직은 갖지 않아야 한다.

DTO를 불변객체로

image
DTO는 setter 메서드를 가질 수 있는데 setter 메서드를 가지는 경우 데이터는 가변적이라고 할 수 있다. 그 이유는 setter 메서드로 새로운 값을 설정할 수 있기 때문이다. 하지만 오른쪽과 같이 setter 메서드를 삭제하고, 생성자를 통해 속성 값들을 초기화하여
불변객체로 만들어 버리면 DTO가 전달하는 데이터가 전달 과정중에 변조되지 않음을 보장할 수 있다.

DTO Class와 Entity Class를 분리하자

image
Entity Class는 절대로 요청이나 응답 값을 전달하는 클래스로 사용하면 안된다.
Entity Class는 데이터베이스와 매핑되어 있는 핵심 클래스이기 때문이다.
Entity Class를 기준으로 테이블이 생성되고 스키마가 변경이 되기 때문이다.
View는 비즈니스 요구사항에서 자주 변경되는 부분이다.
Entity Class는 고유해야하기때문에 Entity Class와 View의 결과 값을 전달해주는 DTO을 분리해서 사용해야한다.

VO

  • Value Object
  • 값 그 자체를 표현하는 객체

DTO vs VO

  DTO VO
용도 레이어 간 데이터 전달 값 자체 표현
동등 결정 속성값이 모두 같다고해서 같은 객체가 아니다 속성값이 모두 같으면 같은 객체이다.
가변 / 불변 setter 존재시 가변, setter 비 존재시 불변 불변
로직 getter/setter외의 로직을 갖지 않는다 getter/setter외의 로직을 가질 수 있다.

결론

DTO = 데이터 전달용 객체
VO = 값 표현용 객체

출처.https://www.youtube.com/watch?v=z5fUkck_RZM