외부 API 장애시 대응 방법
전략 패턴(Strategy Pattern) 을 활용하여, 외부 API(Naver 또는 Kakao)를 유연하고 안정적으로 사용할 수 있도록 설계되었습니다.

외부 지역 검색 API(Naver, Kakao)를 교체 가능하게 감싸는 전략 패턴(Strategy Pattern) 구현 입니다.
- 전략 패턴으로 외부 API 장애시 교체와 실패 대응이 구조적으로 분리되었습니다.
- 클라이언트는 SearchService만 호출하고, 어떤 외부 API를 호출할지는 내부 전략 교체로 캡슐화 합니다.
- 다이어그램의 SerchClient는 SearchStrategy와 동일한 역할의 인터페이스 입니다.
구성 요소와 책임
- SearchStrategy(SearchClient 인터페이스)
- 역할: 검색 행위의 공통 계약 정의.
- 구현체는 동일한 입력/출력을 보장해 상호 교체가 가능합니다.
- NaverSearchStrategy(NaverSearchClient)
- 역할: Naver 지역 검색 API 호출.
- 실패 시 예외를 던져 상위에서 대체 전략을 적용할 수 있도록 합니다.
- KakaoSearchStrategy(KakaoSearchClient)
- 역할: Kakao 지역 검색 API 호출.
- Naver 실패 시 폴백 용도로 사용됩니다.
- SearchContext
- 역할: 현재 적용 중인 전략을 보유하고 실행합니다.
- search(keyword, location): 현재 전략에 위임. 예외 발생 시 정책에 따라 대체 전략으로 교체 후 재시도.
- 전략 선택/교체라는 결정을 한 곳에 모아둠으로써 서비스 계층을 단순화.
- SearchService
- 역할: 외부에 공개되는 애플리케이션 서비스.
- 내부적으로 SearchContext를 사용하며 기본 전략을 Naver로 설정.
- 요청 처리 중 예외가 발생하면 Context에게 전략 교체(예: Kakao)와 재시도를 지시하고, 최종 결과를 반환합니다.
동작 흐름
- 정상 흐름
- 클라이언트가 SearchService.search(keyword, location)를 호출한다.
- SearchService는 SearchContext.search에 위임한다.
- SearchContext는 현재 전략을 통해 search를 수행한다.(NaverSearchStrategy)
- 성공 시 SearchResult를 그대로 반환한다.
- 실패 및 폴백 흐름
- Naver 전략 실행 중 예외 발생.
- SearchContext가 예외를 감지하고 전략을 Kakao로 교체
- 동일 파라미터로 Kakao 전략을 1회 재시도.
- 성공 시 결과 반환, 실패 시 예외를 상위로 전파.
- 설계 의도와 이점
- 결합도 감소: 서비스는 어떤 외부 API를 쓰는지 모른 채로 일관된 인터페이스에만 의존.
- 확장성: OCP를 충족하고 새로운 Open API를 추가해도 SearchStrategy 구현만 더하면 된다.
- 장애 회복: 1차 실패 시 대체 경로로 폴백해 가용성을 높인다.
- 테스트 용이성: 전략 교체 로직이 SearchContext에 모여 단위 테스트가 단순해진다.
확장 포인트