VO 🆚 DTO

VO (Value Object)

  • 불변(immutable)객체
  • 값을 표현하기 위해 사용함
  • 비즈니스 로직에서 의미 있는 “값”
  • equals(), hashCode()를 값 자체로 동일성 판단

 

🔹 특징

  • 불변성 보장 : 필드는 final, 생성자에서만 초기화
  • 의미 있는 도메인 값
  • 객체의 주소가 아닌 “값”이 같으면 같다고 판단
public final class Money {
    private final int amount;
    private final String currency;

    public Money(int amount, String currency) {
        this.amount = amount;
        this.currency = currency;
    }

    public int getAmount() { return amount; }
    public String getCurrency() { return currency; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Money)) return false;
        Money money = (Money) o;
        return amount == money.amount && currency.equals(money.currency);
    }

    @Override
    public int hashCode() {
        return Objects.hash(amount, currency);
    }
}

 


 

DTO (Data Transfer Object)

  • 계층 간 (예: Controller ↔ Service ↔ Repository) 데이터 전달용 객체
  • 불변일 필요 없음 : Getter/Setter가 모두 있는 순수 데이터 전달 목적

 

🔹 특징

  • 주로 네트워크 통신, API 요청/응답에 사용
  • Serializable 인터페이스 구현 권장
  • Lombok, record 등으로 보일러 플레이트 코드 축소 가능

※ 보일러 플레이트 코드(boilerplate code) : 프로그램을 작성할 때 반복적으로 많이 쓰이지만 핵심 로직과는 무관한 코드, “매번 비슷하게 작성해야 하는 형식적인 코드”

public class UserDTO {
    private String name;
    private int age;

    public UserDTO() {}

    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; }
}

 

📝 요약

구분   VO (Value Object) DTO (Data Transfer Object)
목적 값 표현, 도메인 개념화 데이터 전송 (계층 간, API 응답 등)
불변성 보통 불변 (Immutable) 가변 (Mutable)
비교 방식 값 기반 비교 (equals, hashCode 재정의) 주소 기반 비교 또는 필요시 값 비교 가능
사용 위치 도메인 모델, 내부 로직 Controller ↔ Service ↔ Repository 간
예시 Money, Address UserDTO, ProductResponseDTO

'Java' 카테고리의 다른 글

Serializable 인터페이스  (0) 2025.05.02
Stream 인터페이스  (0) 2025.05.02
Predicate 인터페이스  (0) 2025.05.02
참조타입 (reference type)  (0) 2025.05.01
기본타입 (primitive type)  (0) 2025.05.01