티스토리 뷰
DTO : 데이터 전달용 객체 / VO : 값 표현용 객체
DTO | VO | |
용도 | 레이어 간 데이터 전달 | 값 그 자체 표현 |
동등 결정 | 속성값이 모두 같아도 동일한 객체 X | 속성값이 모두 같으면 동일 객체 |
가변 / 불변 | setter 존재 시 가변 / 없으면 불변 | 불변 |
로직 | getter/setter 외 로직 가질 수 없음 | getter/setter 외 로직 가질 수 없음 |
● DTO(Data Transfer Object)
- 데이터를 전달하기 위해 사용하는 객체(데이터 전달 바구니)
- 정확히 말해 계층 간 데이터를 전달하기 위해 사용하는 객체이다.

[DTO의 특성]
- method는 오직 getter/setter 만 갖는다.
- 다른 (비즈니스)로직은 갖지 않는다. 이는 DTO가 순수하게 데이터 전달만을 위한 객체이기 때문이다.
public class CrewDto {
private String name;
private String nickname;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
- 위와 같이 DTO가 setter method를 가지면 데이터가 변경(오염)될 가능성이 있으므로 아래와 같이 생성자를 이용해 각 필드(멤버변수)의 값들을 초기화해 불변객체로 만들 수 있다.
public class CrewDto {
private String name;
private String nickname;
public CrewDto(String name, String nickname) {
this.name = name;
this.nickname = nickname;
}
public String getName() {
return name;
}
public String getNickname() {
return nickname;
}
}
● VO(Value Object)
- 값 그 자체를 표현하는 객체이다.
- 쉽게말해 5만원 지폐는 각 지폐의 고유번호가 달라도 똑같은 가치(값)를 갖는데 VO도 이와 동일한 개념의 객체이다.
- 즉, 객체의 주소값이 달라도 그 안의 값이 같으면 동일한 객체라고 보는 것이다.(값으로만 비교되는 객체)
public class Money {
private final int value;
public Money(int value) {
this.value = value;
}
public int getHalfValue() {
return value / 2;
}
}
- VO class인 Money class는 값 그 자체를 표현하기 때문에 setter method가 없다. = 불변객체
- 생성자를 통해서만 값을 초기화해줘야한다.
- DTO가 getter/setter 외의 다른 method를 가질 수 없는 것과 달리 VO는 getHalfValue method와 같이 특정한 로직을 가질 수 있다.
- 일반적인 객체는 equals, hashCode method로 비교할 때 모두 불일치(서로 다르다)로 나오지만 VO는 그러면 안 된다.
- VO는 객체의 주소값과 상관 없이 값이 같으면 동일한 객체로 판단돼야 한다.(객체를 속성값으로만 비교)
- 따라서 VO는 equals, hashCode method를 모두 오버라이딩 해 값 자체만 비교할 수 있도록 수정해야 한다.
cf) 아래 영상을 보고 정리했다.
https://youtube.com/watch?v=z5fUkck_RZM&feature=sharea
cf2) 아래 글에 Entity에 대한 글도 볼 수 있다.
https://tecoble.techcourse.co.kr/post/2021-05-16-dto-vs-vo-vs-entity/
DTO vs VO vs Entity
DTO와 VO는 분명히 다른 개념이다. 그런데, 같은 개념으로 생각해서 사용하는 경우가 많다. 왜일까? ⌜Core J2EE Patterns: Best Practices and Design Strategies⌟ 책의 초판에서는 데이터 전송용 객체를 로 정의
tecoble.techcourse.co.kr
'Backend > Spring' 카테고리의 다른 글
#9 유저 생성 API (0) | 2023.08.11 |
---|---|
#8 GET API의 DTO와 POST API의 DTO가 차이가 나는 이유 (0) | 2023.08.09 |
#6 POST API (0) | 2023.07.31 |
#5 GET API with DTO (0) | 2023.07.30 |
#4 HTTP, API, URL (0) | 2023.07.29 |
- Total
- Today
- Yesterday
- Spring Boot
- jpa
- API
- 자료구조
- MongoDB
- 프로그래머스
- 빅데이터 분석기사
- spring
- Phaser
- 빅데이터
- nosql
- Stream
- Java8
- git
- 알고리즘
- 메모리
- node.js
- OS
- 코테
- db
- DART
- 프로세스
- SQL
- MySQL
- Phaser3
- 운영체제
- Advanced Stream
- java
- SpringBoot
- 코딩테스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |