내부 동작 방식
동작 흐름
클라이언트 요청부터 응답을 반환하기 까지 과정이 Mono/Flux의 Operator chain으로 구성된 하나의 Reactor Sequence로 구성되어 있다고 생각하면 된다.
클라이언트 요청이 들어오면 서버 엔진을 거쳐 HttpHandler로 전달된다.
ServerWebExchange(ServerHttpRequest, ServerHttpResponse를 포함)를 생성하여 WebFilter 체인으로 전달한다.
ServerWebExchange 객체는 WebFilter에서 전처리 과정을 거친다.
이후 DispatcherHandler(WebHandler 인터페이스의 구현체이며 DispatcherServlet과 유사함)에 전달되어 HandlerMapping List를 원본 Flux의 source로 전달받는다.
ServerWebExchange 처리를 위한 Handler를 조회한 후 HandlerAdapter에 핸들러 호출을 위임한다.
Controller 혹은 HandlerFunction 형태의 핸들러에서 요청을 처리한 후 응답 데이터를 포함한 Mono/Flux를 반환한다.
응답 데이터를 처리할 HandlerResultHandler에게 넘긴 후 최종 응답이 반환되도록 한다.
메서드가 호출을 통해 반환된 Reactor Sequence는 즉시 작업을 처리하지 않는다.
컴포넌트
HttpHandler
http request, response를 처리하기 위한 handle 메서드 하나만을 가진다.
HttpWebHandlerAdapter 클래스는 이 인터페이스의 구현체로, ServerWebExchange 객체를 생성하여 WebHandler를 호출한다.
WebFilter
서블릿 필터와 유사하게 핸들러가 직접 요청을 처리하기 전, 보안, 세션 타임아웃 등의 전처리 과정을 여러 필터들을 거치며 수행되도록 한다.
어노테이션 기반 요청 핸들러와 함수형 기반 요청 핸들러 모두에 적용된다.
HandlerFilterFunction
함수형 기반 요청 핸들러에만 적용할 수 있는 필터이다.
WebFilter 구현체는 스프링 빈으로 등록해야 하는 반면, HandlerFilterFunction 구현체는 함수형 기반 요청 핸들러에 함수 파라미터 형태로 전달되므로 스프링 빈에 등록하지 않아도 된다.
DispatcherHandler
객체 초기화 과정에서 ApplicationContext를 통해 스프링 빈으로 등록된 HandlerMapping, HandlerAdapter, HandlerResultHandler 컴포넌트를 찾아두고, 요청이 들어오면 알맞은 컴포넌트에 위임한다.
HandlerMapping
getHandler 메서드를 제공하여 ServerWebExchange를 처리할 핸들러 객체를 얻을 수 있도록 한다.
HandlerAdapter
HandlerMapping으로부터 얻은 핸들러를 직접 호출하여 얻은 결과인
Mono<HandlerResult>를 반환한다.
Last updated