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

블로그의 정보
Hello 춘기's world
볼빵빵오춘기