정의
DTO(Data Transfer Object) :
- 계층 간 데이터를 전달하기 위해 사용하는 객체 (Controller <-> Service 등)
- 데이터를 담아서 전달하는 바구니
- getter/setter 메소드만을 갖는다
이외의 다른 메소드는 필요가 없다 (오직 데이터를 담아서 전달만 하는 객체이기 때문)
- setter가 있기 때문에 값이 변할 수 있지만, 의도적으로 setter를 없애고 생성자로 값을 넣어서 불변하게 사용하는 것이 각 계층간 이동시 동일한 값을 보장하기 때문에 더욱 안전하게 사용 가능
예시코드 :
- dto 클래스
public class userDto {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
- 보내는 곳
Service 계층에서 데이터를 세팅해서 보내는 예
public class UserService {
// UserDto 객체를 리턴
public UserDto createNewUser() {
//dto에 넣어서 보낼 데이터들을 정의
String newName = "홍길동";
Integer newAge = 20;
// 데이터를 전달하게 될 dto에 데이터를 set
UserDto userDto = new UserDto();
userDto.setName(newName);
userDto.setAge(newAge);
return userDto;
}
}
- 받는 곳
Controller 계층에서 데이터를 받는 예
public class UserController {
public String createNewUser() {
// 서비스계층의 createNewUser를 통해서 UserDto 객체를 반환 받아온다
UserDto getUserDto = UserService.createNewUser();
// 반환받은 UserDto 객체에서 값들을 꺼내서 사용한다
String name = getUserDto.getName();
Integer age = getUserDto.getAge();
return name;
}
}
VO(Value Object) :
- 값을 표현하기 위한 객체
- 속성값으로 동일한 객체인지를 비교 (속성값이 달라지면 다른 객체로 본다)
예를들어 흰색의 속성값은 #ffffff 이고, 검정색의 속성값은 #000000 이라서 속성값이 다르기 때문에 다른 객체로 본다
- equals() 와 hashCode() 두 메서드 모두 오버라이딩 하여 비교를 해서 둘다 같을 때 같은 객체로 본다
- setter 메소드를 가지면 안되고, 생성자를 통해서만 값을 초기화 해야 한다
- getter 이외에 로직이 포함된 메소드를 가질 수 있다
예시코드 :
public class colorVo {
private final String color;
// 생성자를 통해 set. 값 불변
public colorVo(String color) {
this.color = color;
}
// 로직이 담긴 메소드 포함 가능
public String colorChange() {
return color+"a";
}
}
DTO 와 VO 비교 :
DTO | VO | |
용도 | 계층 간 데이터 전달 | 값 자체를 표현 |
동등 결정 | 속성값이 모두 같아도 같은 객체가 아닐 수 있다. | 속성값이 모두 같으면 같은 객체이다. |
가변 / 불변 | setter 존재 시 가변, setter 비 존재 시 불변 |
불변 |
로직 | getter/setter 이외의 로직이 불필요함 | getter/setter 이외의 로직을 가질 수 있음 |
참고 :
https://www.youtube.com/watch?v=z5fUkck_RZM
https://velog.io/@taehee-kim-dev/DTO-vs-VO
'Spring Boot' 카테고리의 다른 글
[Mapper] DTO와 Entity 의 매핑 개념 (0) | 2021.10.16 |
---|---|
[DTO] 를 더욱 안전하게 사용하는 방법 (0) | 2021.10.16 |
IOC (제어의 역전) - 마틴 파울러 (0) | 2021.10.15 |
[JMeter] 제이미터 사용방법 (0) | 2021.06.22 |
Spring Boot 로컬 개발 환경 세팅 (0) | 2020.08.22 |