[WebClient] Configuration Reactor Netty
Reactor Netty 란?
Reactor Netty는 Reactor 프로젝트 일부로서 Reactor Core와 함꼐 사용되는 Non-blocking I/O 네트워크 프레임워크입니다. 이 프레임워크는 SpringFramework와 함께 사용되며, 웹 애플리케이션의 클라이언트 및 서버 사이드의 비동기 HTTP 가능하게 합니다
Reactor Netty 를 커스텀하는 이유?
From ChatGPT 3.5
Reactor Netty 설정을 하는 이유는 여러 가지가 있을 수 있습니다. 주요한 이유 중 일부는 다음과 같습니다:
1. 성능 및 효율성 향상: Reactor Netty를 튜닝하면 네트워크 연결 및 데이터 전송에 대한 성능을 최적화할 수 있습니다. 설정을 조정하여 응답 시간을 단축하고 네트워크 사용량을 줄일 수 있습니다.
2. 보안 강화: SSL/TLS 설정을 통해 보안을 강화할 수 있습니다. Reactor Netty를 사용하면 HTTPS 통신을 설정하고 안전한 데이터 전송을 보장할 수 있습니다.
3. 유연성 제공: Reactor Netty를 사용하면 다양한 네트워크 요구 사항에 대응할 수 있습니다. 커스텀 TCP/IP 설정, 프록시 구성, 요청 및 응답의 인터셉팅 및 수정 등을 수행할 수 있습니다.
4. 애플리케이션 요구 사항 충족: 특정한 애플리케이션의 요구 사항에 따라 Reactor Netty를 구성할 수 있습니다. 예를 들어, 특정 포트로의 연결 설정, 요청 및 응답의 변조, 헤더 조작 등을 할 수 있습니다.
5. 디버깅 및 모니터링: Reactor Netty 설정을 통해 네트워크 동작을 추적하고 디버그할 수 있는 기능을 제공합니다. 연결 로그, 요청 및 응답 내용의 추적 등을 통해 문제 해결 및 성능 튜닝을 수행할 수 있습니다.따라서 Reactor Netty 설정은 애플리케이션의 요구 사항을 충족시키고 성능을 향상시키기 위해 필요한 중요한 단계입니다.
Resource 설정
리소스가 뭐냐? 왜 설정하냐?....?
더 공부가 필요한 부분이다..
1. 전역 리소스 설정
리소스를 생성하는 방법은 두가지 이며, 전역 리소스와 독립적인 리소스를 생성할 수 있습니다.
HttpClient는 기본적으로 전역 Reactor Netty 리소스에 연결되어 있습니다. 이 방식이 권장되는 모드이며, 이벤트 루프 동시성을 위해 고정된 공유 리소스를 선호합니다. 이렇게 함으로써 전역 리소스는 프로세스가 종료될 때까지 활성 상태를 유지합니다. 그러므로 서버와 프로세스가 함께 종료되는 경우에는 명시적인 종료가 필요하지 않습니다
그러나 서버가 프로세스 내에서 시작 또는 중지될 수 있는 경우(예: WAR로 배포된 Spring MVC 어플리케이션), 아래와 같이 ReactorResourceFactory 타입의 Spring 관리 빈을 선언하여 Spring ApplicationContext가 닫힐 때 Reactor Netty 전역 리소스가 종료되도록 설정할 수 있습니다:
@Bean
public ReactorResourceFactory reactorResourceFactory() {
return new ReactorResourceFactory();
}
이렇게 함으로써 Spring의 ApplicationContext가 종료될 때 Reactor Netty 전역 리소스도 함께 종료됩니다.
2. 독립적인 리소스 설정
ReactorClientHttpConnector 생성자를 사용하여 리소스 팩토리와 함께 커넥터를 생성한 다음, 이를 WebClient.Builder에 연결합니다. 그러나 Reactor Netty 전역 리소스에 참여하지 않도록 선택할 수도 있습니다. 이 모드에서는 모든 Reactor Netty 클라이언트 및 서버 인스턴스가 공유 리소스를 사용하도록 보장해야 합니다.
아래의 예시를 통해 살펴봅시다:
@Bean
public ReactorResourceFactory resourceFactory() {
ReactorResourceFactory factory = new ReactorResourceFactory();
factory.setUseGlobalResources(false);
return factory;
}
@Bean
public WebClient webClient() {
Function<HttpClient, HttpClient> mapper = client -> {
// 추가적인 사용자 정의...
};
ClientHttpConnector connector =
new ReactorClientHttpConnector(resourceFactory(), mapper);
return WebClient.builder().clientConnector(connector).build();
}
위 코드에서는 `resourceFactory()` 메서드를 통해 리소스 팩토리를 설정하고, `webClient()` 메서드에서 WebClient를 생성하고 커넥터에 리소스 팩토리를 설정합니다. 이렇게 함으로써 Reactor Netty 전역 리소스에 참여하지 않고 독립적인 리소스를 사용할 수 있습니다.