외부 API 호출 #53
Replies: 4 comments
-
|
외부 API를 호출하는 방식은 크게 RestTemplate, WebClient, RestClient, 그리고 선언형 HTTP 인터페이스@HttpExchange나 Feign 정도가 있습니다. RestTemplate은 오래 써온 동기 방식이지만 Spring 7에서 폐기가 공식 예고돼 7.1에서 deprecated, 8.0에서 제거 예정이라 신규 프로젝트에서는 권장되지 않습니다. 그래서 동기 흐름에서 외부 API 하나를 호출하는 일반적인 상황이라면 RestClient를 선호하는데, RestTemplate의 후속이면서 fluent API를 제공하고, 호출 지점이 많아 보일러플레이트를 줄이고 싶을 땐 선언형 인터페이스나 Feign이 유리하지만, 에러 핸들링이나 타임아웃을 세밀하게 제어해야 하는 결제 같은 도메인에선 RestClient가 더 다루기 좋다고 생각합니다. 외부 API 호출 테스트의 경우 특히나 무엇을 검증하는지에 따라 계층을 나누는 것이 좋다고 생각합니다. 서비스 계층 테스트는 우리 비즈니스 로직이 맞는지를 신뢰하고 싶은 영역이라, 외부 호출 포트를 Mock으로 대체해 HTTP는 전혀 건드리지 않고 금액 검증이나 예외 변환 같은 로직만 결정적으로 검증합니다. 반면 직렬화,인증 헤더,상태코드 매핑, 타임아웃처럼 "실제 통신이 의도대로 동작하는가"는 Mock으로 갈아끼우는 순간 통째로 건너뛰는 부분이라, MockWebServer나 WireMock으로 토스인 척하는 가짜 서버를 세워 어댑터 통합 테스트로 따로 확인합니다. 특히 타임아웃은 응답을 일부러 지연시켜 예외 종류뿐 아니라 우리가 설정한 시간만큼만 기다렸다 끊기는지 경과 시간까지 단언하는 게 의미 있으며, 실제 외부 환경에 직접 붙는 테스트는 깨지기 쉽고 외부 의존성이 커서 CI 자동화보단 수동 확인용으로 두는 편이 안정적이라고 생각합니다. |
Beta Was this translation helpful? Give feedback.
-
RestTemplate
RestClient
WebClient
OpenFeign와 @HttpExchange
보호하려는 대상에 외부 API 호출(외부 리소스 진입점)이 필요하다면, 해당 부분을 모킹하고 테스트 코드를 작성 보호하려는 대상이 외부 리소스 진입점(ex
|
Beta Was this translation helpful? Give feedback.
-
|
외부 API를 호출하는 방식으로는 RestTemplate, RestClient, WebClient와 선언형 HTTP 클라이언트가 있습니다. 1. RestTemplate스프링에서 오랫동안 사용된 동기 방식의 HTTP 클라이언트입니다. 사용법이 단순하다는 장점이 있지만, 스프링에서 더이상 개선지원을 하지 않고 제거가 예정되어 있기 때문에 권장되지 않습니다. 또한 예외 처리를 직접 처리해야 한다는 특징이 있습니다. 2. RestClientRestTemplete의 후속 API로 메서드 체이닝방식의 Fluent API를 제공하여 가독성이 좋습니다. 내부 메서드인 3. WebClientSpring WebFlux에서 제공하는 클라이언트입니다. 비동기와 논블로킹 방식을 지원하기 때문에, 높은 동시성이 필요한 환경에서 큰 장점을 갖습니다. 다만, 작은 스프링 프로젝트에서 단순히 외부 API를 한두번 호출하는 경우 오버엔지니어링이 될 수 있습니다. 4. OpenFeign 및 @HttpExchange이 두 클라이언트는 선언형 HTTP 클라이언트입니다. 말 그대로, 인터페이스만 정의하면 자동으로 구현체가 생성되어 보일러플레이트를 줄일 수 있습니다. 다만 이런이유로 내부 구현을 쉽게 커스텀할 수 없습니다. 따라서 결제와 같은 도메인에서 타임아웃이나, 예외 처리 정책을 세밀하게 관리해야하는 경우 RestClient가 더 적절합니다. 테스트 전략외부 API와 연결되는 어뎁터 레이어에 대한 통합테스트가 필요하다고 생각합니다. 실제 HTTP 요청과 응답이 의도대로 동작하는지 검증하기 위해, 가짜 서버를 구축하여 의도된 어플리케이션의 정책이 연결과정에서 실행되는지 검증할 필요가 있다고 생각합니다. 실제 외부 서버를 사용한다면, 네트워크와 외부 서비스의 가용성에 영향을 받기 때문에, CI환경에서 테스트하기에는 불안정합니다. 따라서, 수동으로 검증하거나, 스테이징환경에서 제한적으로 진행하는 것이 올바르다고 생각합니다! |
Beta Was this translation helpful? Give feedback.
-
1. 외부 API 호출을 구현하는 다양한 방식에 대해서 비교 및 서술 해주세요.대표적으로
외부 API 호출을 구현할 때는 단순히 요청을 보내는 것뿐 아니라 2. 외부 API 호출에 대한 테스트 코드는 어떻게 작성하는게 좋을지 서술해주세요테스트 코드는 실제 외부 API에 의존하지 않는 것이 좋다고합니다! 서비스 로직 테스트에서는 외부 API 클라이언트를 Mock으로 대체해, 성공/실패 응답에 따라 우리 서비스가 올바르게 동작하는지 검증합니다. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
외부 API 호출을 구현하는 다양한 방식에 대해서 비교 및 서술 해주세요.
또한, 외부 API 호출에 대한 테스트 코드는 어떻게 작성하는게 좋을지 서술해주세요
Beta Was this translation helpful? Give feedback.
All reactions