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] fetchtype EAGERLAZY로 변경하고, 쿼리를 최적화한다. #977

Open
donghoony opened this issue Nov 20, 2024 · 1 comment

Comments

@donghoony
Copy link
Contributor

🔍 설명

  • 현재 몇 군데 없긴 하지만, 생명주기가 같은 엔티티 연관관계에 대해서 EAGER로 설정돼 있습니다.
  • EAGER는 한 번에 가져오는 게 아니라, 각각의 연관관계에 대해서 SELECT가 한 개씩 나갑니다 (N+1)

🔥 할 일

  • 각각의 EAGERLAZY로 바꾸고, 이 과정에서 발생하는 여러 문제를 해결합니다. 쿼리 최적화 가보자고
  • 추상 클래스 아래에 숨은 1-N 관계는 참 어려운데요, 이건 추상화한만큼 레포에 FETCH JOIN을 넣고, 서비스단에서 적절히 변환하는 게 필요하겠습니다.

⏰ 예상 시간

  • 3시간 넘게?

🐴 할 말

  • 너무 재밌다
@donghoony
Copy link
Contributor Author

ㅇ? JOIN + JOIN FETCH가 작동을 안 한다. @EntityGraph로 작성하니 된다.

    // 여전히 Section.containsQuestionId에서 쿼리가 나간다.
    @Query("""
            SELECT s FROM Section s
            JOIN TemplateSection ts ON s.id = ts.sectionId
            JOIN FETCH SectionQuestion sq ON s.id = sq.sectionId
            WHERE ts.templateId = :templateId
            ORDER BY s.position ASC
            """)
    List<Section> findAllByTemplateId(long templateId);

    // 이렇게 하니까 해결된다..?
    @EntityGraph(attributePaths = {"questionIds"})
    @Query("""
            SELECT s FROM Section s
            JOIN TemplateSection ts ON s.id = ts.sectionId
            WHERE ts.templateId = :templateId
            ORDER BY s.position ASC
            """)
    List<Section> findAllByTemplateId(long templateId);

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