무한루프/개발, 업무

DTO와 VO의 차이

시원한생맥주 2025. 2. 28. 08:25

 

 

 

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는 비즈니스 도메인에서 값 자체를 표현하고 불변성을 유지해야 할 때 사용됩니다.

 

 

공부하면서 가끔 헷갈리는 부분이 있어서 정리....