본 포스트 시리즈는 「도메인 주도 설계 철저 입문」책을 요약한 내용입니다.
이전 발행 글 보기
03장 생애주기를 갖는 객체 - 엔티티
(2) 엔티티의 생애주기와 도메인 객체의 장점
어떤 것을 엔티티로 만들 것인가
생애주기를 갖는 것은 엔티티로, 생애주기를 갖지 않는 것은 값 객체로 만들면 된다. "사용자"는 생성과 삭제 사이의 생애주기를 가지기 때문에 엔티티로 만드는 것이 적합하다. 엔티티는 생애주기 동안 거듭 변화할 수 있는데, 불변으로 남길 수 있는 것은 최대한 불변으로 즉, 값 객체로 남겨놓아야 시스템이 단순해진다.
값 객체일 수도 있고 엔티티일 수도 있다.
동일한 대상도 도메인에 따라 값 객체로 나타내는 것이 더 적합할 수도 있고 엔티티로 나타내는 것이 더 나을 수 있다. 예를 들어 자동차 구조를 모델링할 때 타이어는 자동차의 한 부품이며 대체될 수 있기 때문에 값 객체로 나타내는 것이 좋다. 하지만 타이어 생산 환경에서는 타이어가 어떤 로트에서 언제 생산되었는지 등 개체를 식별하는 것이 중요하다. 따라서 이때는 타이어를 엔티티로 나타내는 것이 적합하다.
도메인 객체 정의의 장점
값 객체든, 엔티티든 도메인 객체를 정의했을 때 장점은 다음과 같다.
- 자기 서술적인 코드가 된다.
- 도메인 변경사항을 코드에 반영하기 쉽다.
1. 자기 서술적인 코드가 된다.
먼저 자기서술적이지 않은 코드를 보자. 일명 '아무것도 알려주지 않는 코드'이다.
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
다음은 자기 서술적인 코드이다.
class UserName
{
private readonly string value;
public UserName(string value)
{
if (value == null) throw new ArgumentNullException(nameof(value));
if (value.Length < 3) throw new ArgumentException("사용자명은 3글자 이상이어야 함", nameof(value));
this.value = value;
}
public string Value => value;
}
위 코드를 통해 사용자 명이 3글자 이상이어야 하며, null이 될 수 없다는 것을 알 수 있다. 도메인 객체는 도메인 모델과 관련된 규칙을 모두 가지고 있으면서 객체의 유효성을 보장한다.
2. 도메인 변경사항을 코드에 반영하기 쉽다.
만약 사용자명이 최소 6글자 이상이라고 변경되었을 때, 도메인 객체가 규칙을 담고 있다면 도메인 객체만 수정하면 된다.
요약
1. 도메인 객체에는 값 객체와 엔티티가 있는데, 생애주기를 가지며 변하는 것은 엔티티로 정의하면 된다. 2. 불변으로 남길 수 있는 것은 불변으로 남길수록 시스템이 단순해진다. 3. 도메인 객체를 정의하는 것의 장점은 코드가 자기서술적인 코드가 된다는 것이고, 도메인에 대해 변경된 사항을 수정하기 쉽다는 것이다. |
'DDD > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
레포지토리란? - 「도메인 주도 설계 철저 입문」 5장 (1) (0) | 2024.09.30 |
---|---|
도메인 서비스란? - 「도메인 주도 설계 철저 입문」 4장 (2) | 2024.09.30 |
도메인 엔티티란? - 「도메인 주도 설계 철저 입문」 3장 (1) (1) | 2024.09.09 |
값 객체의 장점 - 「도메인 주도 설계 철저 입문」 2장 (2) (2) | 2024.09.05 |
값 객체란? - 「도메인 주도 설계 철저 입문」 2장 (1) (2) | 2024.09.04 |