본문 바로가기
프로그래밍언어/프로그래밍 지식(programming knowledge)

value object(값 객체)

by 바코94 2022. 4. 17.

정의
> Wekipedia
In computer science, a value object is a small object that represents a simple entity whose equality is not based on identity: i.e. two value objects are equal when they have the same value, not necessarily being the same object.[1][2]

Examples of value objects are objects representing an amount of money or a date range.

Being small, one can have multiple copies of the same value object that represent the same entity: it is often simpler to create a new object rather than rely on a single instance and use references to it.[2]

Value objects should be immutable:[3] this is required for the implicit contract that two value objects created equal, should remain equal. It is also useful for value objects to be immutable, as client code cannot put the value object in an invalid state or introduce buggy behaviour after instantiation.[4]

Value objects are among the building blocks of DDD.

> 해석
Value Object는 값으로서 구분할 수 있는 특징을 갖는다. 예를 들면 돈에서 KoreaMoney(10000) 과 KoreaMoney(10000)은 항상 같은 값으로 취급할 수 있다. 커스텀한 Value를 정의해서 사용한다고 이해하면 쉽다. 

서비스에서 여러 국가의 화폐를 다루는 경우에 서비스에서 사용하는 Value Object로 만들어서 사용할 수 있다. 이 규칙은 서비스 전반에 적용되어야 하며 값 객체로 다룰 경우 일괄적으로 화폐에 대한 변경이 적용된다. 

>  활용
예를 들어 화폐를 표기할 때 원화에는 금액 뒤에 KRW를 붙여서 관리한다고 해보자. 별도로 관리하는 곳이 없다면 표기되는 곳마다 `${money} KRW` 등으로 표기를 하게 된다. `${money} KRW` 로 프로젝트의 곳곳에서 사용되게 된 상태에서 금액 뒤에 ₩ 를 표기하는 것으로 바뀌었다고 해보자. 그러면 검색기능을 이용해서 KRW 로 표기되는 것 중에 금액에 대한 표기인 것을 찾아서 로 바꿔주는 작업을 해야할 것이다. 물론, 이 방법도 프로젝트 사이즈가 적을때는 가능하다. 하지만, 프로젝트 사이즈가 매우 커서 저런 코드가 1000개가 넘는다고 생각해보자. 고치는데 몇시간이 걸릴 수도 있다.

만약 Value Object를 사용했다면 어땠을까?
ServiceMoney라는 Value Object를 만들어서 사용했다면 ServiceMoney(money).toStringWithUnit() 등으로서 각국의 화폐마다 표기되는 방식을 미리 정의해서 사용했다면 표기에 대한 변경점이 생겼을 때 빠르게 수정할 수 있을 것이다. 
ServiceMoney의 toStringWithUnit 에서 한국에 대한 처리 부분을 `${money} KRW` 에서 `${money} ` 로 변경하면 수정이 끝난다. 

참고
https://en.wikipedia.org/wiki/Value_object

도메인 주도 설계 철저 입문 - 나루세 마사노부