DTO, VO, Entity

송은석·2022년 12월 5일
0

모두 데이터를 담고, 이를 다루는 객체라는 공통점이 있다.
그러나 다르다. 이 차이를 알아보겠다.

DTO

먼저 DTO는 Data Transfer Object라는 이름처럼 레이어 간의 데이터 전송을 담당하는 객체이다. setter 없이 생성자로만 생성하면 불변 객체로 사용할 수도 있고, setter를 통해 가변 객체로 사용할 수도 있다. DTO는 비즈니스 로직을 갖지 않는다.

DTO는 주로 View와 Controller 간의 데이터 전송에 사용된다. DTO의 대표적인 예는 Java Bean이다.

참고로 Java Bean은 JSP에서 객체를 가져오기 위한 기법으로, Java Bean 규약을 지켜 구현된 클래스를 말한다. 규약은 다음과 같다.

  • 생성자는 오직 1개, 매개 변수 없음.
  • private 접근 제어자를 가진 필드들(여기서는 프로퍼티라고 불러야 한다.)
  • 프로퍼티들에 대한 getter, setter. 다만 readOnly 프로퍼티라면 setter는 없을 수 있음.

VO

VO는 값을 표현하는 객체로, 그 자체가 값이므로 불변성을 보장해야 한다. 따라서 생성자만으로 모든 필드의 값이 할당되며, setter를 가지지 않는다. 또한 동등성을 보장하기 위해 속성들을 통해 equals(), hashcode()를 재정의해야 한다. VO는 그 안에서 로직의 구현이 가능하다.

하나의 값으로 취급한다면서 로직이 구현될 수 있다는 말에 대해서 이해를 하지 못했었는데, Tecoble의 한 게시물을 통해 이해할 수 있었다.

예를 들어 VO 간의 비교가 필요할 경우, Comparable 인터페이스를 구현하여 VO 간 비교를 구현할 수 있다. 동일성 비교를 위해 isVoPropertyOne()과 같은 메서드를 만들 수도 있다.

이처럼 단순한 값으로 취급되는 객체이지만, 하나의 객체로써의 정체성도 가질 수 있는 것이다.

한편, getter를 구현할 때도 list 객체이면 Collections.unmodifiableList(list) 처럼 로직을 추가하여 구현할 수도 있다.

Entity

Entity는 실제 DB 테이블과 매핑되는 핵심 클래스이다. 따라서 절대 Entity를 요청이나 응답 값을 전달하는 클래스로 사용해서는 안된다. 가변 혹은 불변 객체로 존재할 수 있으며, VO처럼 로직이 담길 수 있다.

참고

profile
Done is better than perfect🔥

0개의 댓글