- Value Object
- 도메인에서 한 개, 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체
- 도메인 객체의 부분집합
- 기본 키로 식별값을 갖는
Entity
와 구분해서 사용
왜 구분하는가?
Entity
에서 충분히 원시(primitive) 타입만 가지고 속성을 만들 수 있다.
하지만 원시타입을 갖는 속성은 그 자체만으로 제약사항을 추가할 수 없고, 비슷한 속성끼리 묶을 수 없기 때문에 지나치게 속성을 많이 갖을 수 있다.
가령 User 객체에 나이를 나타내는 age라는 속성이 있다고 해보자.
간단하게 private int age;
라고 표현할 수 있지만 int는 음수도 포함할 수 있는데 실제 나이는 음수 값을 갖지 못한다. 이러한 경우 제약사항을 추가해서 실제 나이가 갖는 특징을 VO로 만들어 제약사항을 추가할 수 있다.
VO가 되기위한 조건
1. equals() & hashCode() 재정의
내부의 속성 값이 같은 두 객체를 동일하게 취급해야 한다. 따라서 타당한 동일성 비교(==)가 이루어지기 위해 equals()
와 hashCode()
를 재정의한다.
가령 (y, x) 좌표를 나타내는 Position 객체가 있다고 해보자. 위 메소드를 재정의하지 않으면 다음과 같은 결과값을 갖게 되는데, 이는 적절하지 못하다.
Position p1 = new Postion(1, 1);
Position p2 = new Postion(1, 1);
System.out.println(p1 == p2); // false
2. 수정자가 없는 불변 객체
VO의 속성들은 한 번 할당이 되면 이후에 변경이 일어나서는 안된다. 따라서 값을 변경할 수 없도록 setter
를 만들지 않고 불변 객체로 만들어야 한다.
DTO와 차이점
DTO
순수하게 데이터를 담아 계층 간으로 전달하는 객체
VO
제약사항을 추가해서 값 그 자체를 나타내는 객체
Reference.
https://maenco.tistory.com/entry/Java-DTO와-VO의-차이
https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/