🧐TIL

[DDD] 값 객체와 엔티티의 구분

date
Feb 26, 2023
thumbnail
slug
ddd-vo-vs-entity
author
status
Public
summary
“도메인 주도 설계 철저 입문”을 읽으며 공부한 내용을 정리합니다.
type
Post
category
🧐TIL
tags
TIL
DDD
Architecture
updatedAt
Jun 18, 2023 05:57 AM

생애주기와 연속성

도메인 모델을 객체로 정의하려면 우선 해당 모델을 값 객체로 만들것인지 엔티티로 만들 것인지를 정해야 한다. 이 때 간단한 기준을 사용하여 도메인 객체를 엔티티로 정의해야 할지를 판단할 수 있는데 바로 생애주기와 연속성이다.
엔티티는 태어나고 죽을 때까지의 생애주기를 갖는데, 정확히는 객체가 생성되고 사용, 업데이트 된 뒤 최종적으로 삭제에 까지 도달할 수 있음을 의미한다. 또한 이런 생애주기에 따라 속성이 바뀌기도 하고 시간의 흐름에 영향을 받는 연속성도 가진다.
생애주기를 갖지 않거나 가질 수 있어도 시스템 요구사항에 따라 굳이 생애주기를 부여할 필요가 없다면 값 객체로 정의를 하면 된다.

적합한 모델링

현실세계의 사물은 복합적인 특성을 가지고 있기 때문에 모델을 어떻게 정의하느냐에 따라 객체는 값 객체가 적합할 수도 있고 엔티티가 적합할 수도 있게 된다.
예를들어 타이어는 자동차의 부품으로 바라볼 때는 대입을 통해 수정이 이루어지고 굳이 동일성을 따질 필요가 없는 값 객체로 정의할 수 있지만, 타이어 생산 공장에서 타이어를 관리할 때는 각 타이어 별 일련번호가 존재하기도 하고 같은 속성을 가진 동일 제품 라인의 타이어라도 개별적인 구분이 가능해야 하기 때문에 엔티티로 정의할 수도 있다.

도메인 객체 정의의 장점

자기 서술적인 코드 작성

— 도메인 객체를 정의하게 되면 코드 안에 도메인 모델의 행동과 규칙이 반영되게 된다. 이렇게 코드가 자기 서술적으로 바뀌면 개발 내용의 파악을 위해 기능명세서 같은 문서를 별도로 봐야할 필요도 없어지고 도메인 지식을 코드로 작성한다는 DDD의 핵심에 따라 코드 자체가 지식의 문서화가 될 수 있다.

도메인에 일어난 변경을 반영하기 쉽다

— 로직을 모두 도메인 객체 내에 모아놓고 정의하게 되기 때문에 도메인에 변경이 일어났을 때 매번 산개되어있는 코드를 하나하나 수정할 필요 없이 도메인 객체 내에서만 수정을 하면 되므로 도메인 규칙이 바뀌더라도 반영하기가 쉬워진다.