DDD(Domain Driven Design) - Value Object (값 객체)

이번에 다룰 DDD 의 내용은 바로 값 객체이다. 반 버논에 도메인 주도 설계 구현에서는 되도록이면 엔터티가 아니라 값 객체를 사용해 모델링하도록 노력해야 한다고 말한다. 값 객체의 이점으로 책에서는 아래와 같이 언급한다. "측정하고 수량화하거나 설명해주는 값 타입은 생성, 테스트, 사용, 최적화, 유지 관리가 더 쉽다." 그렇다면 도메인 개념을 값으로 모델링해야 할지 알 수 있는 방법은 무엇인가? 아래와 같은 특징을 포함하는지 고려해야 한다. 도메인 내의 어떤 대상을 측정하고, 수량화하고, 설명한다. 불변성이 유지될 수 있다. 관련 특성을 모은 필수 단위로 개념적 전체를 모델링한다. 측정이나 설명이 변경될 땐 완벽히 대체 가능하다. 다른 값과 등가성(value equality) 을 사용해 비교할 수 있다. 협력자(collaborator) 에게 부작요이 없는 행동 (Side-Effect-Free Behavior) 을 제공한다. 측정, 수량화, 설명 -> 도메인 내에 있는 어떤 대상을 측정하고 수량화하고 설명하는 개념. ex) 사람에겐 나이가 있다. 나이는 실재하는 어떤 대상은 아니지만, 사람이 살아온 햇수를 측정하거나 수량화 한다. 불변성 -> 값 객체는 한 번 생성되면 변경할 수 없다. 보통 java 에서 객체를 생성할 때 특정 생성자 혹은 팩토리 패턴을 이용해서 생성후 객체의 변경을 할 수 있는 메서드를 제공하지 않는 방법으로 불변성을 유지할 수 있다. 만약 지금 설계하고 있는 객체가 자신의 행동으로 인해 변경돼야 한다고 생각한다면, 이는 값 객체가 아니라 엔터티로 설계해야 함을 의미한다. 개념적 전체 (Conceptual Whole) -> 값 객체는 하나 이상의 개별적 특성을 가질 수 있으며, 각 특성은 서로 연관되어 있다. 여러 특성이 설명하는 바를 모아 전체를 나타낸다. ex) {50,000,000달러} 는 50,000,000 이라는 특성과 달러...