You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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