인프런 커뮤니티 질문&답변

김재연님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

어그리거트 설계

해결된 질문

23.08.12 00:23 작성

·

329

·

수정됨

0

jpa를 활용해서 어그리거트를 만들고 있습니다.

 

게시글 (post 어그리거트)

게시자 (member 어그리거트)

로 어그리거트를 나눴습니다.

 

그리고 프로젝트 패키지 구조는 이런 식 입니다.

controller

- post

- member

service

- post

- member

domain (entity와 repository 인터페이스)

- post

- member

infra (repository 구현체)

- post

- member

 

 

만약 같은 데이터베이스임에도 post엔티티가 member엔티티를 간접참조(Long memberId를 통한 참조)를 하고 있다면, post 상세페이지에서 member의 이름을 띄워주는 것을 어떻게 구현해야 좋을까요?

 

현재 고려하고 있는 방법은 두 가지 입니다.

  1. service/post 패키지에 PostDetailService 객체를 만든다. 그리고 이 객체가 postRepository와 memberRepository를 di 받은 다음에 두 엔티티를 가져오고 responseDto로 합쳐서 PostDetailController에게 리턴한다.

이유는 member 어그리거트가 다른 서버로 분리될 경우, memberRepository의 구현체만 변경하면 될 것 같아서 입니다. (member의 서버가 다른 서버가 되면 member 정보를 api로 받아와야 할 것 같아서 그렇게 하였습니다.)

 

 

  1. 또 다른 방법으로는 현재는 같은 rdb에 저장되어 있으니 Dao객체를 만들어서 조인으로 responseDto를 직접 만드는 방법이 있을 것 같습니다. jpa 연관관계는 없으니 조인으로 쿼리를 날려야 할 것 같습니다.

 

어느 방법이 더 좋은 방법인가요? 혹은 더 좋은 방법이 있을까요?

답변 2

1

y2gcoder님의 프로필 이미지

2023. 08. 14. 21:09

안녕하세요. 김재연님, 공식 서포터즈 y2gcoder입니다. AI 답변에 더하여 답변 드립니다.

자세한 요구사항을 알기가 어려운 상황에서 다소 원하시는 답변이 아닐 수도 있을 것 같습니다. 그리고 저또한 미숙한 경험으로 인해 답변을 드리고 있습니다. 그저 참고용으로만 해주십쇼! Post 애그리거트와 Member 애그리거트를 나눴고, Post를 가져올 때 Writer의 id 뿐만 아니라 name도 같이 가져오고 싶은데, 그 방법에 대해서 고민하고 계신 것으로 이해했습니다. 만약 Post 애그리거트 자체에서 계속해서 Writer의 name이 필요한 것이라면 저는 Post 애그리거트 내에 Writer라는 값객체를 만들어 id, name을 항상 가져오도록 구성할 것 같습니다. 이를 위한 방법으로는 말씀해주셨던 것처럼 infrastructure에서 Post를 가져올 때 같은 DB라면 join으로 가져오든, 다른 DB라면 다른 infra 구현체를 통해 가져오든 방법은 자유일 것 같습니다. 중요한 것은 도메인 로직이라고 생각하기 때문입니다.

만약 조회에서만 그렇게 사용하신다면 조회용 모델을 따로 만들어서 사용하셔도 될 것 같습니다. 이것을 더 확장하면 CQRS라고도 볼 수 있을 것 같습니다. 기존 Post는 커맨드용 객체로 놔두고 조회할 때만 사용할 Query용 객체를 만들고 해당 객체에서 작성자의 이름 등 필요한 정보를 적절하게 가져오는 것입니다.

두 가지의 구현기술 자체는 김재연님께서 말씀하셨던 방법들을 본인의 프로젝트 상황에 맞춰서 구현해보시면 될 것 같습니다!

감사합니다.

1

인프런 AI 인턴님의 프로필 이미지

2023. 08. 14. 00:26

안녕하세요, 인프런 AI 인턴이에요.

어그리거트를 설계하고 있다는 것에 대해서 축하드립니다! Post 어그리거트와 Member 어그리거트로 나누어 설계하셨다면, 각 어그리거트 간의 관계를 생각해야 할 것 같아요.

같은 데이터베이스에 있지만, Post 엔티티가 Member 엔티티를 간접 참조하는 경우, Post 상세 페이지에서 Member의 이름을 띄워주고 싶다고 하셨죠? 여러 가지 방법이 있을 수 있지만, 고려하고 있는 방법은 두 가지로, PostDetailService 객체를 만들어서 Post와 Member 엔티티를 가져오고 responseDto로 합쳐서 반환하는 방법과, 조인을 이용해서 직접 responseDto를 생성하는 방법이 있습니다.

첫 번째 방법인 PostDetailService 객체를 만들어 사용한다면, Post 엔티티와 Member 엔티티를 가져오기 위해 PostRepository와 MemberRepository를 DI로 받아와야 합니다. 그리고 이 두 엔티티를 가져와서 responseDto로 합쳐서 PostDetailController에게 반환하는 방식입니다. 이 방법은 Member 어그리거트가 다른 서버로 분리될 경우, MemberRepository 구현체만 변경하면 되므로 유연성이 좋을 수 있습니다.

두 번째 방법은 현재 Post와 Member 엔티티가 같은 RDB에 저장되어 있다는 가정하에, Dao 객체를 만들어서 조인을 이용하여 responseDto를 직접 생성하는 방법입니다. 이 방법은 데이터베이스에서 조인을 수행하므로 일부 성능상의 이슈가 있을 수 있으며, 데이터베이스 종류에 따라 조인 처리 방식이 다르므로 주의해야 합니다.

어떤 방식을 선택하느냐에 따라서 각각 장단점이 있으니까, 자신의 프로젝트에 맞는 방식을 선택하시면 될 것 같아요. 선택하신 방식이 프로젝트에 잘 맞도록 조정하고 개선해 보시기 바랍니다. 어떤 방식을 선택하시든, 설계와 유지보수에 주의를 기울여 프로젝트를 완성해 나가시기 바랍니다.

더 궁금한 점이 있으시면 언제든지 물어보세요. 좋은 결과를 기대해 보겠습니다!