DTO와 VO 그리고 Entity
계층간 데이터를 주고 받을 때, 소통하는 계층에 따라서 값을 전달하는 객체의 형태는 달라진다.
DTO
Data Transfer Object로서 계층간 데이터 교환을 위하여 사용하는 객체 이다. DB의 데이터를 Service나 Controller (즉, Presentation Layer)와 주고 받을 때 사용된다. Client와 바로 접해있는 View 계층에서는 정보가 자주 변경되기 때문에 변경이 이루어 질때마다 바로 DB와 연결된 Entity를 변경하고자 한다면 이와 의존관계에 놓인 많은 다른 클래스에도 영향을 미치기 때문에 영향받지 않고 자유롭게 변경 가능한 DTO를 사용하게 된다. 이는 로직을 가지고 있지 않은 순수한 데이터 객체 이며 getter / setter 메서드 만 을 가진다. Controller Layer에서는 ResponseDTO의 형태로 Client에게 전달한다.
@Getter
@Setter
public class ActivityCreateDTO {
private String name;
private Integer score;
private String description;
private String imageUrl;
public ActivityCreateDTO(String name, Integer score, String description) {
this.name = name;
this.score = score;
this.description = description;
}
}
DTO에서도 setter를 사용하지 않고 대신 생성자를 사용하면 객체의 불변성을 유지할 수 있다.
VO
Value Object는 불변의 특정 값객체 로 VO의 핵심 역할은 필수적으로 equals()와 hashcode()를 오버라이딩 하는 것이다. equals()와 hashcode()를 오버라이딩 함으로서 VO끼리는 서로 다른 인스턴스라도 같은 값을 가지고 있다면 같은 인스턴스로 취급하게 된다. VO 내부에 선언된 모든 속성값들이 VO객체마다 같은 값을 가져야 똑같은 객체로 판별할 수 있다. VO는 getter / setter 이외에 다른 로직을 지닐 수 있다.
public class Card {
private final String shape;
private final int number;
public Card(String shape, int number) {
this.shape = shape;
this.number = number;
}
public String getShape() {
return shape;
}
public int getNumber() {
return number;
}
@Override
public boolean equals(Object c) {
if (this == c) return true;
if (c == null || getClass() != c.getClass()) return false;
Card Card = (Card) c;
return number == card.number && Objects.equals(shape, card.shape);
}
@Override
public int hashCode() {
return Objects.hash(shape, number);
}
Entity
Entity는 실제 데이터베이스와 연관되는 핵심 으로 이를 기준으로 테이블이 생성되고 스키마가 변경된다. Entity는 id를 통해서 구분되며 비지니스 로직을 지닐 수 있다. setter를 통해 가변객체로 활용될 수도 있다.
@Getter
@Setter
public class Activity {
private Integer id;
private String name;
private Integer score;
private String description;
private String imageUrl;
public Activity() {
}
public Activity(Integer id, String name, Integer score, String description) {
this.id = id;
this.name = name;
this.score = score;
this.description = description;
}
}
세 객체 비교
DTO | VO | Entity | |
정의 | Layer간 데이터 전송 객체 | 값 표현 객체 | DB 테이블 연관 객체 |
상태 변경 가능 여부 | 가변 또는 불변 객체 | 불변 객체 | 가변 또는 불변 객체 |
getter/setter 외의 로직 포함 가능 여부 |
X | O | O |
(참고한 사이트)
https://tecoble.techcourse.co.kr/post/2021-05-16-dto-vs-vo-vs-entity/
https://hyeon9mak.github.io/DTO-vs-VO/
https://www.techie-knowledge.co.in/2018/06/layered-application-development-in-j2ee.html
https://velog.io/@gillog/Entity-DTO-VO-%EB%B0%94%EB%A1%9C-%EC%95%8C%EA%B8%B0
https://youngjinmo.github.io/2021/04/dto-vo-entity/