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

오래된개발자님의 프로필 이미지
오래된개발자

작성한 질문수

실전! 스프링 데이터 JPA

강의 자료

비식별자 연관관계 및 페치 조인관련 질문 있습니다!

작성

·

390

1

안녕하세요 강사님!

현재 JPA (Spring Data JPA + Querydsl)로 시스템을 구성하고 있는 중에 비식별자 연관관계 조인 및 fetch 조인 관련 되어 질문이 있어서 글을 쓰게 되었습니다. 거두절미하고 질문 드려볼게요.

- 비식별자 연관관계

PK가 아닌 UK로 연관관계를 맺어야 할 경우 @JoinColumn의 referencedColumnName 를 통해서 조인은 가능한 것이 확인 되었습니다. 다만 이럴 경우 fetchType을 LAZY로 해도 EAGER 처럼 한번에 조회가 되더라고요!

확인해 보니 하이버네이트 내부에서 Lazy 로딩 시에 외부 엔티티의 프록시 객체를 생성함에 있어 PK를 기준으로 관리를 진행하는데 PK에 대한 정보가 없기 때문에 프록시 객체 구성을 하기 위해 fetch를 무시하고 바로 EAGER로 조회 하는 것으로 알고 있습니다.

위에 제가 이해한 내용이 맞는지... 그리고 혹시 실무에서 이런 경우가 발생 할 경우 어떻게 처리 하는지 궁금합니다!

제 생각에는 해당 엔티티만 따로 SQL(JdbcTemplate)로 처리 해야할 것으로 생각 되는데, 혹시 다른 방안이 있나 궁금하네요!
(참고로 현재 저희는 연관관계상에 UK를 모두 배제하고 PK를 하기로 결정하였습니다. )

- fetch 조인 관련

실무 관련 질문입니다. JPA 경우 LAZY 로딩을 통해서 원하는 시점에서 쿼리를 해 오는 것으로 이해를 했습니다. (프록시 및 영속성 컨텍스트)

다만 SQL 기반으로 개발을 할 경우 어떤 기능 구현을 위해 쿼리를 할 경우 대부분 조인이 되어 있는 완성형 쿼리만을 사용하여 한번만 쿼리를 날리는데, JPA 경우 LAZY를 적극적으로 활용한다면 쿼리 횟수가 늘어날 것이고 이를 방지하기 위해 fetch 조인문이 많아질 거라고 생각이 듭니다.

실제 JPA를 실무에서 진행할 경우 기능 구현 시 단일 테이블 조회 기능 외 대부분 fetch 조인 쿼리를 사용하는지 그 빈도가 궁금합니다.

혹시 질문 내용이 너무 추상적이면 말씀해주세요! 다시 정리 하여 질문 드리겠습니다.

 

감사합니다!

 

 

 

 

 

 

답변 2

2

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

안녕하세요. 오래된개발자님

referencedColumnName는 생각하신 내용이 맞고, 그래서 가급적 사용하지 않는 것이 좋습니다. 추가로 사용하게 된다면 성능 문제를 해결하기 위해 JPQL의 fetch join 등을 함께 사용하시는 것을 고려하셔야 합니다.

추가로 질문 주신 부분에 답을 드리자면 실무에서도 fetch join을 아주 많이 사용하고, 활용2에서 설명드린 다양한 최적화를 모두 적용합니다.

감사합니다.

0

주말에 쉬셔야할텐데... 답변 정말 감사합니다!!

오래된개발자님의 프로필 이미지
오래된개발자

작성한 질문수

질문하기