오늘은 Spring Boot 3.2에서 RestClient와 HTTP Interface를 활용하여 외부 API를 호출하는 방법에 대해 알아보려고 합니다.
최근에는 RestTemplate이 유지보수 모드로 전환되면서, 대안으로 WebClient를 사용하는 추세입니다.
하지만 WebClient를 사용하기 위해서는
implementation 'org.springframework.boot:spring-boot-starter-webflux'
의 추가적인 의존성이 필요하다는 문제점이 있습니다.
이러한 문제를 해결하기 위해, 이번에는 RestClient와 HTTP Interface의 사용법을 살펴보겠습니다.
RestClient는 최신의 API를 제공하는 동기식 HTTP 클라이언트입니다. 자바 객체에서 HTTP 요청으로 편리하게 변환하고 HTTP 응답에서 객체를 생성할 수 있도록 HTTP 라이브러리에 대한 추상화를 제공합니다.
HTTP Interface HTTP 서비스를 자바 인터페이스로 정의하고, HTTP 교환 메소드를 사용할 수 있는 기능을 제공합니다. 그럼 이렇게 정의된 인터페이스를 구현하는 프록시를 생성할 수 있는데요, 이 프록시가 실제로 HTTP 교환을 수행하게 됩니다.
implementation 'org.springframework.boot:spring-boot-starter-web'
먼저 RestClient와 HTTP Interface 를 사용하기 위해 spring-boot-starter-web 의존성을 추가해 줍니다. Web 프로젝트를 하기위한 필수적인 의존성 이기 때문에 부담없이 의존성을 추가할 수 있습니다.
먼저 HTTP Interface를 사용하기 앞서 HTTP Interface를 호출하면 요청될 구현체를 만들겠습니다.
저는 다음과 같이 구현체를 만들었는데요 진행중인 프로젝트에서 알라딘 서점 api 를 호출하기 때문에 baseUrl이 http://www.aladin.co.kr/ttb/api 형식으로 들어가게 됩니다.
RestClient 객체를 생성하고, 기본 URL을 설정해줍니다. 이 RestClient는 Http 요청을 보내는 역할을 합니다.
생성된 RestClient를 이용하여 RestClientAdapter를 생성합니다. 이 Adapter는 RestClient의 기능을 확장하는 역할을 합니다.
RestClientAdapter를 이용하여 HttpServiceProxyFactory 객체를 생성합니다. 이 Factory는 Http 서비스의 프록시 객체를 생성하는 역할을 합니다.
마지막으로, HttpServiceProxyFactory를 이용하여 AladinComponent 타입의 클라이언트 객체를 생성합니다.
이제는 HTTP Interface로 작성된 AladinComponent 인테페이스를 알아보겠습니다.
HTTP 인터페이스와 그 인터페이스의 교환 메서드에 적용할 수 있는 루트 어노테이션입니다. 이 어노테이션이 인터페이스 레벨에 적용되면, 모든 교환 메서드에 적용됩니다.
HTTP GET requests 를 호출하기 위한 어노테이션 입니다.
요청 매개 변수 이름과 값을 추가합니다.
이제 서비스 단에서 실제 Http Interface를 호출해 보겠습니다. HTTP Interface를 작성한 AladinComponet를 의존성으로 주입 받습니다.
aladinComponent 에서 findAllByQuery를 호출하면 먼저 RestClientConfig 에서 주입한 baseUrl http://www.aladin.co.kr/ttb/api 가 앞으로 오게됩니다.
그 후 @GetExchange에 작성해준 /ItemSearch.aspx 가 추가되어 http://www.aladin.co.kr/ttb/api/ItemSearch.aspx 형태로 변하게 됩니다.
마지막으로 @RequestParam 으로 작성해둔 TTBKey, Query, Output, Start, Version 이 추가되어 http://www.aladin.co.kr/ttb/api/ItemSearch.aspx?TTBKey=aladinKey&Query=Title&Output=JS&Start=1&Version=20131101 형태로 api 요청을 보내게 됩니다.
응답은 String 형태로 받고 있기 때문에 저는 JSONObject를 이용하여 Json으로 변환한 뒤 이후 코드에서 사용해 줬습니다.
APi 요청시 아래와 같은 어노테이션을 활용하여 요청할 수 있고
@GetExchange for HTTP GET requests
@PostExchange for HTTP POST requests
@PutExchange for HTTP PUT requests
@PatchExchange for HTTP PATCH requests
@DelectExchange for HTTP DELETE requests
추가적인 정보를 전달하기 위해서는 아래의 어노테이션을 활용할 수 있습니다.
@RequestHeader
@PathVariable
@RequestBody
@RequestParam
@CookieValue
처음 블로그를 작성하여 부족한 점이 많습니다. 잘못된점이나 부족한점이 있으면 말해 주세용!!