-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feat: JPA 쿼리 성능 개선 #228
Feat: JPA 쿼리 성능 개선 #228
Conversation
테스트 커버리지 측정
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
N+1 네이놈
em | ||
.createQuery( | ||
"select w from Workbook w" + | ||
" join fetch w.member m" + | ||
" where m.id = :memberId", | ||
Workbook::class.java, | ||
).setParameter("memberId", memberId) | ||
.resultList |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거 혹시
.select(어쩌구)
.join(어쩌구)
이런 queryDSL 문법이 아니라 JPQL로 작성한 이유가 있나? Impl인거 보니까 QueryDSL로 쓰는게 의도인 것 같긴 한데 통쿼리로 써있어서 궁금해가지고(다른 Impl도!).. JPQL로 할 생각이엇따면 지나가겠스빈다 총총ㅎㅋㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
엇 딱히 이유는 없듭니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
나중에 리팩토링하려고 생각하고 있기니한디 아직 queryDSL 보다 그냥 쿼리짜는게 익숙해서 일단은..!!!!!
PR
✨ 작업 내용
readQuestionsInWorkbook
기능에서 특정 workbook 에 존재하는 questionSetId 리스트 조회 -> questionSetId를 가지는 Question 리스트 조회 -> 각 Question 마다 태그 엔티티 조회 를 거쳐야해서 N+1 문제가 존재했습니다.fetch join
하고 Question과 Tag는 프로퍼티로 설정한batch size
로 성능 개선을 할 수 있도록 했습니다.✨ 참고 사항
따라서 둘 중 어떤 걸 fetch로 join 해야할 지 선택해야 했는데 dto에 tag 엔티티의 필드도 담아야했기 때문에 (== 즉시로딩을 해야하기 때문에) tag를 fetch join 하는 것으로 결정했습니다.
✅✅ 일전에 말했던
deserializeOptions()
는 유틸 메서드로 사용하는 대신 원래대로 사용하도록 복원해뒀습니다. dto로 바로 조회하는 대신 question 엔티티 조회로 진행했습니다.⏰ 현재 버그
deserializeOptions()
테스트에서 옵션에"
와 같은 escape 문자가 필요한 것들이 들어오면 오류가 발생했습니다. 일단 edge case 없이 예시 옵션을 생성하도록 했습니다.x
✏ Git Close