Skip to content

[Feat] ES 장애 시 약 검색 MySQL 자동 폴백 #94

Description

@kangcheolung

📌 Description

GET /api/search/drugs(ES 기반 검색)가 ES 장애 시 그대로 예외를 던져 500이 나가고 있었다.
MySQL LIKE 기반 폴백 API(GET /api/drugs/search)는 이미 있는데, 전환이 프론트의 수동 재호출에
의존하고 있어 사용자 경험이 끊긴다. 서비스 레벨에서 자동으로 위임하도록 마감한다.

🎯 목표

  • ES 연결 실패·타임아웃 시 DrugSearchQueryService.search가 자동으로 MySQL LIKE 검색으로 전환
  • 우리가 던지는 검증 예외(빈 키워드 등)는 폴백 대상에서 제외 — 그대로 400 유지

🛠️ 작업 범위

DrugSearchQueryService.search의 ES 조회를 try-catch로 감싸고, org.springframework.dao.DataAccessException
(Spring Data가 ES 연결 실패/타임아웃 등을 변환하는 예외 계층)을 잡아 DrugInfoQueryService.searchByKeyword로 위임한다.
CallCareException은 이 계층과 무관해 그대로 전파된다.

✅ To-do

  • DrugSearchQueryService.search try-catch + 폴백 위임
  • 단위 테스트: ES 정상 시 폴백 미사용 / ES 예외 시 폴백 / 빈 키워드는 폴백 없이 즉시 예외 / trim된 키워드가 폴백에도 그대로 전달

📏 완료 조건 (DoD)

  • ES 접근 예외 시 /api/search/drugs가 500 대신 MySQL 결과로 200 응답
  • INVALID_PARAMETER는 폴백 없이 400 유지
  • ./gradlew test 통과

📒 기타

  • 로컬에서 ES를 존재하지 않는 포트로 돌려 실제 예외 타입을 확인함 — DataAccessResourceFailureException
    (DataAccessException의 하위 타입)으로 확인, catch 타입 설계가 실측과 일치
  • 부가 발견: ES가 부팅 시점에 이미 연결 불가 상태면 DrugSearchRepository 빈 생성 자체가 실패해
    스프링 컨텍스트 초기화가 통째로 죽는다(SimpleElasticsearchRepository 생성자가 인덱스 존재 여부를 확인).
    이번 수정은 "부팅 후 런타임 장애"만 다루며, "부팅 시점 장애"는 별도 문제라 범위 밖으로 둔다
    (현재는 인프라 레벨의 ES 메모리 제한+스왑으로 트리거 조건 자체를 줄여둔 상태)

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

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions