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

galid님의 프로필 이미지
galid

작성한 질문수

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

주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화

JPA 책의 LAZY + JPQL 질문입니다.

작성

·

256

0

좋은 강의 감사합니다.

연관관계 fetch Type을 LAZY로 설정하고, JPQL을 이용해 하나의 엔티티만 조회하도록 하면, 실제로 연관 대상 엔티티를 사용하기 전까지는, query가 발생하지 않는 것으로 이해를 했는데, 다음과 같은 현상이 발생하는데 잘 이해가 가질 않습니다 도와주세요.. ㅠ


답변 3

1

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

안녕하세요. galid님

먼저 Team을 쿼리하는 부분이 어디인지 찾아야 합니다.

Member를 쿼리로 조회하는 시점인지 아니면 어디인지 찾는 것이 필요합니다.

이 부분을 먼저 다양한 곳에 로그를 남겨서 확인해주세요.

감사합니다.

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

바쁘실텐데 빠른 답변 감사드립니다.

테스트용으로 만든것이라 다음과 같이 하나의 API만 만들어져있고, 테스트하고 싶은 부분만 코드가 작성되어 있는 상태입니다.










계속해서 아래와 같이 N+1이 발생합니다 ㅠ


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

안녕하세요 . galid님

답변에서 말씀드린 것 처럼 어디에서 N+1이 발생하는지 그 위치를 찾아야 합니다.

먼저 다양한 곳에 로그를 남겨서 추정되는 부분을 찾아주세요.

예를 들어서 조회하는 시점인지 테스트 코드에서 발생하는지 등등 확인이 필요합니다.

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

답변 감사합니다. 제 코드 자체가 너무 간단해서 질문을 잘 이해하지 못하겠습니다 ㅠ

JPQL로 member만을 조회하는 api 단 하나 밖에 없으며, 해당 API를 호출하는 시점에 N+1 쿼리가 발생합니다. (위의 첨부된 사진이 작성한 코드의 전부입니다.)

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

JPQL을 조회하는 시점에 발생하는지, 아니면 JPQL을 조회하고 컨트롤러에서 데이터를 반환한 다음에 발생하는지 이 포인트를 찾아야 합니다.

JPQL 조회 직전에 추가 로그

JPQL 조회 직후에 추가 로그

컨트롤러 데이터 반환 직전에 추가 로그를 남겨서 실행해보시겠어요?

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

바쁘실텐데 항상 답변 감사합니다.

1. JPQL 쿼리 직전, 직후
2. Controller에서 반환 직전

둘다 쿼리로그를 찍어보았습니다

위 그림처럼  쿼리와 동시에 N+1이 발생하는것 처럼 보입니다 ㅠ

(service 계층에서 jpql을 단순히 호출만 하고 반환하는 코드는 없으며, controller 계층에서도 jpql호출 메소드만 호출하며 데이터를 조회하거나, 별도로 만들어서 응답하는 코드가 일절 없는 상태입니다)

0

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

같은 문제에 대한 질문이 google에 이미 있었네요.. 찾아봤어야 했는데 Java와의 차이점일거라고는 생각을 미처 못했습니다.

Kotlin에 대해서 더욱 깊이있게 공부를 해야할 것 같습니다 감사합니다. !!

https://stackoverflow.com/questions/67130567/why-hibernate-lazy-loading-acts-different-in-kotlin

https://wave1994.tistory.com/154

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

galid님 공유까지 감사합니다^^

0

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

안녕하세요. galid님

어떤 문제가 있는지 지금 상태로는 알기가 어렵네요. 결국 코드를 받아보아야 답을 드릴 수 있을 것 같아요.

제가 코틀린을 사용하지 않아서, 프로젝트를 자바로 새로 작성하신 다음에 구글 드라이브로 공유부탁드립니다.

구글 드라이브 사용방법은 다음을 참고해주세요. 

https://bit.ly/3fX6ygx

감사합니다.

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

Java로 구현하고 테스트를 해보니 kotlin과 똑같이 구현했는데 java에서는 N+1문제가 발생하지 않네요 .. ㅠ
항상 정성스런 답변 감사드립니다.

JAVA 구현 링크입니다.
https://drive.google.com/file/d/1YgVuFbVn_eEdb6ITwx2QrGNWnzqJfpqe/view?usp=sharing

Kotlin 구현 링크입니다.
https://drive.google.com/file/d/1aIzzrsMW3Tab71MSMZW3xEUYLrXVxDgz/view?usp=sharing


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

네 코틀린 내부 문제인가 보네요.

제가 코틀린을 사용하지 않아서 정확한 문제를 잘 모르겠습니다.

혹시 아시는 분 있으면 답변 부탁드립니다.

감사합니다.

galid님의 프로필 이미지
galid

작성한 질문수

질문하기