도메인 주도 설계 철저 입문 3장 학습 내용을 정리 한다.
엔티티란?
도메인 주도 설계에서 엔티티는 도메인 모델을 구현한 도메인 객체를 의미한다. 값 객체도 도메인 모델을 구현한 도메인 객체에 포함되며, 값 객체와의 차이는 동일성(Identity)을 통해 식별이 가능한지 아닌지에 있다.
엔티티의 성질
엔티티와 값 객체는 모두 도메인 모델을 구현한 도메인 객체라는 점에서 비슷하지만, 성질에는 차이가 있다.
- 가변이다.
- 속성이 같아도 구분할 수 있다.
- 동일성(Identity)을 통해 구별된다.
1. 가변이다
엔티티는 가변성을 갖는 객체다. 사람이 시간이 지남에 따라 나이나 키 등의 속성이 달라지듯이 엔티티의 속성도 변화할 수 있다.
사용자 객체를 예로 들면, 사용자명이 처음에는 마음에 들었어도 시스템을 이용하다가 나중에 더 나은 사용자명이 떠올라 변경하고 싶다는 생각이 들 수 있을 것이다. 이럴 때 가변 객체에서는 속성을 변경하는 메서드를 추가하면 된다.
class User
{
private string Name;
public User(string name)
{
ChangeName(name);
}
public void ChangeName(string name)
{
if (name == null) throw new ArgumentNullException(nameof(name));
if (name.Length < 3) throw new ArgumentException(
"사용자명은 3글자 이상이어야 합니다.", nameof(name));
this.Name = name;
}
}
값 객체에서는 불변성을 갖기 때문에 객체를 교환(대입)해 수정했지만, 엔티티는 수정을 위해 객체를 교환하지 않는다. 엔티티의 속성을 수정하려면 객체의 행동을 통해 수정하면 된다. 단, 모든 속성이 가변일 필요는 없다. 엔티티는 필요에 따라 속성을 가변으로 만들 수 있는 객체일 뿐이다. 가능한 한 객체는 불변으로 남겨 놓는게 좋다.
2. 속성이 같아도 구분할 수 있다
사람은 속성만으로 구별하지 않는다. 이름이 같다고해서 같은 사람으로 인식할 수 없기 때문이다. 엔티티는 서로 다른 엔티티를 구별하는데 식별자(Identity)가 쓰인다. 식별자로 구분할 수 있다. 식별자 UserId 객체 예시
class UserId
{
private string Value;
public UserId(string value)
{
if (value == null) throw new ArgumentNullException(nameof(value));
this.Value = value;
}
}
// User 엔티티 클래스
class User
{
private readonly UserId Id;
private string Name;
public User(UserId id, string name)
{
if (id == null) throw new ArgumentNullException(nameof(id));
if (name ==) throw new ArgumentNullException(nameof(name));
this.Id = id;
this.Name = name;
}
}
3. 엔티티의 판단 기준
값 객체와 엔티티는 모두 도메인 개념을 나타내는 객체로서 서로 유사한 점이 많다. 그렇다면 어떤 것을 값 객체로 정의하고 어떤 것을 엔티티로 정의해야할 것인지 판단 기준이 필요하다.
- 생애주기를 갖는가?
- 연속성을 갖는가?
사용자는 시스템을 이용하려는 사람에 의해 생성된다. 시간이 흘러 시스템을 더 이상 이용할 필요가 없게 되면 사용자를 삭제하게 된다. 사용자는 생애주기를 갖으며 연속성을 갖는 개념이므로 엔티티로 판단할 수 있다. 이러한 조건에 만족하지 않는다면 우선 값 객체로서 다룬다.
도메인 객체를 정의할 때의 장점
- 자기 서술적인 코드가 된다. ( 스펙으로써 사용될 수 있음 )
- 도메인에 변경사항이 있을 시 코드에 반영하기 쉽다. ( 로우 레벨에서 간단한 규칙추가나 변경이 가능함 )
'서적 > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
[도메인주도설계철저입문] 7장 소프트웨어의 유연성을 위한 의존 관계 제어 (0) | 2024.03.14 |
---|---|
[도메인주도설계철저입문] 6장 애플리케이션 서비스 (0) | 2024.03.03 |
[도메인주도설계철저입문] 5장 리포지토리 (0) | 2023.10.16 |
[도메인주도설계철저입문] 4장 도메인 서비스 (0) | 2023.10.16 |
[도메인주도설계철저입문] 2장 값 객체 (0) | 2023.10.14 |