Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[feat] 자동완성 기능 #44

Merged
merged 16 commits into from
Jul 19, 2024
Merged

[feat] 자동완성 기능 #44

merged 16 commits into from
Jul 19, 2024

Conversation

Hoya324
Copy link
Member

@Hoya324 Hoya324 commented Jul 19, 2024

✅ 작업 내용

  1. QuestionRepositoryImpl 클래스 수정

    • QuestionRepositoryImpl 클래스는 QueryDSL을 사용하여 데이터베이스 쿼리를 실행합니다.
    • 주요 기능은 searchQuestionsOfCursorPagingByContent 메서드를 통해 페이징된 질문 목록을 검색하는 것입니다.

  2. searchQuestionsOfCursorPagingByContent 메서드 구현

    • 이 메서드는 검색어와 페이지네이션 커서를 사용하여 질문 목록을 검색합니다.
    • 커서 기반 페이지네이션을 구현하기 위해 cursorViewCount와 questionId를 사용합니다.
    • 이 값들이 null이거나 0일 경우 최대 값(Integer.MAX_VALUE 및 Long.MAX_VALUE)을 사용하여 처음 페이지를 가져오도록 설정합니다.
    • BooleanExpression을 사용하여 페이징 커서 조건을 만듭니다.
    • 쿼리를 실행하여 질문 목록을 가져오고, hasNext 플래그를 설정하여 다음 페이지가 있는지 확인합니다.
    • 마지막 질문의 viewCount와 id를 사용하여 다음 커서를 설정합니다.

  3. SliceQuestionResponse 클래스 생성

    • SliceQuestionResponse 클래스는 커서 기반 페이지네이션을 지원하기 위해 확장된 슬라이스 응답 클래스입니다.
    • 기본 SliceResponse 클래스를 확장하여 nextCursorViewCount와 nextQuestionId 필드를 추가합니다.

  4. 쿼리 메서드 분리 및 리팩토링

    • createBooleanTemplate 메서드: 검색어에 대한 Boolean 템플릿을 생성합니다.
    • createCursorPredicate 메서드: 커서 조건을 생성합니다.
    • fetchQuestions 메서드: 쿼리를 실행하여 질문 목록을 가져옵니다.
    • mapToResponse 메서드: 질문 엔티티를 DTO로 변환합니다.

🤔 고민했던 점과 해결 방법

  1. 커서 기반 페이지네이션 구현:
    • 커서 기반 페이지네이션을 구현하기 위해 cursorViewCount와 questionId를 사용해야 했습니다.
    • 처음 페이지를 가져올 때는 이 값들이 null 또는 0일 수 있으므로, 이를 최대 값으로 설정하여 처음 페이지를 가져오도록 했습니다.
    2. 커서 조건 생성:
    • 커서 조건을 생성할 때 viewCount와 questionId를 조합하여 정확한 페이지네이션을 구현해야 했습니다.
    • 동일한 viewCount를 가진 질문들 사이에서 중복되지 않도록 id를 추가 조건으로 사용했습니다.
    3. 응답 포맷 확장:
    • 기본 슬라이스 응답을 확장하여 커서 값을 포함하도록 했습니다.
    • 이를 통해 클라이언트가 다음 페이지를 요청할 때 필요한 커서 값을 쉽게 전달할 수 있게 했습니다.
    4. 쿼리 최적화:
    • fetchQuestions 메서드에서 필요한 데이터만 가져오도록 쿼리를 최적화했습니다.
    • pageSize + 1을 가져와서 hasNext 플래그를 설정하고, 필요시 마지막 요소를 제거했습니다.

🔊 도움이 필요한 부분

  • MySQL full text search의 test에서 match 함수가 적절하게 작동하지 않습니다. (match point가 0.0으로만 됨)
  • 배포 환경과 Local 환경은 문제가 없는 것을 확인한 상태입니다. 추후에 더 면밀히 확인 후 고쳐두겠습니다.

@Hoya324 Hoya324 self-assigned this Jul 19, 2024
@Hoya324 Hoya324 merged commit c18e9cc into develop Jul 19, 2024
@Hoya324 Hoya324 deleted the feat/자동완성-기능 branch July 19, 2024 13:15
@Hoya324 Hoya324 added 💡새로운 시도 새로운 시도를 기록한 pr입니다. 🎯리팩토링 기존의 기능을 디벨롭한 pr입니다. 🧪테스트 test를 추가한 pr입니다. and removed documentation labels Jul 20, 2024
@Hoya324 Hoya324 added this to the SW 경진대회 AI 부분 milestone Aug 5, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
🎯리팩토링 기존의 기능을 디벨롭한 pr입니다. 💡새로운 시도 새로운 시도를 기록한 pr입니다. 🧪테스트 test를 추가한 pr입니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant