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

Spring WebClient는 Spring 5부터 도입된 비동기적이고 논블로킹 I/O를 기반으로 하는 웹 클라이언트입니다. 이전에는 RestTemplate을 사용하여 HTTP 호출을 처리했지만, WebClient는 좀 더 간결하고 효율적인 비동기 처리를 제공합니다.

이번 블로그 포스트에서는 Spring WebClient를 사용하여 비동기 HTTP 호출을 어떻게 처리하는지 살펴보겠습니다.

1. Maven 의존성 추가

pom.xml 파일에 다음 의존성을 추가해주세요.

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

2. WebClient Bean 등록

WebClient를 사용하기 위해 WebClient.Builder 클래스를 이용해 Bean을 등록해야 합니다. 스프링 부트의 @Configuration을 사용하여 다음과 같이 WebClient Bean을 등록할 수 있습니다.

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient() {
        return WebClient.builder().build();
    }
}

3. WebClient를 통한 비동기 HTTP 호출

이제 WebClient를 사용하여 비동기 HTTP 호출을 수행할 수 있습니다. 다음은 GET 메서드로 HTTP 요청을 보내는 예제 코드입니다.

@Autowired
private WebClient webClient;

public Mono<String> getHttpResponse() {
    return webClient.get()
                    .uri("https://api.example.com/users")
                    .retrieve()
                    .bodyToMono(String.class);
}

public void performHttpCall() {
    getHttpResponse()
        .subscribe(res -> {
            System.out.println("Response: " + res);
        });
}

getHttpResponse() 메서드는 WebClient를 사용하여 비동기 HTTP GET 요청을 보내고, 응답 결과를 문자열로 받아옵니다. 이후 subscribe() 메서드를 호출하여 비동기적으로 결과를 처리할 수 있습니다.

4. 예외 처리

WebClient를 사용하는 동안 발생하는 예외를 처리해야 합니다. onErrorResume() 메서드를 사용하여 예외를 처리하거나, onErrorReturn() 메서드를 사용하여 기본값을 반환하는 방식으로 처리할 수 있습니다. 예를 들어, 다음은 예외 발생 시 기본값을 반환하는 예제 코드입니다.

public Mono<String> getHttpResponse() {
    return webClient.get()
                    .uri("https://api.example.com/users")
                    .retrieve()
                    .bodyToMono(String.class)
                    .onErrorReturn("Error occurred");
}

위의 코드에서는 bodyToMono() 메서드를 호출한 후 onErrorReturn() 메서드를 체인으로 연결하여 예외가 발생한 경우 “Error occurred” 문자열을 반환합니다.

결론

이처럼 Spring WebClient를 사용하면 비동기적이고 효율적인 HTTP 호출을 처리할 수 있습니다. WebClient를 활용하여 웹 애플리케이션의 성능을 향상시키고, 응답 시간을 단축시킬 수 있습니다.

더 자세한 내용은 공식 Spring documentation을 참고하시기 바랍니다.