작성
·
15
·
수정됨
0
현재 DDD와 핵사고날을 혼자 공부하며, 스타트업에서 적용시켜보고있는 주니어 개발자입니다. 현재 Spring boot를 사용하면서 Jpa 기반으로 연관관계(@ManyToOne, @OneToMany 등) 지양하며, 단순 id만을 컬럼으로 가지고 있는 엔티티를 설계했는데요.
저는 물리적 데이터베이스(mysql, redis, mongo 등)의 테이블 도큐먼트와 매핑되는 객체를 엔티티, 그리고 어플리케이션 내부에서 사용하게 되는 객체를 도메인이라고 지정해서 엔티티와 도메인의 분리를 해놨습니다.
현재 패키지 구조또한 각각의 도메인 별로 구성해서 나눴습니다. (User, Card, Bike 등등) 여기서 궁금한게 만약 다른 도메인끼리의 협력이 필요한 경우, 예를 들어서 user의 어떠한 usecase에서 현재 타고있는 bike의 이름이 궁금하다던지, 이런 다른 도메인끼리의 협력이 command 혹은 query로 필요한 경우 usecase를 구현한 서비스에서 다른 도메인의 usecase를 호출해도 되는지가 궁금합니다.
저는 이러면 안된다고 생각을 했고, 그럼 패키지 별로의 약한 결합이어도 나중에 모듈화 할때 문제가 된다고 생각했습니다
위의 예시를 들면, user의 어떠한 Usecase에서 bike의 도메인에 이름이 궁금해서 이름을 반환해주는 usecase가 있다고 했을때, user패키지에는 bike 패키지 안에있는 usecase를 가져갈수밖에 없다. 라고 생각을했습니다.
그래서 저는 이경우에 bikeEntity와 1대1로 매핑이 되는 도메인은 도메인으로서 bike 그자체의 책임을 가지고 가고, user 패키지 안에 bike의 정보를 가져올수있는 엔티티를 만들어 필요한 정보를 제때제때 꺼내쓰는 방법을 생각했습니다. 즉, 하나의 테이블, 혹은 도큐먼트를 여러개의 엔티티에 매핑을 시키는 셈인거죠. 물론 command는 원본 엔티티에서만 가능하게 한다고 생각했습니다.
그래서 지금 제가 내린 결론은 다른 도메인에서의 usecase의 협력이 필요하면 usecase를 조합하는 orchestrator를 만들어서 거기서 조합을 하자는 결론을 내렸는데, 문제는 이경우, 도메인의 협력이 많은 경우 결국 usecase의 '짬통,,?' 이 될것같습니다...
혹시 어떤게 맞는 방법일까요,,? 또한 현업에서는 어떻게 구현하는지 궁금합니다...
긴글 읽어주셔서 감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
jake991110님께서 고민하신 DDD(도메인 주도 설계)와 관련된 질문에 대해 이야기해보겠습니다. 현재 사용 중인 방식에서 도메인 간의 의존성을 어떻게 다룰지에 대한 문제를 고민하고 계신 것 같습니다.
비즈니스 로직과 응집력: DDD에서는 각 도메인이 비즈니스 로직을 중심으로 응집력을 가져야 합니다. 서로 다른 도메인들은 최대한 느슨하게 결합되어야 하지만, 현실적으로 특정 도메인 간의 상호작용(협력)이 필요할 수밖에 없습니다.
도메인 서비스와 애그리게이트: 도메인 간의 연관 관계에서, 일반적으로 고려할 수 있는 방식은 ‘도메인 서비스’를 활용하는 것입니다. 이들 서비스는 비즈니스 로직을 적용하는 위치로, 여러 애그리게이트 간의 협력을 조정할 수 있습니다.
Repository 접근 방식: 각 도메인의 애그리게이트 루트는 자기 애그리게이트의 데이터를 다루어야 하며, 다른 애그리게이트의 세부 사항은 직접 참조하지 않고, 관련된 서비스나 레포지토리를 통해 접근해야 합니다.
Orchestrator 패턴의 조합: 다른 도메인의 usecase를 호출하는 부분에 대한 해결책으로 Orchestrator 패턴을 고려하셨는데, 이는 복잡한 비즈니스 로직을 조율하는 데 적합한 방법입니다. 다만, jake991110님께서 언급하신 것처럼, 결국 많은 기능이 이 Orchestrator에 집중되면 ‘짬통’이 될 우려가 있습니다. 이를 최소화하려면 서비스 계층의 응집력을 유지하는 것이 중요합니다.
현재 구현과 실무: 현업에서는 이러한 도메인 간의 협력을 처리하기 위해 여러 가지 접근 방식을 사용합니다. 예를 들어, 공통 서비스 계층을 따로 두어 도메인 별로의 협력을 용이하게 하거나, 이벤트 드리븐 아키텍처를 활용하여 비동기로 다른 도메인에 필요한 정보를 처리하기도 합니다.
마지막으로, 정해진 방식이 명확한 영역은 아니니, jake991110님께서 적절하다고 판단하는 방향으로 설계하시되, 응집력과 결합도의 균형을 유지하는 것이 중요합니다.
추가적인 학습 자료나 예제를 Spring 공식 문서에서 찾아보실 수도 있습니다. 아래 링크를 참고하세요.
- Spring Data Repositories Example
도움이 되셨기를 바랍니다. 좋은 학습 이어가시길 바랍니다!