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

[BE] refactor: fetchtype을 Lazy로 변경한 후 EntityGraph를 사용해 최적화 #978

Closed
wants to merge 1 commit into from

Conversation

donghoony
Copy link
Contributor


🔥 어떻게 해결했나요 ?

  • EntityGraph를 도입해 Fetch해오도록 했습니다.

문제 상황, 함께 이야기해보면 좋을 것

현재 추상화로 인해 아래와 같은 객체 구조를 가집니다:

Review
  | (1:N)
Answer (Abstract)
  | 
CheckboxAnswer (Subclass)
  | (1:N)
CheckboxAnswerSelectedOption

이 상황에서 ReviewRepository에서 Answer에 대한 LAZY 처리 + EntityGraph를 사용해 N+1 문제를 해결했습니다만, CheckboxAnswer -> CheckboxAnswerSelectedOption의 N+1 문제는 해결하지 못했습니다. Review에서 Answer를 fetch하기 때문에 하위 클래스에 대한 properties를 불러오지 않기 때문인데요...

이거 같이 해결하면 좋을 것 같아 우선 PR 올리고 대기합니다. 아이디어 바람...

결론 및 문제상황:
0. 해당 문제 상황을 확인하기 위해서는 ReviewDetailLookupServiceTest.사용자가_작성한_리뷰를_확인한다를 한 바퀴 돌려보면 됨.

  1. EAGER로 인해서 N+1 문제가 발생하고 있었음.
  2. LAZY 변경 + EntityGraph를 활용해 문제를 어느 정도 해결했음. (FETCH JOIN을 사용해도 되지만, JPQL에 불필요한 행이 추가되는 경우도 있고, 이슈에 적어 둔 것처럼 작동하지 않는 경우도 존재함, 공부 필요)
  3. 추상 클래스를 fetch하면 추상 클래스의 속성은 fetch함. 하지만 TextAnswer나 CheckboxAnswer처럼 구체 클래스의 속성은 가져오지 않음.
  4. 여기서 발생하는 N+1 문제가 있다. TextAnswer, CheckboxAnswer의 내부 값을 가져올 때 쿼리가 추가로 발생함... 이건 어떻게 해결할 수 있을까?

우선 1, 2는 해결했기 때문에 PR을 올립니다. 어떻게 해결하면 좋을지 의견 나눠주시면 감사하겠습니다~

Copy link

Test Results

156 tests  ±0   138 ✅  - 15   5s ⏱️ ±0s
 59 suites ±0     3 💤 ± 0 
 59 files   ±0    15 ❌ +15 

For more details on these failures, see this check.

Results for commit 58753d2. ± Comparison against base commit fa7d3d3.

@donghoony
Copy link
Contributor Author

오마이갓 엔티티그래프와 페이징 간의 문제가 있었네요 😢 천천히 생각해보겠습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BE] fetchtype EAGERLAZY로 변경하고, 쿼리를 최적화한다.
2 participants