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

//님의 프로필 이미지
//

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

실전 예제 2 - 연관관계 매핑 시작

양방향 연관관계 순환참조 질문

작성

·

442

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

안녕하세요 강의 잘 듣고 있습니다.

강의를 듣다가 궁금증이 생겨 질문 드립니다.

양방향 연관관계의 설정이 언제 필요할지 생각을 해보았는데 게시글과 댓글의 일대 다 관계에서

게시글을 조회할때 댓글이 같이 조회되는것을 원하는 경우가 있을 것 같습니다. 그렇다면 이전강의에 말씀하셨던 무한 루프(?)에 빠질 수 있을 것 같은데요. 아마 이걸 순환참조라고 말한다고 알고 있습니다.

그러면 애초에 댓글은 댓글대로 따로 조회하고

게시글을 조회할때 댓글 조회하는 방식 즉 연관관계의 주인이 아닌곳에서 리스트를 조회하려고 하는 방식은 안쓰는것이 좋은것인가요?

답변 1

0

안녕하세요. //님, 공식 서포터즈 y2gcoder입니다.

질문해주신 부분을 정확하게 이해했는지는 모르겠습니다.

게시글을 조회할 때 댓글 목록을 같이 조회하는 곳에서 무한 루프가 발생할 수 있다고 생각하신 이유에 대해 조금만 더 설명해주시면 감사하겠습니다!

제가 임의로 생각해봤을 때, 사실 게시글 목록을 조회하면서 각 게시글들의 댓글 목록을 같이 조회하는 경우는 사실 많지 않은 것 같습니다. 실제로는 대부분 게시글 상세를 들어가면서 해당 게시글의 상세정보와 댓글 목록을 보는 화면들이 많고, 실제로 저는 구현할 때 게시글 id로 게시글 상세 정보를 불러오는 API 와 게시글 id로 게시글의 댓글 목록을 불러오는 API를 따로 분리해서 구현했던 것 같습니다. 제 개인적인 실무 경험으로는 이렇게 구현하기도 했다는 점을 말씀드리고 싶었습니다.

같이 조회하는 것도 게시글 단건에 대한 댓글 목록 조회라면 사실 큰 상관이 없고 게시글 목록 조회에서 댓글 목록 조회도 쿼리를 잘 작성하신다고 하면 또 괜찮다고 생각합니다(해당 요구사항이 필요하다는 가정 하에). 해당 쿼리 최적화와 관련된 부분은 영한님의 JPA 활용 2편에 자세하게 소개되어있으니 참고하시면 많은 도움이 되실 것 같습니다 :)

 

감사합니다.

//님의 프로필 이미지
//
질문자

답변 감사합니다! 구현 방식에 대한 부분은 이해가 됐습니다!

다만 순환참조가 일어날것이라고 생각한 이유는 다대일 양방향 연관 관계에서
1(EX : 게시글) 쪽에서 조회를 할때 다(EX :댓글)에 해당하는 부분을 조회하며 리스트 형태로 반환하려고 하면 강의에서 본 순환참조가 일어나서 StackOverFlow가 발생했고 이를 @Jsonignore 어노테이션을 사용해서 순환참조를 끊어주었던 경험이 떠올라서 질문드렸습니다.

엇 ㅎㅎ

혹시 엔티티를 그대로 API의 응답으로 반환하려고 하셨을 때 해당 예외를 접하셨다면, 오히려 그 부분은 엔티티에 API 응답 클래스라는 책임까지 추가하려고 했기 때문에 생긴 예외라고 생각합니다!

보통 개발 원칙에서도 해당 객체가 져야할 책임은 적으면 적을수록 좋다고 합니다. 저도 그에 따라JPA 엔티티는 영속성 레이어나 애플리케이션 레이어까지만 사용하려고 하고 컨트롤러를 위시한 표현 레이어에서는 DTO로 바꿔서 응답하려고 합니다 :)

//님의 프로필 이미지
//
질문자

Dto 역할을 하는 게시글 Response클래스를 만들어서 반환하려 했던것으로 기억합니다.

PostResponse의 생성자로 Post 엔티티를 변환해서 반환하는 방식이었습니다.

이 부분도 강의를 들으면서 조금 이해가 안갔는데 "나는 ResponseDto로 반환했는데도 왜 순환참조가 났었지..?" 하는 생각이 들더라구요 ..ㅠㅠ 원래 Dto로 변환해서 조회하면 순환참조 문제에서 벗어나야하는게 정상인가요?

제가 어줍잖게 //님의 프로젝트에

대해 잘 모르는 상태에서 답변을 드리기가 굉장히 조심스럽습니다..

다만 복잡한 조회 쿼리에 대해서는 활용 2편에서 자세하게 소개드리고 있으니 해당하는 챕터를 한 번 학습해보시는 것이 어떠시겠습니까?

저도 한번씩 복습할 때마다 또 보이는게 있고 잊었던 것도 떠올리게 되는 부분이 있는 것 같습니다 :)

//님의 프로필 이미지
//

작성한 질문수

질문하기