To Dare Is To Do!
DTO vs VO vs Entity 본문
과거 프로젝트를 진행할 때 어디서는 domain, 또 다른 곳에서는 DTO 등 비슷한 개념과 역할을 가지는 것 같은데 정확히 어떤 차이가 있는지 궁금했던 경험이 있다.
이번 기회에 DTO와 VO 그리고 Entity의 개념에 대해서 정리해 보고 해당 개념을 적절한 상황에 사용할 수 있도록 하자!
DTO
Data Transfer Object의 약자인 DTO는 계층(Controller - Service - Repository)간 데이터 전달을 위해 사용하는 객체이다.
데이터를 주고 받을 때 데이터를 담아서 교환할 수 있도록 하는 바구니라고 하면 이해하기 쉬우며 이 바구니는 주로 View와 Controller 사이에서 많이 사용되곤 한다.
DTO는 데이터 교환만을 위한 객체이기 때문에 따로 비즈니스 로직을 갖지 않고 getter / setter 메소드만을 가진다.
또한 setter 메소드로 인해 가변 객체로서 활용될 수도 생성자를 통해 초기화한다면 불변객체로 활용할 수도 있다.
public class MemberDto {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String nanme) { // setter를 통해 가변 객체로 활용 가능!
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(int age) { // setter를 통해 가변 객체로 활용 가능!
this.age = age;
}
public class MemberDto {
private String name;
private int age;
public MemberDto(String name, int age) { // 생성자를 통해 불변 객체로 활용 가능!
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
VO
Value Object의 약자인 VO는 값 자체를 표현하는 객체이다. 객체들의 주소가 서로 달라도 값만 같으면 VO는 동일한 객체로 취급한다.
비유를 해보면 우리가 흔히 볼 수 있는 만원권은 각각의 고유번호(주소)가 모두 다르지만 갖고 있는 가치(값)는 모두 같기 때문에 나의 만원과 상대방의 만원은 같은 돈이다!
VO는 비즈니스 로직과 getter 메소드를 가질 수 있으나 setter 메소드는 가질 수 없다.
또한 equals()와 hashCode()를 오버라이딩하여 값을 비교한다.
public class Money {
private final int value;
public Money(int value) {
this.value = value;
}
public int getChange() { // 비즈니스 로직 사용 가능
return value - 5000;
}
Entity
실제 DB 테이블과 매핑되는 핵심 클래스로 DB의 테이블에 존재하는 컬럼들을 필드로 가지는 객체이다.
떄문에 데이터를 요청하거나 응답값을 전달할 때 Entity를 사용해선 안 된다. View와 같은 외부의 요소가 변경될 때 DB의 테이블이나 스키마에 영향을 미칠 수 있기 때문이다.
Entity는 id로 구분되고 비즈니스 로직을 포함할 수 있다.
setter 메소드를 사용할 수 있으나 객체의 일관성 및 안정성에 문제를 발생시킬 수 있기 때문에 사용을 지양한다.
정리
DTO | VO | Entity | |
정의 | 레이어 간 데이터 전송 객체 | 값 표현 객체 | DB 테이블 매핑 객체 |
상태 변경 여부 | 가변 or 불변 객체 | 불변 객체 | 가변 or 불변 객체 |
비즈니스 로직 포함 여부 | 로직 포함 불가능 | 로직 포함 가능 | 로직 포함 불가능 |
참고
Techoble - DTO vs VO vs Entity
Techoble - VO란 무엇일까?
'Spring' 카테고리의 다른 글
객체 지향 설계의 5가지 원칙(SOLID) (1) | 2023.12.23 |
---|---|
DTO와 Entity의 변환 (0) | 2023.11.16 |
HTTP Method (1) | 2023.11.06 |
Spring 3계층 속 DI (0) | 2023.11.05 |
직접 만들고 뜯어본 Controller (1) | 2023.11.03 |