Skip to content

[ Search ] 검색 성능·개인화 추천·N+1 관측 고도화 #63

Description

@RosieOh

🧑‍💻 오늘의 개발하면서 생긴 크고 작은 이슈사항을 기록해주세요

💚 어떤 기능인가요?

공공데이터 연동(#61)으로 시설·정책 데이터가 늘어나면서 기존 조회 방식의 한계가 드러났습니다. 검색·추천·관측을 함께 손봅니다.

위치 검색이 아예 동작하지 않음findWithinRadius 가 존재하지 않는 테이블 care_facilities 를 참조합니다(실제는 TBL_CARE_FACILITIES). 게다가 전체 행에 대해 Haversine 을 계산해 인덱스를 타지 못합니다.

키워드 검색이 LIKE '%키워드%' — 선행 와일드카드라 인덱스를 쓸 수 없고, 관련도 정렬도 없습니다.

챗봇이 단일 키워드로만 검색 — 조사가 붙은 채로("어린이집은") 검색해 매칭률이 낮습니다.

개인화 없음 — 자녀 정보를 받아두고도 추천에 쓰지 않습니다. 유치원생 부모에게 신생아 정책이 그대로 노출됩니다.

N+1 을 추측으로 판단 중 — 어느 엔드포인트가 몇 건의 쿼리를 쏘는지 측정할 수단이 없습니다.

동기화 대상에 유치원이 없음FacilityType.KINDERGARTEN 이 정의돼 있는데 이 값을 채우는 경로가 하나도 없어 유치원 검색은 항상 0건입니다.

✅ To Dos

  • 바운딩 박스로 후보를 좁힌 뒤 거리 계산, 위경도 복합 인덱스 추가(V4__search_indexes.sql), 잘못된 테이블 참조 수정
  • MATCH ... AGAINST 전문 검색 도입 + 짧은 키워드·연산자 문자·미지원 DB 는 LIKE 폴백(FullTextSearchSupport)
  • 챗봇 RAG 다중 키워드(길이 내림차순 3개) + 한국어 조사 제거
  • 규칙 기반 개인화 추천 — 자녀 월령 × 대상 연령, 거주지 × 대상 지역, 마감 임박도 점수화, 추천 근거 동봉(GET /policies/recommendations)
  • 요청별 쿼리 수 측정 → 임계치 초과 시 경고(app.monitoring.query-count.enabled, 기본 비활성)
  • /policies/recommendations·/policies/bookmarks/policies/* permitAll 에 걸려 있던 인가 구멍 수정
  • 공공데이터 지원대상 자유 텍스트에서 대상 연령을 개월로 환산(AgeRangeParser) — 동기화 정책이 개인화에서 제외되던 문제 해소
  • 전국 유치원 표준데이터 동기화 추가, 고유 코드 없는 데이터셋은 이름+주소 해시로 멱등 보장
  • 페이징 수집 절차 공통화(PagedSyncTemplate) + 첫 페이지 전건 실패 시 매핑 불일치로 조기 중단
  • 여러 줄 주석 한 줄로 정리, @Operation description 축약

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions