Bldev's Blog

스프링 · 웹플럭스

[스프링] 스프링 웹플럭스 Webflux.fn

2023. 2. 12.

프론트 컨트롤러에서 요청/응답 처리 방법

스프링 웹 모듈을 사용하여 웹 애플리케이션을 구현하는 경우 프론트 컨트롤러 클래스의 핸들러 메서드에서 요청/응답을 처리하기 객체는 다음과 같다.

  • Servlet 기반 Spring MVC 컨트롤러: HttpServletRequest/HttpServletResponse
  • Spring Webflux 컨트롤러: ServerHttpRequest/ServerHttpResponse
  • Spring Webflux의 함수형 프로그래밍 모델을 위한 Webflux.fn: ServerRequest/ServerResponse

요청 값 추출

  • 요청 패스 추출
    GET("/{*path}") { request ->
      val requestPath = request.pathVariable("path").substring(1)
    }
    
  • 요청 쿼리 추출
    GET("/{*path}") { request ->
      val requestUri = request.uri()
    }
    

응답 처리

  • 응답 헤더 설정
    val responseHeaders = HttpHeaders()
    responseHeaders.add("Content-Type", "application/json; charset=UTF-8")
    ServerResponse.ok()
            .headers { headers -> headers.addAll(responseHeaders) }
            .body(result, String::class.java)
    }
    

CORS 활성화

GET("/").and(
  CrossOrigin("http://localhost:3000") 
  ) { request ->
      val requestUri = request.uri()
}

코루틴

  • RouterFunctionDsl 내에서 코루틴 사용
    suspend fun routerForProxy(): RouterFunction<ServerResponse> {
      return coRouter {
          GET("/") { request ->
              fetchData(request)
          }
    }
    
    suspend fun fetchDate(request: ServerRequest): ServerResponse {
      return ServerResponse.ok()
              .headers { headers -> headers.addAll(responseHeaders) }
              .body(result, String::class.java)
    }
    

참고