본문 바로가기

책터디/도메인주도설계철저입문

03.생애주기를 갖는 객체 - 엔티티

엔티티란 ?

엔티티 : 도메인 모델을 구현한 도메인 객체를 의미한다.

값 객체 : 도메인 모델을 구현한 도메인 객체

 

엔티티와 값 객체의 차이는 동일성을 통해 식별이 가능한지 아닌지에 있다.

속성으로 구별되지 않는 객체

예 : 사용자

 

사용자는 속성이 아닌 동일성(identity)으로 식별된다.

 

엔티티의 성질

엔티티는 속성이 아닌 동일성으로 식별되는 객체다.

  • 가변이다.
  • 속성이 같아도 구분할 수 있다.
  • 통일성을 통해 구별된다.

가변이다.

엔티티는 가변성을 갖는 객체다.

값 객체는 불변성을 갖기 때문에 교환(대입)해 수정했지만, 엔티티는 수정을 위해 객체를 교환하지 않는다.

엔티티의 속성을 수정하려면 객체의 행동을 통해 수정하면 된다.

단, 모든 속성이 반드시 가변일 필요는 없다.

 

속성이 같아도 구분할 수 있다. 

서로 다른 엔티티를 구별하는 데는 식별자(identity)가 쓰인다.

 

동일성

식별자는 동일성의 실체다. 그러므로 식별자를 가변으로 할 필요는 없다.

엔티티 비교는 동일성을 나타내는 식별자(id)만을 대상으로 한다.

 

엔티티의 판단 기준 - 생애주기와 연속성

생애주기의 존재 여부와 그 생애주기의 연속성 여부가 중요한 판단 기준이 된다.

예 : 

사용자

  • 사용자가 생성하는 동시에 태어나 삭제와 함께 죽음을 맞는다.
  • 사용자는 말 그대로 생애주기를 가지며 연속성을 갖는 개념이다.
  • 엔티티로 판단하기에 문제가 없다.

값 객체도 되고 엔티티도 될 수 있는 모델

같은 대상이라도 어떤 환경에 있느냐에 따라 모델링 방법이 달라진다.

예 :

타이어

  • 타이어는 자동차의 한 부품이며, 특성에는 세세한 차이가 있어도 서로 바꿔 쓸 수 있으므로 값 객체로 나타내기 적합한 개념이다.
  • 타이어 공장이라면 타이어에는 생산 루트가 있으며 루트를 통해 그 타이어가 언제 만들어졌는지 등 개체를 식별하는 것이 중요하다. 그러므로 여기서의 타이어는 엔티티를 타나태는 것이 더 적합하다.

 

도에인 객체를 정의할 때의 장점

  • 자기 서술적인 코드가 된다.
  • 도메인에 변경사항이 있을 시, 코드에 반영하기 쉽다.

 

다양한 행동이 기술된 객체는 그 소프트웨어가 어떤 도메인 지식에 관심이 있는지,
또 그 지식을 어떻게 식별하는지를 나타낸다.
이들 객체는 나중에 개발자가 도메인을 이해하는데 유용한 힌트가 된다.