[java] Spring WebClient를 사용한 비동기 HTTP 호출 처리 방법

Spring WebClient는 Spring 5부터 도입된 비동기 HTTP 호출을 처리하기 위한 라이브러리입니다. WebClient를 사용하면 블로킹하지 않고 비동기적으로 HTTP 요청을 보낼 수 있으며, 응답을 기다리는 동안 다른 작업을 수행할 수 있습니다. 이번 포스트에서는 Spring WebClient를 사용하여 비동기 HTTP 호출을 처리하는 방법을 알아보겠습니다.

의존성 추가

WebClient를 사용하기 위해서는 먼저 Spring Web 모듈의 의존성을 추가해야 합니다. Maven을 사용하는 경우 pom.xml 파일에 다음과 같이 의존성을 추가합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Gradle을 사용하는 경우 build.gradle 파일에 다음과 같이 의존성을 추가합니다.

implementation 'org.springframework.boot:spring-boot-starter-webflux'

WebClient 사용하기

WebClient를 사용하여 비동기 HTTP 호출을 처리하는 방법은 크게 세 가지 단계로 나눌 수 있습니다.

  1. WebClient 인스턴스 생성
  2. HTTP 요청 구성
  3. 응답 처리

다음은 각 단계별로 상세히 알아보겠습니다.

WebClient 인스턴스 생성

WebClient 인스턴스를 생성하기 위해서는 WebClient.builder() 메서드를 사용합니다. 일반적으로는 기본적인 설정만으로도 사용할 수 있지만, 필요에 따라서는 특정 설정을 추가하여 커스터마이징할 수도 있습니다. 예를 들어, baseUrl을 지정하거나 ExchangeStrategies를 설정할 수 있습니다.

WebClient WebClient = WebClient.builder().build();

HTTP 요청 구성

HTTP 요청을 보내기 위해서는 WebClient 인스턴스의 여러 메서드를 사용하여 요청을 구성해야 합니다. 예를 들어, get(), post(), put(), delete() 등의 메서드를 사용하여 각각의 HTTP 메서드에 해당하는 요청을 생성할 수 있습니다.

WebClient.RequestHeadersSpec<?> request = WebClient
    .create()
    .get()
    .uri("https://api.example.com/users/{userId}", userId)
    .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);

위 예제에서는 GET 메서드를 사용하여 https://api.example.com/users/{userId} URL로 요청을 보내고, userIdaccessToken 값을 URI 변수와 헤더에 추가하였습니다.

응답 처리

HTTP 요청을 보내고 응답을 받기 위해서는 retrieve() 메서드를 호출해야 합니다. 이 메서드는 Mono<ClientResponse> 형태의 응답을 반환하며, flatMap() 메서드를 사용하여 응답을 처리할 수 있습니다. 예를 들어, JSON으로 받은 응답을 POJO 클래스로 매핑하는 경우 다음과 같이 처리할 수 있습니다.

Mono<User> userMono = WebClient
    .create()
    .get()
    .uri("https://api.example.com/users/{userId}", userId)
    .retrieve()
    .bodyToMono(User.class);

userMono.subscribe(user -> {
    // 응답 처리
}, error -> {
    // 에러 처리
});

위 예제에서는 bodyToMono() 메서드를 사용하여 응답을 Mono<User>로 매핑하고, subscribe() 메서드를 호출하여 응답 데이터를 처리합니다. 성공적으로 응답을 받은 경우 user -> {} 람다 표현식이 호출되며, 오류가 발생한 경우 error -> {} 람다 표현식이 호출됩니다.

결론

이번 포스트에서는 Spring WebClient를 사용하여 비동기 HTTP 호출을 처리하는 방법을 알아보았습니다. WebClient를 사용하면 블로킹하지 않고 비동기적으로 HTTP 요청을 보낼 수 있으며, 응답을 처리하는 동안 다른 작업을 수행할 수 있습니다. WebClient의 강력한 기능을 활용하여 손쉽게 비동기 HTTP 호출을 구현해보세요.

참고 문서: Spring WebClient 공식 문서