DTO vs VO vs Entity

류영준·2022년 9월 23일
0

Architecture

목록 보기
1/2
post-thumbnail

DTO (Data Transfer Object)

  • 데이터를 전달하기 위한 객체
  • 계층 간의 데이터를 주고 받을 때 데이터를 담아서 전달하는 바구니
  • 여러 레이어에서 사이에서 DTO를 사용할 수 있지만, 주로 View와Controller 사이에서 데이터를 주고받을 때 활용한다.
  • getter/setter 메소드를 포함한다.
  • 다른 로직(비즈니스 로직)은 포함하지 않는다.

DTO 예제 코드

  • 위와 같이 setter 를 가지는 경우 가변 객체로 활용할 수 있다.

  • 위와 같이 setter가 아닌 생성자를 이용해서 초기화 하는 경우 불변 객체로 활용할 수 있다.
  • 불변 객체로 만들면 데이터를 전달하는 과정에서 데이터가 변조되지 않음을 보장할 수 있다.

VO (Value Object)

  • 값 자체를 표현하는 객체
  • 객체들의 주소가 달라도 값이 같으면 동일한 것으로 여긴다.
  • 예를 들어, 고유 번호가 서로 다른 만원 2장이 있다고 생각하면, 이 둘은 고유번호(주소)는 다르지만 10000원(값)은 동일하다.
  • getter 메소드와 함께 비즈니스 로직도 포함할 수 있다.
  • setter 메소드는 가지지 않는다.
  • 불변성을 보장한다.
  • 값 비교를 위해 equals()hashCode() 메소드를 오버라이딩 해줘야 한다.

VO 예제 코드

  • 위와 같이 VO는 주소가 아닌 모든 속성값을 비교한다.

Entity

  • 실제 DB 테이블과 매핑되는 핵심 클래스이다.
  • id로 구분된다.
  • 비즈니스 로직을 포함할 수 있다.
  • setter 를 가지는 경우 가변 객체로 활용할 수 있다.

Entity 예제 코드

DTO와 Entity Class를 분리하라

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

수많은 서비스 클래스나 비즈니스 로직들이 Entity 클래스를 기준으로 동작한다. Entity 클래스를 변경하면 관련되어 있는 얽혀있는 무수히 많은 클래스에 영향을 끼치게 된다.

그러므로 요청이나 응답 값을 전달하는 클래스로는 반드시 View의 변경에 따라 다른 클래스들에게 영향을 끼치지 않고 자유롭게 변경할 수 있는 DTO를 사용해야한다.

또한 응답값으로 여러 테이블들을 조인한 결과값을 줘야 할 경우가 빈번하기 때문에 Entity 클래스만으로는 응답 값을 표현하기 어려운 경우가 많다. 그래서 Entity 클래스와 View의 결과 값을 전달해 주는 DTO는 꼭 분리해서 사용해야한다.

세 객체 비교

분류DTOVOENTITY
정의레이어간 데이터 전송용 개체값 표현용 객체DB 테이블 매핑용 객체
상태 변경 여부setter 존재 시 가변,
setter 비 존재 시 불변불변가변 또는 불변
로직 포함 여부로직을 포함할 수 없다.로직을 포함할 수 있다.로직을 포함할 수 있다.

참고

DTO vs VO vs Entity

[10분 테코톡] 📍인비의 DTO vs VO

profile
Backend Developer

0개의 댓글