getter/setter
메소드를 포함한다.setter
를 가지는 경우 가변 객체로 활용할 수 있다.getter
메소드와 함께 비즈니스 로직도 포함할 수 있다.setter
메소드는 가지지 않는다.equals()
와 hashCode()
메소드를 오버라이딩 해줘야 한다.setter
를 가지는 경우 가변 객체로 활용할 수 있다.Entity 클래스를 절대로 요청이나 응답 값을 전달하는 클래스로 사용하면 안된다. Entity 클래스는 데이터베이스와 매핑되어 있는 핵심 클래스이기 때문이다. Entity 클래스를 기준으로 테이블이 생성되고 스키마가 변경된다. View는 비즈니스 요구사항에서 자주 변경되는 부분이다. 만약 Entity 클래스를 요청이나 응답 값을 전달하는 클래스로 사용한다면, View가 변경될 때마다 그에 맞춰서 매번 같이 변경해야 한다.
수많은 서비스 클래스나 비즈니스 로직들이 Entity 클래스를 기준으로 동작한다. Entity 클래스를 변경하면 관련되어 있는 얽혀있는 무수히 많은 클래스에 영향을 끼치게 된다.
그러므로 요청이나 응답 값을 전달하는 클래스로는 반드시 View의 변경에 따라 다른 클래스들에게 영향을 끼치지 않고 자유롭게 변경할 수 있는 DTO를 사용해야한다.
또한 응답값으로 여러 테이블들을 조인한 결과값을 줘야 할 경우가 빈번하기 때문에 Entity 클래스만으로는 응답 값을 표현하기 어려운 경우가 많다. 그래서 Entity 클래스와 View의 결과 값을 전달해 주는 DTO는 꼭 분리해서 사용해야한다.
분류 | DTO | VO | ENTITY |
---|---|---|---|
정의 | 레이어간 데이터 전송용 개체 | 값 표현용 객체 | DB 테이블 매핑용 객체 |
상태 변경 여부 | setter 존재 시 가변, | ||
setter 비 존재 시 불변 | 불변 | 가변 또는 불변 | |
로직 포함 여부 | 로직을 포함할 수 없다. | 로직을 포함할 수 있다. | 로직을 포함할 수 있다. |