각기 다른 Base URL의 WebClient 인스턴스 사용하기
작성 일자 : 2024년 11월 03일
개요
WebClient
는 비동기 HTTP 호출을 위한 Spring Framework의 모듈입니다.
WebClient
는 WebClientConfig
를 작성하여 Configuration 할 수 있으며, baseUrl
을 설정하여 해당 URL로 요청을 보낼 수 있습니다.
실제 애플리케이션에서는 여러 서드파티 API를 사용하거나, 다양한 서비스를 호출할 때, 각기 다른 Base URL을 가지는 경우가 많습니다. 이번 포스팅에서는 여러 WebClient
빈을 각기 다룬 Base URL로 설정하는 방법에 대해 알아보겠습니다.
application.yml
에 여러 Base URL 설정하기
먼저, 각 서비스에 대한 URL을 application.yml
에 정의합니다.
service:
langchain:
url: http://langchain.com
image-processing:
url: http://image-processing.com
web-crawling:
url: http://web-crawling.com
WebClientConfig
작성하기
다음으로, WebClientConfig
를 작성하여 각 WebClient
빈을 생성합니다.
@Configuration
public class WebClientConfig {
@Value("${service.langchain.url}")
private String langchainBaseUrl;
@Value("${service.image-processing.url}")
private String imageProcessingBaseUrl;
@Value("${service.web-crawling.url}")
private String webCrawlingBaseUrl;
@Bean
public WebClient langchainWebClient() {
return WebClient.builder()
.baseUrl(langchainBaseUrl)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
@Bean
public WebClient imageProcessingWebClient() {
return WebClient.builder()
.baseUrl(imageProcessingBaseUrl)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
@Bean
public WebClient webCrawlingWebClient() {
return WebClient.builder()
.baseUrl(webCrawlingBaseUrl)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
}
서비스 계층에서 WebClient
사용하기
서비스 계층에서는 각 WebClient
빈을 주입받아 사용하며, @Qualifier
를 사용하여 각 WebClient
빈을 구분합니다.
@Service
@RequiredArgsConstructor
public class MyService {
@Qualifier("langchainWebClient")
private final WebClient langchainWebClient;
@Qualifier("imageProcessingWebClient")
private final WebClient imageProcessingWebClient;
@Qualifier("webCrawlingWebClient")
private final WebClient webCrawlingWebClient;
public void callLangchainService() {
langchainWebClient.get()
.uri("/api/v1/langchain")
.retrieve()
.bodyToMono(String.class)
.subscribe(response -> System.out.println("Response from Langchain: " + response));
}
public void callImageProcessingService() {
imageProcessingWebClient.get()
.uri("/api/v1/image-processing")
.retrieve()
.bodyToMono(String.class)
.subscribe(response -> System.out.println("Response from Image Processing: " + response));
}
public void callWebCrawlingService() {
webCrawlingWebClient.get()
.uri("/api/v1/web-crawling")
.retrieve()
.bodyToMono(String.class)
.subscribe(response -> System.out.println("Response from Web Crawling: " + response));
}
}
@Qualifier
어노테이션
@Qualifier
어노테이션은 동일한 타입의 빈이 여러 개 존재할 때, 어떤 빈을 주입할지 지정할 때 사용합니다.- 이를 통해
MyService
에서langchainWebClient
는service.langchain.url
에 설정된 Base URL을 가진WebClient
빈을 주입받고,imageProcessingWebClient
는service.image-processing.url
에 설정된 Base URL을 가진WebClient
빈을 주입받습니다.