📌 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
📏 완료 조건 (DoD)
- ES 접근 예외 시
/api/search/drugs가 500 대신 MySQL 결과로 200 응답
INVALID_PARAMETER는 폴백 없이 400 유지
./gradlew test 통과
📒 기타
- 로컬에서 ES를 존재하지 않는 포트로 돌려 실제 예외 타입을 확인함 —
DataAccessResourceFailureException
(DataAccessException의 하위 타입)으로 확인, catch 타입 설계가 실측과 일치
- 부가 발견: ES가 부팅 시점에 이미 연결 불가 상태면
DrugSearchRepository 빈 생성 자체가 실패해
스프링 컨텍스트 초기화가 통째로 죽는다(SimpleElasticsearchRepository 생성자가 인덱스 존재 여부를 확인).
이번 수정은 "부팅 후 런타임 장애"만 다루며, "부팅 시점 장애"는 별도 문제라 범위 밖으로 둔다
(현재는 인프라 레벨의 ES 메모리 제한+스왑으로 트리거 조건 자체를 줄여둔 상태)
📌 Description
GET /api/search/drugs(ES 기반 검색)가 ES 장애 시 그대로 예외를 던져 500이 나가고 있었다.MySQL LIKE 기반 폴백 API(
GET /api/drugs/search)는 이미 있는데, 전환이 프론트의 수동 재호출에의존하고 있어 사용자 경험이 끊긴다. 서비스 레벨에서 자동으로 위임하도록 마감한다.
🎯 목표
DrugSearchQueryService.search가 자동으로 MySQL LIKE 검색으로 전환🛠️ 작업 범위
DrugSearchQueryService.search의 ES 조회를try-catch로 감싸고,org.springframework.dao.DataAccessException(Spring Data가 ES 연결 실패/타임아웃 등을 변환하는 예외 계층)을 잡아
DrugInfoQueryService.searchByKeyword로 위임한다.CallCareException은 이 계층과 무관해 그대로 전파된다.✅ To-do
DrugSearchQueryService.searchtry-catch + 폴백 위임📏 완료 조건 (DoD)
/api/search/drugs가 500 대신 MySQL 결과로 200 응답INVALID_PARAMETER는 폴백 없이 400 유지./gradlew test통과📒 기타
DataAccessResourceFailureException(
DataAccessException의 하위 타입)으로 확인, catch 타입 설계가 실측과 일치DrugSearchRepository빈 생성 자체가 실패해스프링 컨텍스트 초기화가 통째로 죽는다(
SimpleElasticsearchRepository생성자가 인덱스 존재 여부를 확인).이번 수정은 "부팅 후 런타임 장애"만 다루며, "부팅 시점 장애"는 별도 문제라 범위 밖으로 둔다
(현재는 인프라 레벨의 ES 메모리 제한+스왑으로 트리거 조건 자체를 줄여둔 상태)