DTO (Data Transfer Object)와 VO (Value Object)의 차이점은
주로 용도와 의미에 따라 구분됩니다.
1. DTO (Data Transfer Object)
DTO는 데이터 전송 객체로, 주로 계층 간 데이터 전송을 목적으로 사용됩니다. DTO는 데이터를 전송하는 데 필요한 최소한의 정보를 담고 있습니다.
- 용도: 계층 간 데이터 전송 (예: 클라이언트와 서버 간, 서버 간 API 호출 시 데이터 전송)
- 특징:
- 주로 getter와 setter 메서드로 구성됩니다.
- 데이터 전송을 위한 구조적 객체로 사용됩니다.
- 비즈니스 로직은 포함하지 않습니다.
- 변경 가능(mutable): 외부에서 데이터를 수정할 수 있는 구조입니다.
- 주요 예: REST API 응답을 위한 JSON 포맷의 데이터, DB에서 추출한 데이터의 결과를 클라이언트에게 전달하기 위한 객체 등.
DTO 예시:
public class UserDTO {
private String name;
private int age;
// 생성자, getter, setter 메서드
public UserDTO(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2. VO (Value Object)
VO는 값 객체로, 객체 자체가 값을 표현하는 데 사용됩니다. VO는 주로 불변(immutable) 객체로, 생성 후 값이 변경되지 않습니다.
- 용도: 값 표현 (예: 주소, 날짜, 금액 등)
- 특징:
- 불변성(immutable): VO 객체의 속성은 생성 시에만 초기화되며, 이후에는 변경할 수 없습니다.
- 비즈니스 로직을 포함할 수 있습니다. 예를 들어, Money 객체는 금액 계산 로직을 가질 수 있습니다.
- 동등성 비교: VO는 두 객체가 같은 값을 가지고 있는지 비교할 때 값 자체를 기준으로 비교합니다. (equals() 메서드를 오버라이드하는 경우가 많습니다.)
- 주요 예: Money, Address, Date, Coordinates 등과 같은 불변 객체.
VO 예시:
public class Money {
private final double amount;
private final String currency;
// 생성자
public Money(double amount, String currency) {
this.amount = amount;
this.currency = currency;
}
// getter
public double getAmount() {
return amount;
}
public String getCurrency() {
return currency;
}
// equals()와 hashCode()를 오버라이드하여 값 비교가 가능하도록 함
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Money money = (Money) obj;
return Double.compare(money.amount, amount) == 0 &&
currency.equals(money.currency);
}
@Override
public int hashCode() {
return Objects.hash(amount, currency);
}
}
DTO와 VO의 주요 차이점
특징 DTO (Data Transfer Object) VO (Value Object)
목적 | 데이터 전송 | 값 표현 (불변 객체) |
불변성 | 변경 가능 (Mutable) | 불변 (Immutable) |
사용 사례 | 계층 간 데이터 전송 | 값 자체를 표현하는 객체 (예: 금액, 주소) |
비즈니스 로직 | 포함하지 않음 | 포함 가능 (예: 계산, 검증 등) |
동등성 비교 | 값이 아닌 객체 참조로 비교 | 값 비교 (equals())로 비교 |
예시 | REST API 응답, DB 데이터 전송 | 금액, 날짜, 주소 등 |
정리
- DTO는 주로 데이터를 전송하는 데 사용되며, 변경 가능한 객체입니다.
- VO는 값을 표현하는 불변 객체로, 비즈니스 로직을 포함할 수 있으며, 값을 기준으로 비교합니다.
따라서, DTO는 주로 데이터 이동과 관련된 객체로 사용하고, VO는 비즈니스 도메인에서 값 자체를 표현하고 불변성을 유지해야 할 때 사용됩니다.
공부하면서 가끔 헷갈리는 부분이 있어서 정리....
'무한루프 > 개발, 업무' 카테고리의 다른 글
Java API에서 return 값의 형태 선택(DTO, Map, ResponseEntity) (0) | 2025.02.28 |
---|---|
Cannot load driver class: org.mariadb.jdbc.Driver Maria DB 설정 셋팅 에러 (1) | 2025.02.28 |
MS-SQL 기본 정보 및 환경 (0) | 2025.02.26 |
스프링부트(spring boot)에서 메이븐 클린(maven clean) 하는 법 (0) | 2025.02.26 |
마이바티스(MyBatis)에서 객체를 쓰지 않고 json으로 주고 받기 (0) | 2025.02.25 |