도메인 주도 개발에서 말하는 엔티티는
도메인 모델을 구현한 도메인 객체를 의미한다.
이전 장에서 다뤘던 값 객체도 도메인 객체를 의미한다.
값 객체와 엔티티의 차이점
값 객체와 엔티티의 차이점은 "동일성"을 식별할 수 있는지에 달려있다.
예를 들어 값 객체는 이름, 학년 등의 특정 성질을 띄는 값을 캡슐화한 것이라면,
엔티티는 회원을 예로 들 수 있다.
값 객체는 변하지 않는 값이고 (수정이 아닌 새로 생성, premitive type 을 예로 들면 쉬울 듯)
엔티티는 수정 가능하다. 또 속성이 같아도 다른 엔티티일 수 있는데 예로 같은 이름값이어도 다른 사람일 수 있는 것처럼 말이다.
따라서 엔티티를 식별할 수 있는 고유필드가 필요한데, 사람의 경우는 주민등록번호 등이 될 수 있다.
개발을 할 때, 이런 엔티티의 고유값은 변경에 열려있으면 안되므로, setter 같은 함수를 아예 만들어두지 말고, 생성자 같은 경우도 해당 필드를 제한하는 방향으로 설계해야한다.
또 엔티티는 생애주기와 연속성을 갖는다는 특성이 있다.
사용자의 이름 값 객체는 생성된 이후, 유지~소멸의 과정이 딱히 의미를 갖지는 않는다.
하지만 사용자는 한 번 생성되면 데이터베이스에 저장되어, 서비스가 종료되기 전까지 꾸준히 관리되어야 한다.
이런 의미에서는 사용자는 엔티티라고 볼 수 있다.
이런 엔티티는 가변 객체이므로, 불필요한 변경에 유의해야한다.
따라서 필요없는 setter 를 제한하고, 팩토리메소드를 이용하는 등 각별한 유의가 필요하다.
하지만 한 사물이 값 객체와 엔티티로 언제나 분명하게 갈리는 것은 아니다.
시스템마다 다른데, 돈을 예로 들어보면 물건의 가격을 결정한다는 면에서는 값 객체이지만,
한국은행에서 발행하는 화폐 위조 방지 등의 시스템을 생각해봤을때는(화폐마다의 일련번호가 있다)
엔티티로도 볼 수 있다.
도메인 모델을 정의할 때의 장점
- 자기 서술적인 코드가 된다.
- 도메인에 일어난 변경을 코드에 반영하기 쉽다.
저번 글에서 예시로 들었던 코드를 다시 보자.
제목과 내용은 값 객체로 wrapping 해주었고, 엔티티 내부가 값 객체인지 인지하지 않고도 안전하게 생성할 수 있다.
// 게시판 엔티티 생성자
public Board(String title, String contents) {
this.title = new Title(title);
this.contents = new Contents(contents);
}
- 이 때, 게시글 제목에 대한 길이 제한이 변경된다면? => Title 객체만 수정해주면 다른 비지니스 코드를 아무것도 건들이지 않아도 된다.
- 신규 개발자가 들어와서 게시판의 유지 보수를 맡게 되었다. => 게시판은 제목과 내용으로 이루어져 있음을 분명하게 알수 있고, 제목과 내용의 객체를 들여다보면, 길이 제한이라던가 등등의 특성 조건들을 확인할 수 있다.
- 즉 클래스 코드 그 자체로 클래스 자신을 설명하면서, 변경에 안전하다는 구조를 갖는다.
'책 > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
[도메인 주도 설계 철저 입문] 6. 어플리케이션 서비스 - 도메인 서비스와의 분리! (0) | 2022.03.10 |
---|---|
[도메인 주도 설계 철저 입문] 5. 레파지토리 - 데이터와 관계된 처리를 분리하자 (0) | 2022.03.08 |
[도메인 주도 설계 철저 입문] 4. 도메인 서비스 - 부자연스러운 도메인 객체의 행동을 맡기자 (0) | 2022.03.08 |
[도메인 주도 설계 철저 입문] 2. "값 객체"의 개념 & 적용 예시 (0) | 2022.03.07 |
[도메인 주도 설계 철저 입문] 1. 도메인 주도 설계 읽게 된 이유 (0) | 2022.03.07 |