Skip to content

Feature/#27 문항 검색 api 추가#32

Merged
sejoon00 merged 3 commits intodevelopfrom
feature/#27
Feb 3, 2025
Merged

Feature/#27 문항 검색 api 추가#32
sejoon00 merged 3 commits intodevelopfrom
feature/#27

Conversation

@sejoon00
Copy link
Contributor

@sejoon00 sejoon00 commented Feb 1, 2025

🌱 관련 이슈

📌 작업 내용 및 특이사항

image

  • 문항 검색에 검색조건이 문항 ID, 문항 이름, 문항 개념 태그리스트 3가지가 있고 추후에 추가될 여지도 있어서 동적쿼리 도입이 필요했습니다.
    • JPA로 구현시, 한가지 검색조건이 늘어날 때마다 메서드 개수가 2배씩 늘어나 QueryDSL을 활용해 해결했습니다.
  • 문항과 카테고리가 연관관계 없이 ID 값 참조로 되어 있기 때문에 N+1 방지를 위해선 join을 통해 한번에 가져와야했습니다.

queryFactory
          .select(problem.id.id, problem.comment, problem.mainProblemImageUrl)
          .from(problem)
          .where(
                  containsProblemId(problemId),
                  containsName(comment),
                  inConceptTagIds(conceptTagIds)
          )
          .leftJoin(conceptTag).on(conceptTag.id.in(problem.conceptTagIds)).fetchJoin()
          .distinct()
          .transform(GroupBy.groupBy(problem.id.id).list(
                  Projections.constructor(ProblemSearchGetResponse.class,
                          problem.id.id,
                          problem.comment,
                          problem.mainProblemImageUrl,
                          GroupBy.set(
                                  Projections.constructor(ConceptTagSearchResponse.class,
                                          conceptTag.id,
                                          conceptTag.name
                                  )
                          )
                  )
          ));
  • 위 방식으로 WHERE 절에서 문항 ID, 이름, 개념 태그 리스트를 필터링한 후, LEFT JOIN과 FETCH JOIN을 사용해 problem과 conceptTag를 한 번의 쿼리로 조회했습니다.
  • 결과는 DTO로 변환하여 원하는 응답 형태로 매핑되도록 구성했습니다.

📝 테스트 사항

image

트러블 슈팅

  • 초기에 LEFT JOIN만 사용했을 때 Hibernate 로그에서는 단일 쿼리처럼 보였지만, 내부적으로 Lazy Loading이 작동하면서 N+1 문제가 해결되지 않는다는 것을 알았습니다.
  • 이를 해결하기 위해 FETCH JOIN을 추가하여 한 번의 쿼리로 conceptTag까지 조회하도록 개선했습니다.

@sejoon00 sejoon00 self-assigned this Feb 1, 2025
@sejoon00 sejoon00 added the For: API [이슈 대상] 외부 API label Feb 1, 2025
@seokbeom00
Copy link
Contributor

고생하셨습니다! fetch join을 통한 n+1 해결을 좀 찾아보면서 공부해보니 밑에 블로그가 유용했습니다. 읽어보시면 좋을 것 같습니다!

https://velog.io/@xogml951/JPA-N1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%B4%9D%EC%A0%95%EB%A6%AC

@sejoon00 sejoon00 merged commit 1ae8238 into develop Feb 3, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

For: API [이슈 대상] 외부 API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ 문항 검색 api 구현

2 participants

Comments