Hello

DTO vs VO, DTO와 VO의 차이점, 언제 VO를 사용하고 언제 DTO를 사용하는가?

by 볼빵빵오춘기

VO

특징

  • 변성 (Immutability)
    • VO는 생성 후 그 값을 변경할 수 없음.
    • VO의 중요한 특성 중 하나로, 값의 일관성과 안전성을 보장.
  • 값 비교
    • VO는 동일한 속성 값을 가지면 같은 객체로 간주.
    • 값의 동등성을 비교할 때 주로 사용.
  • 도메인 모델
    • 도메인 로직을 포함할 수 있음.
    • VO는 비즈니스 도메인에서 중요한 개념을 표현하며, 주로 비즈니스 로직 내에서 사용.

 

사용 예시

  • 금액 : 특정 통화 단위로 표현되는 금액 객체.
  • 날짜 : 특정 날짜를 표현하는 객체.
  • 주소 : 주소를 구성하는 여러 요소를 하나의 객체로 표현.

 

장점

  • 불변성 : 데이터의 일관성을 유지.
  • 도메인 표현 : 도메인 모델링에 적합.

 

 

DTO (Data Transfer Object)

특징

  • 가변성 (Mutability)
    • DTO는 값의 변경이 가능.
    • 주로 데이터를 한 계층에서 다른 계층으로 전달할 때 사용.
  • 데이터 전송
    • 주로 서비스 계층과 프레젠테이션 계층 간의 데이터 교환에 사용.
    • 보통 컨트롤러에서 서비스를 호출할 때 데이터를 주고받는 용도로 사용.
  • 간단한 객체
    • 복잡한 비즈니스 로직을 포함하지 않으며, 단순히 데이터를 담기 위한 용도로 사용.

 

사용 예시

  • 사용자 정보 전송: 클라이언트로부터 받은 사용자 정보를 서비스로 전달.
  • 응답 객체: 서비스에서 처리된 결과를 컨트롤러를 통해 클라이언트로 반환할 때 사용.

 

장점

  • 데이터 전송 용이: 데이터를 간단하게 전송할 수 있음.
  • 레이어 분리: 각 계층 간의 의존성을 줄이고, 데이터 구조를 명확하게 정의할 수 있음.

 

차이점 요약

  VO DTO
목적 도메인 모델링을 위한 것 데이터 전송을 위한 것
불변성 불변 객체 가변 객체일 수 있음
사용위치 주로 도메인 계층에서 사용 주로 프레젠테이션 계층과 서비스 계층 간의 데이터 교환에 사용

 

 

언제 VO를 사용하고 언제 DTO를 사용하는가?

VO를 사용하는 경우

  • 도메인 모델링이 중요한 경우: 비즈니스 로직에서 중요한 개념을 표현해야 할 때 사용.
  • 불변성이 필요한 경우: 값의 일관성을 보장해야 하는 경우 사용.
  • 값 객체가 필요한 경우: 동일한 속성 값을 가지는 객체를 같은 것으로 취급해야 할 때 사용.

 

DTO를 사용하는 경우

  • 계층 간 데이터 전송이 필요한 경우: 프레젠테이션 계층과 서비스 계층 간에 데이터를 주고받을 때 사용.
  • 복잡한 도메인 로직이 필요 없는 경우: 단순히 데이터를 담기 위한 용도로 사용.
  • 응답 객체가 필요한 경우: 서비스에서 처리된 결과를 클라이언트로 반환할 때 사용.

 

예시

VO 예시

public class Money {
    private final BigDecimal amount;
    private final Currency currency;

    public Money(BigDecimal amount, Currency currency) {
        this.amount = amount;
        this.currency = currency;
    }

    // getters
    public BigDecimal getAmount() {
        return amount;
    }

    public Currency getCurrency() {
        return currency;
    }

    // equals and hashCode
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Money money = (Money) o;
        return amount.equals(money.amount) && currency.equals(money.currency);
    }

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

 

DTO 예시

public class UserDTO {
    private Long id;
    private String name;
    private String email;

    // getters and setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

 

정리하자면

VO와 DTO는 각각의 용도와 철학에 따라 사용되며, 각자의 특성과 장점에 따라 선택하여 사용하는 것이 중요.

프로젝트의 요구사항에 따라 어떤 것을 사용할지 결정하는 것이 핵심.

 

참고링크

https://maenco.tistory.com/entry/Java-DTO%EC%99%80-VO%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://curiousjinan.tistory.com/entry/spring-data-transfer-vo-dto#%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C%20Data%EB%A5%BC%20%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94%20%EA%B0%9D%EC%B2%B4%EC%97%90%EB%8A%94%20VO%2C%20DTO%EA%B0%80%20%EC%9E%88%EB%8A%94%EB%8D%B0%20%EC%9D%B4%EA%B2%8C%20%EC%96%B4%EB%96%A4%EA%B2%83%EC%9D%B8%EC%A7%80%20%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-1

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기