결론 먼저!
1. DTO
- Data Transfer Object
- 데이터를 전달하기 위해 사용하는 객체
- 데이터를 담아서 전달하는 바구니
- DTO 특징
- 오직 getter/setter 메서드만 갖는다.
- 다른 로직을 갖지 않는다.
- DTO 예시
public class CrewDto{
private final String name;
private final String nickName;
public CrewDto(String name, String nickName) {
this.name = name;
this.nickName = nickName;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
public CrewDto createNewCrew() {
String newName = "공재호";
String newNickName = "zero";
CrewDto crewDto = new CrewDto();
crewDto.setName(newName);
crewDto.setNickName(newNickName);
return crewDto;
}
- Web Layer(Controller) 메소드
public String createNewCrew() {
CrewDto newCrewDto = sampleService.createNewCrew();
String nameOfNewCrew = newCrewDto.getName();
String nickNameOfNewCrew = newCrewDto.getNickName();
return nameOfNewCrew + nickNameOfNewCrew;
}
- Entity Class와 DTO Class를 꼭 분리해서 사용하기
- View에 DTO Class를 통해 객체를 전달한다.
2. VO
- Value Object
- 값 그 자체를 표현하는 객체
- 특징
- 다른 함수를 가질 수 있다.
- equals()와 hashCode()를 오버라이딩해 값을 통해 비교하도록 한다.
- 예시
public class Money {
private final int value;
public Money(int value) {
this.value = value;
}
public int getHalfValue() {
return value / 2;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Money money = (Money) o;
return value == money.value;
}
@Override
public int hashCode() {
return Objects.hash(value);
}
}
DTO vs VO
DTO VO
용도 |
레이어 간 데이터 전달 |
값 표현 자체 |
동등 결정 |
속성값이 모두 같다고 해서 같은 객체가 아님 |
속성값이 모두 같으면 같은 객체 |
가변 / 불편 |
Setter 존재시 가변 |
불변 |
로직 |
getter / setter 외의 로직을 갖지 않는다. |
getter / setter 외의 로직을 가질 수 있다. |
댓글