Home 스프링에서 잘못된 URL로 요청이 오면 어떻게 커스텀한 응답을 내려줄까?
Post
Cancel

스프링에서 잘못된 URL로 요청이 오면 어떻게 커스텀한 응답을 내려줄까?

1. 글을 작성하게 된 계기


스프링 부트 3.2 이전 버전에서는 잘못된 URL로 요청이 오면, yml 설정으로 커스텀한 응답을 내려줬습니다. 하지만 3.2 버전부터 해당 설정이 Deprecated 됐는데요, 3.2 버전 이후에는 어떻게 커스텀한 응답을 내려주는지 정리하기 위해 글로 작성하게 되었습니다.

DispatcherServlet property is deprecated for removal and should no longer need to be configured







2. 커스텀한 응답의 필요성, 변경된 설정


잘못된 URL로 요청이 들어오면, 스프링 부트는 아래와 같은 양식의 응답을 내려줍니다. 하지만 애플리케이션에는 사용 중인 에러 응답 양식 이 있을 텐데, 해당 양식을 사용하기 위해서는 별도의 설정을 해줘야 합니다.

1
2
3
4
5
6
{
  "timestamp": "2024-03-24T10:17:53.515+00:00",
  "status": 404,
  "error": "Not Found",
  "path": "/api/invalid-url"
}

3.2 버전 이전에는 해당 설정을 통해 커스텀한 응답을 내려줬습니다.







방법은 간단합니다. 먼저 @EnableWebMvc 어노테이션을 활성화해 줍니다.

1
2
3
4
5
6
7
8
9
@EnableWebMvc   // 활성화
@SpringBootApplication
class AppApplication

inline fun <reified T> T.logger() = LoggerFactory.getLogger(T::class.java)!!

fun main(args: Array<String>) {
    runApplication<AppApplication>(*args)
}







이후 GlobalExceptionHandler를 만들고 @ControllerAdvice 어노테이션을 사용합니다. 이를 통해 DispatcherServlet에서 발생한 예외를 스프링이 자동으로 처리하지 않고, 사용자가 커스텀하게 처리 할 수 있게 됩니다. 잘못된 URL로 요청이 오면, NoHandlerFoundException 이 발생하기 때문에, 이를 잡아 처리를 해주면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(NoHandlerFoundException::class)    // NoHandlerFoundException 처리
    fun resolveHandleNoHandlerFoundException(ex: NoHandlerFoundException): ResponseEntity<ErrorResponse> {
        val codeAndMessage = CommonCodeAndMessage.INVALID_URL
        return ResponseEntity.status(codeAndMessage.status)
            .body(ErrorResponse(codeAndMessage))
    }

    ......
    
}
1
2
3
4
5
6
data class ErrorResponse(
    private val codeAndMessage: CodeAndMessage
) {
    val code = codeAndMessage.code
    val message = codeAndMessage.message
}







설정이 올바르게 됐다면, 잘못된 URL로 요청을 보냈을 때, 다음과 같이 커스텀한 양식의 에러 응답을 받을 수 있습니다.

1
2
3
4
{
    "message": "URL을 찾을 수 없습니다.",
    "code": 404
}







3. 정리


스프링 부트 3.2 버전 이후, 잘못된 URL로 요청이 왔을 때, 어떻게 커스텀한 에러 응답을 내려줄 수 있는지 살펴보았습니다. 방법 자체는 간단한데요, 추가로 @EnableWebMvc 와 DispatcherServlet에 대해 학습해 보실 것을 권장해 드립니다.


This post is licensed under CC BY 4.0 by the author.

빌드와 컴파일의 차이는 무엇일까?

배포 버전을 어떻게 명시할까?