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
'👩🏻💻 About 프로그래밍 > Spring, Spring boot' 카테고리의 다른 글
MVC1과 MVC2 비교 (0) | 2024.07.10 |
---|---|
MVC (0) | 2024.07.08 |
Spring 패키지 구조(feat. Controller, DTO, DAO Service, Repository, Entity, Vo) (0) | 2024.07.08 |
스프링부트 구조 및 각 단계별 역할 (0) | 2024.07.08 |
스프링 부트 버전별 지원 기간 (0) | 2024.07.03 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기