인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이상호님의 프로필 이미지
이상호

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

양방향 1:1 관계 엔티티의 fetch join시 lazyloading 문제에 대해 질문드립니다.

해결된 질문

작성

·

324

0

안녕하세요. 영한님 강의를 보면서 실무에 처음으로 JPA를 도입해서 사용하고있습니다.

질문 내용은 페치조인시에 양방향으로 1:1 관계 매핑이 있는 엔티티의 경우 fetch type을 lazy로 설정하여도 즉시 조회 쿼리가 나가는 것 같아서 질문드립니다. 혹시 제가 설정을 잘못한 것인지 해결은 어떻게 해야할까요?

관계 구성은 간단하게 아래와 같습니다.

Order 조회시 Member를 fetch join 하면Member 와 1:1관계인 MemberDetail 조회 쿼리가 즉시 수행됩니다.

제가 작성한 예제 코드도 공유해드리겠습니다. 테스트 코드에 있는 테스트 케이스를 실행 시켜보시면 조회쿼리를 확인하실수 있습니다.

예제 코드링크

git clone https://sangholee_dev@bitbucket.org/sangholee_dev/one-to-one-test.git

추가로 이건 강의 범주를 넘어서는 질문같긴한데 테이블 설계시 1:1 관계가 옳은 설계인지 궁금합니다.

영한님은 혹시 실무에서 성향이 다른 데이터를 저장할때 정규화하여 1:1 관계로 설계하시는지 아니면 테이블은 분리하지 않고 객체만 나눠서 처리하시는지 궁금합니다.

답변 2

1

이상호님의 프로필 이미지
이상호
질문자

감사합니다. 강의 질문 답변을 조금 더 찾아봤어야 했네요.

실무에서 혼자 해결 할때는 default_batch_fetch_size 를 사용하는 것처럼 문제가 있는 1:1 관계로 매핑되어있는 엔티티들을 전부 fetch join 해서 쿼리가 한번만 더 수행되게 처리했습니다.

위 관계로 말씀드리면 Order를 조회하고 Member, MemberDetail, ProfileImage를 페치조인해서 Order에 member의 id로 찾아 넣어주는식으로 해서 1+1로 쿼리가 수행되게 했는데 알려주신 방법 5가지로 다시 한번 생각해보겠습니다.

그리고 테이블설계도 다시한번 생각해보겠습니다.

감사합니다.

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 상호님 좋은 질문입니다^^

JPA 단골 질문중에 하나인데요. 다음 링크를 확인해주세요^^

https://www.inflearn.com/questions/40670

감사합니다.

이상호님의 프로필 이미지
이상호

작성한 질문수

질문하기