본문 바로가기

책터디/도메인주도설계철저입문

02. 시스템 특유의 값을 나타내기 위한 '값 객체'

값 객체란?

시스템 특유의 값을 표현하기 위해 정의하는 객체

 

객체이기도 하고 동시에 값이기도 하다.

시스템 특유의 값을 나타내는 객체다.

 

값의 성질과 값 객체 구현

값의 성질

  • 변하지 않는다.
  • 주고받을 수 있다.
  • 등가성을 비교할 수 있다.

값 객체는 시스템 특유의 값에 대한 표현이며, 값의 한 종류다. 값의 성질은 값 객체에도 그대로 적용된다.

 

불변하는 값의 장점

상태가 변화하지 않게 하는 프로그램을 단순하게 만들 가능성이 있는 제약이다.

물론 상태가 변하지 않는 객체의 단점도 있다.

그중 대표적인 것은 객체의 일부 값만 바꾸고 싶을 때도 객체를 아예 새로 생성해야 한다는 점이다.

이 점은 상태가 변할 수 있는 객체에 비해 성능 면에서 불리하기 때문에 아주 심각한 상황이 아니고서는 값 객체라도 상태를 바꿀 수 있게 하는 전략을 취하기도 한다.

하지만 가변 객체를 불변 객체로 바꾸는 것보다는 불변 객체를 가변 객체로 만드는 것이 노력이 적게 들기 때문에 가변 객체와 불변 객체 중 결정을 내리기가 어려울 때는 일단 불변 객체를 적용하는 것이 낫다.

 

교환 가능하다

값은 불변일지라도 값을 수정할 필요는 있다.

값 객체는 불변이기 때문에 대입문을 통한 교환 외의 수단으로는 수정을 나타낼 수 없다.

 

등가성 비교 가능

시스템 고유의 값인 값 객체도 이와 마찬가지로 값 객체를 구성하는 속성(인스턴스 변수)을 통해 비교된다.

 

행동이 정의된 값 객체

값 객체는 결코 데이터를 담는 것만이 목적인 구조체가 아니다.

값 객체는 데이터와 더불어 그 데이터에 대한 행동을 한 곳에 모아둠으로써 자신만의 규칙을 갖는 도메인 객체가 된다.

 

값 객체를 도입했을 때의 장점

  • 표현력이 증가한다.
    • 값 객체는 자기 정의를 통해 자신이 무엇인지에 대한 정보를 제공하는 자기 문서화를 돕는다.
  • 무결성이 유지된다.
    • 규칙을 위반하는 유효하지 않은 값을 걱정할 필요가 없다.
  • 잘못된 대입을 방지한다.
  • 로직이 코드 이곳저곳에 흩어지는 것을 방지한다.
    • 소프트웨어가 변경을 받아들일 수 있는 유연성을 갖기 위해서는 이러한 작업이 중요하다.

 

값 객체는 '시스템 고유의 값을 만드는' 단순한 것이다.