🧐TIL

[DDD] 엔티티, Entity

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

엔티티란

도메인 주도 설계에서 엔티티란 도메인 모델을 구현한 도메인 객체를 의미한다.
어? 값 객체도 도메인 모델을 구현한 도메인 객체가 아니었나?
맞다. 값 객체와 엔티티 둘 다 도메인 모델을 객체로 구현한 것이다.
그러나 엔티티가 가진 값 객체와의 차이점이 있는데, 값 객체는 속성을 통해 객체간 구별이 이루어지는 반면 엔티티는 동일성을 통해 객체간 식별이 이루어진다.

동일성

앞서 값 객체는 불변하는 것이 특성이라는 점을 배웠다. 즉, 값 객체는 속성이 한번 정해지고 나면 속성이 바뀔 수 없으며 또 같은 종류의 값끼리는 비교가 가능하여 두 값 객체가 모두 같은 속성을 갖고 있다면 둘은 같다고 볼 수 있었다.
하지만 사람을 예로 들자면 사람 A와 사람 B가 같은 이름, 같은 나이를 가졌다고 해서 두 사람을 동일 인물이라고 판단하기는 어렵다. 그리고 사람 A가 나이가 든다고 해서 더 이상 사람 A가 아니게 되는 것도 아니다.
이처럼 객체가 가진 속성을 기준으로 객체를 식별 할 수 없는 경우가 있는데, 속성이 변하더라도 객체를 식별할 수 있게 해주는 것이 동일성(identity)이다.
현실에서 사물이 같음을 구분하는 기준이 무엇이냐 하면 철학적인 질문이 될 수 있지만 프로그래밍에서는 일반적으로 식별자를 사용해서 객체의 동일성을 유지한다.

엔티티의 특성

엔티티의 특성은 아래와 같다.
  • 가변이다
  • 속성이 같아도 구분할 수 있다
  • 동일성을 통해 구분된다.
불변성을 갖는 값 객체와는 달리 엔티티는 언제든 속성이 변할 수 있는 가변성을 가진다. 값 객체의 속성이 바뀌면 더 이상 같은 값 객체라고 할 수 없지만, 엔티티는 동일성만 유지가 된다면 속성이 변하더라도 계속해서 같은 객체라고 볼 수 있는 것이다.
그래서 값 객체에는 속성을 수정하는 메서드를 정의하지 않아야 하는 반면 엔티티는 속성을 수정하기 위해 매번 대입을 사용할 필요 없이 속성을 수정하는 메서드를 정의하여 사용할 수 있다.
다만, 객체는 기본적으로 불변을 유지하는 것이 프로그램의 복잡도를 낮추고 버그가 발생할 확률을 줄이기 때문에 반드시 가변성을 가져야하는 속성이 아니라면 굳이 모든 속성이 가변일 필요는 없으며 동일성 유지를 위해 식별자는 불변해야 한다.