Skip to content
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

Merged
merged 4 commits into from
Sep 25, 2024
Merged

Feat: JPA 쿼리 성능 개선 #228

merged 4 commits into from
Sep 25, 2024

Conversation

adorableco
Copy link
Contributor

@adorableco adorableco commented Sep 25, 2024

PR

✨ 작업 내용

  • 주요 커밋은 53aca8b 입니다!
  • readQuestionsInWorkbook 기능에서 특정 workbook 에 존재하는 questionSetId 리스트 조회 -> questionSetId를 가지는 Question 리스트 조회 -> 각 Question 마다 태그 엔티티 조회 를 거쳐야해서 N+1 문제가 존재했습니다.
  • 따라서 workbook 에 존재하는 questionSetId 리스트를 얻은 후에는 questionSet과 Question을 fetch join 하고 Question과 Tag는 프로퍼티로 설정한 batch size 로 성능 개선을 할 수 있도록 했습니다.

✨ 참고 사항

  • 두 관계 (Question 과 Tag, Question 과 QuestionSet) 모두 fetch join으로 설정해버리면 아래와 같은 multiple bags 오류가 발생합니다.
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
  • 따라서 둘 중 어떤 걸 fetch로 join 해야할 지 선택해야 했는데 dto에 tag 엔티티의 필드도 담아야했기 때문에 (== 즉시로딩을 해야하기 때문에) tag를 fetch join 하는 것으로 결정했습니다.

    • 실제로 이 반대로 fetch join 을 세팅할 경우 tag 엔티티 조회를 위해 쿼리가 한번 더 나가는 것을 확인할 수 있습니다.
  • ✅✅ 일전에 말했던 deserializeOptions() 는 유틸 메서드로 사용하는 대신 원래대로 사용하도록 복원해뒀습니다. dto로 바로 조회하는 대신 question 엔티티 조회로 진행했습니다.


⏰ 현재 버그

  • deserializeOptions() 테스트에서 옵션에 " 와 같은 escape 문자가 필요한 것들이 들어오면 오류가 발생했습니다. 일단 edge case 없이 예시 옵션을 생성하도록 했습니다.

x


✏ Git Close

@adorableco adorableco added ✨ Feature 기능 개발 🫧 seyeon seyeon 🧹 Chore 기능과 관련없는 자질구레한 수정 labels Sep 25, 2024
@adorableco adorableco self-assigned this Sep 25, 2024
@adorableco adorableco linked an issue Sep 25, 2024 that may be closed by this pull request
1 task
Copy link

테스트 커버리지 측정

There is no coverage information present for the Files changed

Total Project Coverage 83.99% 🍏

Copy link
Contributor

@RinRinPARK RinRinPARK left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N+1 네이놈

Comment on lines +13 to +20
em
.createQuery(
"select w from Workbook w" +
" join fetch w.member m" +
" where m.id = :memberId",
Workbook::class.java,
).setParameter("memberId", memberId)
.resultList
Copy link
Contributor

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로 할 생각이엇따면 지나가겠스빈다 총총ㅎㅋㅎ

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엇 딱히 이유는 없듭니다!

Copy link
Contributor Author

@adorableco adorableco Sep 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

나중에 리팩토링하려고 생각하고 있기니한디 아직 queryDSL 보다 그냥 쿼리짜는게 익숙해서 일단은..!!!!!

@adorableco adorableco merged commit 400c865 into develop Sep 25, 2024
1 check passed
@adorableco adorableco deleted the seyeon/swm-179 branch September 25, 2024 05:40
@adorableco adorableco restored the seyeon/swm-179 branch September 25, 2024 05:40
@adorableco adorableco deleted the seyeon/swm-179 branch September 25, 2024 05:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🧹 Chore 기능과 관련없는 자질구레한 수정 ✨ Feature 기능 개발 🫧 seyeon seyeon
Projects
None yet
Development

Successfully merging this pull request may close these issues.

✨ Feat: JPA 쿼리 성능 개선
2 participants