쉽게 말하는 DDD - 엔티티

dante Yoon·2022년 5월 22일
5

이전 시간에 도메인 주도 개발 방법론이 뭔지 알아보고
도메인 객체 중 값 객체에 대해 알아보았습니다.

오늘은 도메인 객체를 이루는 한 종류인 엔티티에 대해 알아보겠습니다.

기대되죠?

엔티티

도메인 모델을 구현한 도메인 객체를 엔티티라고 부릅니다.

값 객체도 도메인 모델을 구현한 도메인 객체인데요,

그렇다면 엔티티와 값 객체간 어떤 차이점이 있는지를 위주로 엔티티를 설명해보려고 합니다.

차이점에 대해 알아봅시다

동일성

값 객체 포스팅에서 두 객체간 비교는 값 객체 내부에 정의한 메소드를 통해 두 객체를 이루는 속성이 다른지 확인하는 과정으로 수행된다고 했는데요,
블로그 포스팅을 표현하는 객체가 있다고 가정해보겠습니다.

class Posting {
  thumbnail;
  ...
}

썸네일을 변경해봅시다.

AS IS

TO BE

섬네일을 변경했다고 우리는 다른 포스팅이 바뀌었다고 하지는 않습니다. 다른 포스팅인지 식별할 때 이 포스팅을 가르키는 아이디가 바뀌었는지를 보는 것이 더 적절한 비교 방법입니다.
https://velog.io/write?id=6d86f02b-f193-488d-9e99-40cb4621fc96

이 때 id는 동일성을 지켜주는 속성입니다.
엔티티는 동일성을 지켜주는 속성을 가지고 있습니다.

엔티티 성질

포스팅에서 썸네일만 변경되는 예시와 같이 현실 도메인에서 사용하는 도메인 객체는 불변성을 가진 값 객체와 다르게 속성이 달라질 수 있습니다.
엔티티의 경우 이렇게 성질이 변경될 수 있는데요,

이러한 성질을 가변성이라고 합니다.
그리고 가변성을 가진 객체는 속성 값이 변경될 수 있기 때문에 두 엔티티를 비교할 때 동일성을 통해 구별할 수 있습니다.

  • 가변성
  • 동일성

무엇을 엔티티로 만들어야 할까 - 생애주기, 연속성

객체는 표현하는 도메인 개념에 따라 프로그램에서 삭제될 수도 있고 계속 살아있을 수도 있습니다.
예를 들어 사용자 엔티티는 회원가입을 통해 생성되고 회원탈퇴를 통해 삭제됩니다.
이렇게 생성과 삭제를 할 수 있는 객체는 생애주기를 갖는다고 합니다.

생애주기를 가지고 있는 객체는 가변성을 띄기 때문에 엔티티로 만들어야 합니다.

그리고 불변 객체에 비해 가변 객체는 다루기 어렵기 때문에 값 객체와 엔티티 중 어떤 것을 선택해야 할지 고민이 된다면
일단 값 객체로 만들고 그 이후 가변객체로 만드는 것이 좋습니다.

도메인 객체를 사용하는 이유

값 객체와 엔티티는 도메인 객체인데, 도메인 객체를 사용하면 무엇이 좋을까요?

userId, userName, userEmail과 같은 객체 속성들을 어느 클래스에서 가지고 있을 때 이 속성들은 간단하게 string 원시타입으로 선언할 수 있지만
UserId, UserName, UserEmail과 같이 값 객체나 엔티티로 만들 수도 있습니다.

콘텍스트 설명에 용이하다

도메인에 따라 UserName은 숫자와 특수문자를 허용할 수도 허용하지 않을 수도 있습니다.
만약 이름 규칙이 엄격한 여권에 사용될 객체라면 특수문자와 숫자는 허용하지 않아야 합니다.
그리고 이는 주석이나 다른 문서를 통해 설명할 수도 있지만 이러한 문서화는 객체 생성에 강제성을 부여하지 못합니다.

하지만 다음처럼 값 객체나 엔티티로 만든다면 원시타입이 할 수 없는 유효성 검사를 할 수 있습니다.

class UserName {
  constructor(name){
    if(!this.isValid(name)){
      return throw Error("not valid")
    }
  }
  
  isValid(){
    ...
  }
}

변경에 용이하다

여기서 변경은 도메인에 일어난 변경을 의미하는데요,
여권의 이름 규칙이 완화되어 특수문자만 금지되고 숫자는 허용한다고 한다면,
그리고 이름에 관한 유효성 로직이 프로젝트 전반에 퍼져 있다면, 수정할 때 여러 곳을 수정해야 합니다만
도메인 객체를 사용할 경우 유효성 검사에 대한 로직을 담당하는 부분만 수정하면 됩니다.

변경에 용이하다는 점이 중요한 포인트입니다.

도메인 주도 설계는 실생활의 개념을 소프트웨어 설계에 적용한 것인데요,
실생활에서 변경은 매우 빈번하게 일어나는 문제입니다.
이 변경 가능성을 도메인 주도 설계에서는 고려하여 변경에 용이한 도메인 객체를 사용하는 것으로 해결합니다.

profile
성장을 향한 작은 몸부림의 흔적들

0개의 댓글