HttpHandler 생성과 동작

 

 

이전 포스팅에서 Netty 서버를 구동하기 위해 ..

Spring 은 project reactor 의 Netty, Reactor Netty 를 의존하고

 

Reactor Netty 의 HttpServer 를 생성하기 위해 HttpServer 에는

HttpServer::handler 메서드가 있는데

Spring 에서는 HttpServer::handler 의 파라미터(함수형 인터페이스)에 사용할 

구현체를 ReactorHttpHandlerAdapter 로 만들어 놨다.

 

그리고..

Spring 의 ReactorHttpHandlerAdapter 를 생성하기 위해서는

HttpHandler 를 주입받아야 하는 것을 확인했다.

 

 

이번 포스팅에서는

HttpHandler 의 생성과 동작에 대해 다뤄보겠다.

 

HttpHandler 생성

HttpHandler 는 HttpHandlerAutoConfiguration 에 의해 빈으로 등록된다.

WebHttpHandlerBuilder 에 applicationContext 메서드를 이용하여 생성된다.

 

applicationContext 메서드는 이전 포스팅에서 본 것 처럼

빈으로 등록된 WebHandler, WebFilter, WebExceptionHandler 등을

WebHttpHandlerBuilder 가 가지도록 한다.

 

 

WebHttpHandlerBuilder 의 build 메서드이다.

여기서 눈여겨 보고 싶은건 391, 392, 394 line 이다.

 

394 line..

HttpWebHandlerAdapter 는 생성자 파라미터(WebHandler) 를 받아 HttpHandler 를 생성하는 클래스이다.

HttpWebHandlerAdapter 는 WebHandler, HttpHandler 를 모두 구현한다.

HttpWebHandlerAdapter::handle 에서는..

HttpHandler::handle 의 파라미터인 ServerHttpRequest, ServerHttpResponse 를 가지고

WebHandler::handle 의 파라미터인 ServerWebExchange 을 만들고 있으며,

HttpWebHandlerAdapter 의 생성자에서 주입된 WebHandler 의 handle 메서드를 호출한다.

 

즉, 앞서 WebHttpHandlerBuilder::applicationContext 에서 받은 WebHandler 를 이용해

HttpHandler 를 생성한 것이다.

 

참고

HttpWebHandlerAdapter::handle 은..

Spring 과 Reactor Netty 의 adapter 인 ReactorHttpHandlerAdapter::apply 가 호출한다.

 

 

391 line..

WebHandler, WebFilter 를 이용해 FilteringWebHandler 를 생성하는데,

FilteringWebHandler 는 내부에서 DefaultWebFilterChain 을 생성한다.

FilteringWebHandler 는 WebHandler 를 구현한 클래스이며,

handle 메서드 호출 시, DefaultWebFilterChain 의 filter 메서드를 호출한다.

 

DefaultWebFilterChain 의 filter 메서드이다.

ServerWebExchange 를 파라미터로 받고

처리할 WebFilter 가 존재하면 WebFilter 를 수행하고

더이상 없으면 WebHandler 를 수행한다.

 

 

392 line..

ExceptionHandlingWebHandler 를 생성할 때도 WebHandler, WebExceptionHandler 가 필요한데

동작 방식은 FilteringWebHandler 와 비슷하다.

 

ExceptionHandlingWebHandler 의 handle 메서드이다.

ServerWebExchange 를 파라미터로 받고

try-catch 로 감싸서 WebHandler 의 handle 메서드를 호출해주고

예외가 발생하면 ExceptionHandler 가 처리하도록 publisher 를 만들어 수행시키고 있다.

 

 

391, 392, 394 line 정리

Decorator pattern 이 쓰였다.

원본 WebHandler 를 ConcreteComponent 로 하고

ExceptionHandlingWebHandler, FilteringWebHandler 는 Decorator 가 된다.

WebExceptionHandler, WebFilter 는

각각 ExceptionHandlingWebHandler, FilteringWebHandler 에 의해

WebExceptionHandler -> WebFilter -> WebHandler 순으로 수행하도록 구현되어있는 것이다.

최종 decorated 는 HttpWebHandlerAdapter 에 의해 HttpHandler 가 되고 리턴된다.

 

 

동작 방식을 구체적으로 알아보았다.

사용자가 사용할 땐..

Spring 에서는 front handler 의 역할을 하는 WebHandler 인 DispatcherHandler 를 

이미 등록하고 있으므로, 사용자는 DispatcherHandler 와 같이 묶여서 동작할

WebExceptionHandler, WebFilter 를 빈으로 등록만 해주면 된다...

'Spring Reactive Stack > Webflux' 카테고리의 다른 글

WebHandler 와 Spring  (0) 2024.03.10
WebHandler 와 Netty 의 관계  (0) 2024.03.09