본문 바로가기
Baeldung번역&공부/Spring-Reactive

WbFlux에서 404Status를 반환하는방법(How to Return 404 with Spring WebFlux)

by ms727 2025. 2. 25.

원본 글: https://www.baeldung.com/spring-webflux-404

Netty 서버는 Servlet API를 지원하지 않으므로, 이 환경에서 404 HTTP 상태 코드를 반환하는 방법을 알아봅니다.

1. Semantic Response Status

표준 RESTful 방식에 따르면, API의 의미를 정확하게 표현하기 위해 다양한 HTTP 상태 코드를 적절히 활용해야 합니다.

1.1 Default Return Status

모든 요청에 대해 잘 처리되면 보통 200(OK)응답을 리턴합니다.

@GetMapping(value = "/ok", produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<String> ok() {
    return Flux.just("ok");
}

> http :8080/ok
ok

1.2 Using Annotations

@ResponseStatus 어노테이션을 통해서 HttpStatus 반환방식을 변경할 수도 있습니다.

@ResponseStatus(HttpStatus.NO_CONTENT)
@GetMapping(value = "/no-content", produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<String> noContent() {
    return Flux.empty();
}

> http :8080/no-content
HTTP/1.1 204 No content

1.3 Changing the Status Programmatically

서버의 동작 방식에 따라, 고정된 상태 코드(@ResponseStatus, 기본값 등) 대신, 프로그래밍적으로 응답 상태 코드를 변경해야할 수 도 있습니다.
ServerHttpResponse를 메서드에 추가하면 동적으로 상태 코드를 설정할 수 있습니다.

@GetMapping(value = "/accepted", produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<String> accepted(ServerHttpResponse response) {
    response.setStatusCode(HttpStatus.ACCEPTED);
    return Flux.just("accepted");
}

> http:8080/accepted
HTTP/1.1 202 Accepted

1.4 Throwing an Exception

예외가 발생한다면, 기본적으로 설정된 HTTP 상태 코드는 무시 되고, Spring이 그 예외를 처리할 수 있는 핸들러(Exception Handler)를 찾으려고 시도합니다.

@GetMapping(
  value = "/bad-request"
)
public Mono<String> badRequest() {
    return Mono.error(new IllegalArgumentException());
}
//밑은 Exception Handler의 코드 일부
@ResponseStatus(
  value = HttpStatus.BAD_REQUEST,
  reason = "Illegal arguments")
@ExceptionHandler(IllegalArgumentException.class)
public void illegalArgumentHandler() {
    // 
}

1.5 With ResponseEntity

ResponseEntity 클래스를 통하여 좀 더 유연하고 읽기 쉽게 응답을 구성할 수 있습니다.

@GetMapping(value = "/unauthorized")
public ResponseEntity<Mono<String>> unauthorized(){
    return ResponseEntity
            .status(HttpStatus.UNAUTHORIZED)
            .header("X-Reason", "user-invalid")
            .body(Mono.just("unauthorized"));
}

> http :8080/unauthorized
HTTP/1.1 401 Unauthorized

1.6 With Functionals Endpoints

Spring5에서는 함수형 프로그래밍을 통해 엔드포인트를 명시할 수 있습니다.

@Configuration
public class TestRouter {

    @Bean
    public RouterFunction<ServerResponse> notFound() {
        return RouterFunctions
                .route(GET("/statues/not-found"),
                        request -> ServerResponse.notFound().build());
    }
}

> http :8080/statues/not-found
HTTP/1.1 404 Not Found

2. 결론

Http API를 구현할 때 프레임워크는 클라이언트에게 반환할 HTTP 상태 코드를 효과적으로 다룰 수 있는 여러 가지 방법들을 제공합니다.

이 글에서는 그런 방법들을 소개하며, RESTful한 API를 깔끔하고 이해하기 쉽게 만들 수 있는 방법을 배울 수 있는 출발점이 될 것입니다.


지금 회사에서는 커스텀한 방식을 많이 사용하고 예외 외에는 200OK를 쓰고 있다. 생각해보면 나빼고 204, 201 이런 HttpStatus는 안 쓰는듯..?

그리고 200OK HtpStatus안에 또 다른 resultCode 값을 담아서 보여주다보니 의미가 조금 퇴색된 부분이 있는 것 같기도 하다.

예제코드