DTO와 VO
DTO
로직을 가지지 않는 순수한 데이터 객체이다.
메소드로는 getter와 setter정도만 가진다.
DTO는 데이터 전달만을 목적으로 하기 때문에 getter와 setter로직만이 필요하다.
public class UserDTO {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
setter를 이용해 값을 담고, getter를 이용하여 값을 꺼내서 사용한다.
(롬복사용하면 더 간결해 지겠지)
setter의 경우 사용자가 값 변경에 대해 자유롭다고 생각하여 멋대로 변경시킬 수 있기 때문에 setter는 생성하지 않고,
생성자로 값을 넣어 전달하기도 한다.
VO
VO는 값 그 자체를 나타내는 객체이다.
여러 로직을 포함할 수 있으며,
특정 값 자체를 표한하기 때문에 불변성을 보장해야 한다.
이때 불변성 보장을 위한 생성자를 사용해야 한다.
VO는 값 그 자체를 나타내기 때문에 setter 같은 성격의 변조 가능성이 있는 메서드가 존재하면 안되며, 두 객체의 '필드 값이 같다면' 모두 같은 각체로 만드는 것이 핵심이다.
Value Object는 코드의 다른 부분에서 수정되지 않기 때문에 Reference(참조)로 공유 할 수 있다.
이것은 side effect를 피하기 위해 사용되는 코드의 복잡성과 부하를 극적으로 감소시킨다.
동등성에 대해서 좀 더 이해를 해보자.
서로 다른 포커 덱에서 각각 하나의 카드를 선택하고, 나와 친구가 같은 카드를 선택했는지 알아야 하는 상황을 가정하자.우리는 친구의 카드를 가져와 자신의 카드와 같은 숫자인지, 같은 그림인지 확인할 것이다. 즉, 동일한 속성을 가지고 있는지 여부를 확인할 것입니다.
다시, 지금 앞서 확인 한 카드를 친구와 교환한다고 가정한다. 친구 카드와 우리의 카드가 달라진 것이 있을까?
우리는 여전히 같은 카드를 쥐고 있다.
두 카드가 같은 속성을 가지고 있기 때문에, 그 두 카드는 구별할 수 없게 되는 것이다.
결국 앞의 두 카드는 Value Object라고 말할 수 있다.
내부의 값이 동일한 두 객체는 동일한 것으로 판단한다.
즉, 내부 값이 모두 각각 동일한지 확인하여 동등성을 테스트 할 수 있다.
'동일성' 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질
'동등성' 상태를 이용해 두 값이 같은지 판단할 수 있는 성질