이전 포스팅에서 Netty 서버를 구동하기 위해 ..
Spring 은 project reactor 의 Netty, Reactor Netty 를 의존하고
Reactor Netty 의 HttpServer 를 생성하기 위해 HttpServer 에는
HttpServer::handler 메서드가 있는데
Spring 에서는 HttpServer::handler 의 파라미터(함수형 인터페이스)에 사용할
구현체를 ReactorHttpHandlerAdapter 로 만들어 놨다.
그리고..
Spring 의 ReactorHttpHandlerAdapter 를 생성하기 위해서는
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 메서드이다.
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 를 빈으로 등록만 해주면 된다...
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' 카테고리의 다른 글