개발자는 기록이 답이다

패스트캠퍼스 환급챌린지 27일차 미션 (2월 27일) :  Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기 본문

패스트캠퍼스

패스트캠퍼스 환급챌린지 27일차 미션 (2월 27일) :  Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기

slow-walker 2024. 2. 27. 23:16

WebFilter

  • webHandler에서X-Custom-Name헤더를 이용해서 name에 접근
  • name이 없다면 400 status 응답을 반환
  • WebHandler를실행하기 서서 실행

    webHandler에게전달될 ServerWebExchange와 다filter 혹은 handler를 실행하기 위한 WebFilterChain

    chain.filter를호출하여,요청을다filter게 넘기거나 handler를 실행 가능

 

WebFilter는 Spring WebFlux에서 HTTP 요청 및 응답을 조작하고 필터링하는 역할을 하는 인터페이스입니다. 이를 사용하여 HTTP 요청이나 응답에 대한 다양한 작업을 수행할 수 있습니다. Spring WebFlux는 비동기 및 리액티브 프로그래밍에 기반한 프레임워크이므로, WebFilter는 이러한 비동기 환경에 적합하게 설계되어 있습니다.

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyWebFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        // 여기에 원하는 작업을 수행
        System.out.println("Executing WebFilter");

        // 다음 필터 또는 핸들러로 체인 전파
        return chain.filter(exchange);
    }
}
 

 

위의 예시에서 MyWebFilter는 WebFilter 인터페이스를 구현하고 있습니다. 여기에서 filter 메서드 내에서 HTTP 요청 및 응답에 대한 원하는 작업을 수행할 수 있습니다. 이 메서드는 ServerWebExchange를 통해 현재 요청과 응답에 대한 정보에 접근할 수 있습니다.

주의할 점은 filter 메서드 내에서 chain.filter(exchange)을 호출하여 다음 필터 또는 핸들러로 체인을 전파해주어야 합니다. 이를 통해 여러 개의 WebFilter가 순차적으로 적용될 수 있습니다.

@Order(Ordered.HIGHEST_PRECEDENCE) 어노테이션은 필터의 실행 순서를 조절하는데 사용됩니다. Ordered.HIGHEST_PRECEDENCE는 최우선 순위로 설정되어, 다른 필터보다 먼저 실행되게 합니다.

이를 통해 WebFilter는 예를 들어 로깅, 보안 검사, 헤더 조작 등과 같은 다양한 요구사항에 활용될 수 있습니다.

 

WebExceptionHandler

WebExceptionHandler를 설정하지 않으면 WebHandler에서 익셉션이 발생했다면 500에 대한 응답이 내려질 것입니다.

WebExceptionHandler는 Spring WebFlux에서 예외 처리를 담당하는 인터페이스입니다. 이를 통해 발생한 예외를 처리하고, 클라이언트에게 적절한 응답을 반환할 수 있습니다. 기본적으로 예외가 발생하면 Spring WebFlux는 500 Internal Server Error와 같은 기본 에러 응답을 생성합니다. 하지만 WebExceptionHandler를 사용하면 이러한 기본 동작을 커스터마이징할 수 있습니다.

예를 들어, 특정 예외에 대해 사용자 정의한 에러 메시지나 상태 코드를 반환하거나, 로깅 등의 작업을 수행할 수 있습니다.

import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebExceptionHandler;
import reactor.core.publisher.Mono;

@Component
@Order(-2)
public class CustomExceptionHandler implements WebExceptionHandler {

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        // 예외 처리 로직
        System.err.println("Exception caught: " + ex.getMessage());

        // 사용자 정의 응답 생성
        exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
        return exchange.getResponse().setComplete();
    }
}

위 코드에서 CustomExceptionHandler는 WebExceptionHandler 인터페이스를 구현하고 있습니다. handle 메서드 내에서 예외 처리 로직을 구현하고, 사용자 정의 응답을 생성하고 있습니다.

@Order(-2) 어노테이션은 필터 순서를 지정하는데 사용됩니다. 음수 값이므로 다른 필터보다 먼저 실행됩니다. 이를 통해 예외 처리는 다른 필터보다 먼저 이루어집니다.

WebExceptionHandler를 사용하면 예외 처리를 통해 클라이언트에게 더 유용한 정보를 전달하거나, 로깅 등의 작업을 수행하여 애플리케이션의 안정성과 신뢰성을 높일 수 있습니다.

 

 

※ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. https://bit.ly/48sS29N