inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

어그리거트 설계

해결된 질문

398

김재연

작성한 질문수 22

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 연관관계는 없으니 조인으로 쿼리를 날려야 할 것 같습니다.

 

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

spring mvc jpa querydsl spring-data-mybatis spring-jpa

답변 2

1

y2gcoder

안녕하세요. 김재연님, 공식 서포터즈 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 인턴

안녕하세요, 인프런 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를 직접 생성하는 방법입니다. 이 방법은 데이터베이스에서 조인을 수행하므로 일부 성능상의 이슈가 있을 수 있으며, 데이터베이스 종류에 따라 조인 처리 방식이 다르므로 주의해야 합니다.

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

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

RepositoryTest의 패키지 위치가 domain인 이유

0

30

2

REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!

0

30

1

update()에 사용하는 setter 질문드립니다.

0

48

1

SQL 중심적 개발의 문제점에 대한 질문

0

72

1

혹시 Containing 을 안쓰신 이유가 있을까요?

0

84

2

[공유] 스프링부트 4.x 버전 mybatis 연동

0

176

1

@repository 어노테이션

0

89

3

ItemService

0

58

1

논리 커밋, 물리 커밋 질문드립니다.

0

54

1

내부 트랜잭션 커밋은 필수인가요?

0

57

1

프록시 커넥션 객체를 반환할 때 생성하는건가요?

0

54

1

Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)

2

178

2

JPQL 대신 네이티브 쿼리를 사용해야 하는 경우

0

79

1

@EventListener(ApplicationReadyEvent.class) 관련

0

88

1

트랜잭션 동기화 매니저와 데이터 소스

0

76

1

DB 관련 강의 개설 계획은 없으신건가요?

0

133

2

물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요

0

94

1

스프링 3 버전 이상 rollbackFor 변경된듯요

1

112

1

트랜잭션 전파 질문.

0

87

1

프로젝트 오픈 에러

0

126

1

외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다

0

84

2

같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환

0

73

1

h2 인메모리 테스트중 예약어 충돌날 경우 대처방법

0

102

1

커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문

0

98

2