Spring/스프링으로 시작하는 리액티브 프로그래밍

[Spring WebFlux] 함수형 엔드포인트(Functional Endpoint)

꾸준함. 2024. 9. 6. 21:24

서론

Spring WebFlux는 지난 게시글에서 소개했다시피 Spring MVC와 같은 애너테이션 기반 프로그래밍 모델과 함께 함수형 엔드포인트를 기반으로 하는 새로운 프로그래밍 모델을 지원합니다.

함수형 엔드포인트에서는 들어오는 요청을 라우팅하고, 라우팅 된 요청을 처리하며 결과 값을 응답으로 반환한 등의 모든 작업을 하나의 함수 체인에서 처리합니다.

이번 게시글에서는 함수형 엔드포인트 프로그래밍 모델에 대해 간단하게 알아보겠습니다.

 

HandlerFunction을 사용한 요청 처리

함수형 엔드포인트는 인입되는 요청을 처리하기 위해 HandlerFunction이라는 함수형 기반의 핸들러를 사용합니다.

서블릿 기반의 요청 처리는 Servlet 인터페이스의 service 메서드의 파라미터로 전달받는 ServletRequest, ServletResponse에 의해 이루어지는 반면 HandlerFunction은 요청 처리를 위한 ServerRequest 하나만 handle() 메서드의 파라미터로 전달받으며 요청 처리에 대한 응답은 Mono의 형태로 반환됩니다.

 

 

1. ServerRequest

  • HandlerFunction에 의해 처리되는 HTTP request
  • 객체를 통해 HTTP 헤더, 메서드, URI, 쿼리 파라미터에 접근할 수 있는 메서드 제공
  • HTTP Body 정보에 접근하기 위해 body(), bodyToMono(), bodyToFlux() 같은 별도 메서드 제공

 

2. ServerResponse

  • HandlerFunction 혹은 HandlerFilterFunction에서 반환되는 HTTP response
  • BodyBuilder와 HeadersBuilder를 통해 HTTP response body와 header 정보 추가 가능

 

요청 라우팅을 위한 RouterFunction

RouterFunction은 들어오는 요청을 해당 HandlerFunction으로 라우팅 해주는 역할을 수행하며 Spring MVC의 @RequestMapping 어노테이션과 동일한 기능을 수행합니다.

단, RouterFunction의 경우 요청을 위한 데이터 뿐만 아니라 요청 처리를 위한 동작인 HandlerFunction까지 RouterFunction의 파라미터로 제공한다는 차이점이 존재합니다.

 

 

애너테이션 기반 컨트롤러를 함수형 엔드포인트로 전환해 보는 예제

앞선 게시글에서 작성한 애너테이션 기반 컨트롤러는 다음과 같습니다.


 

위 컨트롤럴를 함수형 엔드포인트로 전환하기 위해서는 요청을 라우팅 해주는 라우터를 설정 파일로 등록하고 각 요청마다 처리할 HandlerFunction을 별도 클래스에 선언해줘야 합니다.

 

1. 라우터


 

2. Handler


 

참고

  • 스프링으로 시작하는 리액티브 프로그래밍 (황정식 저자)
반응형