뭐요

Value Object, 값 객체 개념 본문

Java

Value Object, 값 객체 개념

욕심만 많은 사람 2023. 7. 18. 00:52

  • 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/