개발 일지/Spring

[Spring MVC] 예외 처리

미숫가루설탕많이 2023. 2. 19. 18:51

 @ExceptionHandler는 스프링 프레임워크에서 제공하는 애너테이션이다.

 

 Controller에서 발생하는 예외를 처리하는 메서드를 지정하는 데 사용되며, 예외가 발생하면 @ExceptionHandler 애너테이션이 붙은 메서드가 호출되어 예외를 처리하고 적절한 응답을 반환한다.

 

 @ExceptionHandler를 사용하면 전역 예외 처리가 가능해지며, 특정 컨트롤러나 메서드에서 발생한 예외를 쉽게 처리할 수 있다.

 

 만약 에러가 발생했을 때, Response Body에 이에 적절한 설명이 담긴 메시지를 담지 않고 응답한다면 클라이언트는 요청 데이터 중에서 어떤 항목에서 문제가 발생했는지 알 수가 없을 것이다.

 

 하지만 @ExceptionHandler를 이용하면 예외가 발생했을 때 클라이언트에게 적절한 에러 페이지를 보여주거나 예외를 로그에 남기는 등의 작업을 수행하여 클라이언트에게 에러메시지를 조금 더 구체적으로 알려줄 수 있다.

 

 

 

 

@ExceptionHandler를 이용한 Controller에서의 예외 처리

 

 스프링에서의 예외는 애플리케이션에 문제가 발생했을 경우, 어떤 문제가 발생했는지 친절하게 알려줘서 문제를 해결하는 것뿐만 아니라 유효성 검증에 실패했을 때와 같이 이 실패를 하나의 예외로 간주하여 이 예외를 throw 하여 예외 처리를 유도한다.

 

 또한 필요한 Error 정보만 담을 수 있는 Response 객체를 사용해서 클라이언트에게 필요한 에러 정보만 제공할 수도 있다.

 

 

 

 

@RestControllerAdvice

 

 @ExceptionHandler 애너테이션으로만 에러 처리를 하게 된다면 각각의 Controller 클래스에서 에러 처리를 해야 하므로 각 Controller 클래스마다 코드 중복이 발생한다. 또한, 예외가 유효성 검증 실패에 대한 예외만 있는 것이 아니기 때문에 하나의 Controller 클래스 안에서 에러 처리 핸들러 메서드가 늘어난다.

 

 따라서 특정 클래스에 @RestControllerAdvice 애너테이션을 추가하면 여러 개의 Controller 클래스에서 @ExceptionHandler 등이 추가된 메서드를 공유해서 사용할 수 있다. 즉, 예외 처리를 공통화할 수 있다.

 

@RestControllerAdvice 또한 스프링 프레임워크에서 제공되는 애너테이션으로 @ControllerAdvice와 같이 예외 처리를 위한 클래스를 정의할 때 사용된다. @ControllerAdvice와 다른 점은 RESTful 웹 서비스에서 사용되는 컨트롤러에서 발생하는 예외를 처리하기 위한 목적으로 만들어졌다는 점이다.

 

 @ResponseBody를 적용한 @RestController와 함께 사용하면 JSON 형태의 응답을 생성할 수 있으므로 ResponseEntity로 래핑 할 필요가 없다.

 

 

 

 

 


 @ResponseStatus 애너테이션으로 HTTP Status를 대신 표현할 수 있지만 HttpStatus가 동적으로 변경되는 경우에는 ResponseEntity를 사용한다.