• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Entity 생성시 다른 애그리거트의 정보/로직이 필요한 경우 생성 방식의 선택 기준

21.03.31 18:25 작성 조회수 296

0

안녕하세요. 이번 강의 내용에서 추가적인 요구사항을 적용해보는 중, 설계상 궁금증이 생겨 질문하게 되었습니다.

jpashop에서는 환불제도 악용 회원의 주문을 일정 기간동안 금지할 수 있다는 요구사항을 추가했습니다.

이 변경된 요구사항을 위해,

MemberStatus라는 VO를 Member 클래스에 추가했습니다. 

결과적으로, Order 클래스를 생성함에 있어서 MemberStatus의 로직(다른 애그리거트의 Value Object)을 필요로 합니다.

이 때, 선택할 수 있는 생성 방식이 여러개가 떠올라서, 이들의 선택 기준에 대한 조언을 듣고 싶습니다.

첫번째 방식. 정적 팩토리 메서드의 매개변수로 추가

첫번째 방식은 생성시 필요한 정보를 가진 객체(MemberStatus)들을, 정적 팩토리 메서드의 매개변수로 전달합니다.

선택 기준은 

  1. 객체(Order)를 생성함에 있어서, 특정 객체(MemberStatus)가 필요함을 명시적으로 알릴 수 있습니다.
  2. 생성로직을 해당 클래스가 전적으로 제어하는 것이 생성 로직을 한 곳에 더 응집시킬 수 있습니다.

이 두가지를 고려했습니다.

이 방식에서는 회원 차단에 따른동작 분기는 정적 팩토리 메서드 내에서 이루어집니다.

다만, Order를 생성하는데 있어서 MemberStatus 이외에도 협력해야 할 애그리거트들이 많이 존재하는 경우 Order 클래스가 너무 많은 의존성을 가지게 될 수 있다는 점이 우려됩니다.

두번째 방식. 생성을 위한 정보/로직을 가지고 있는 클래스가 생성을 담당

선택 기준은 

  • Member가 Order를 생성하기 위한 로직(회원 차단 여부)을 제공합니다.

위 내용을 고려했습니다.

이 방식에서는 검증 통과 여부에 따른 동작 분기는 Member의 메서드 내에서 이루어집니다.

다만, 이 방식은 Member —> Order로의 불필요한 의존성을 만들어낼 수 있다고 우려했습니다 특히, 생성에 대한 책임을 맡는다는 것은 내부에 어떤 데이터를 가지고 있는지 전부 알아야 한다는 점에서 생각보다 과도한 의존성을 부여하고 있는 것 같습니다.

또한 협력해야 할 애그리거트가 많아질 수록, Member가 생성과 관련된 다른 클래스들에 대한 많은 의존성을 감당해야 한다는 점이 우려됩니다.

세번째 방식. 애그리거트를 생성하는 Domain Service를 만든다.

선택기준은

  • 많은 의존성을 가져야 하는 생성 로직을 서비스에 담음으로서, 엔티티가 불필요한 의존성을 가지는 것을 방지합니다.

위 내용을 고려했습니다.

다만, 조금만 복잡해져도 도메인 서비스를 사용하고자 하는 유혹이 생겨서, 자칫하면 다른 로직들도 Domain Service로 구현해, Entity 자체의 응집성이 작아지는게 아닌가 우려스럽습니다.

질문 내용 정리

1. 각 생성 방식을 선택함에 있어서 미흡한 선택 기준에 대해서 조언 해주 실 수 있나요?

2. 또 첫번째, 두번째 방식이 우려하는 사항들은 현재의 사례에서는 잘 드러나지 않는 '잠정적인' 우려사항들인데, 실제로 이 우려사항들이 나타나기 전까지는 가장 간단한 구현(첫번째 혹은 두번째)을 그대로 사용해도 될까요?

답변 1

답변을 작성해보세요.

2

안녕하세요. 준하님 좋은 질문입니다.

고민을 많이 하셨군요.

두번째는 고민하셨던 점 때문에 첫번째나 세번째 중에 선택하시면 좋을 것 같아요.

단순하면 첫번째, 복잡하면 세번째요^^

이미 장단점을 잘 파악하고 계셔서, 프로젝트를 할 때 마다 이 고민을 계속 유지하면서 본인 것으로 완성하시면 될 것 같아요.

감사합니다.