@ControllerAdvice, @ExceptionHandler로 에러처리하기
스프링 프레임워크에서의 에러 처리는 필수적인데요!
웹 개발을 하다보면 에러를 마주칠 때가 정말 많은데
Whitelabel Error Page
페이지를 그냥 띄워주게되면 사용자에게 좋지 않은 인터페이스를 보여줍니다.
그래서 우리는 개발자로서 Exception을 꼭 처리해줘야해요
예외 처리를 효과적으로 다루기 위해 @ControllerAdvice와 @ExceptionHandler 애노테이션을 사용할 수 있습니다.
@ControllerAdvice
- 이 애노테이션은 전역적인 예외 처리를 담당하는 클래스를 정의할 때 사용됩니다. 이 클래스는 모든 컨트롤러에서 발생하는 예외를 중앙 집중적으로 처리합니다.
@ExceptionHandler
- 이 애노테이션은 특정 예외 유형에 대한 처리 방법을 정의하는 메서드에 적용됩니다. 이 메서드는 해당 예외가 발생했을 때 호출되어 예외를 처리하고 적절한 응답을 생성합니다.
예를 들어, IllegalArgumentException이 발생했을 때 어떻게 처리할지를 정의하기 위해 handleArgumentException 메서드를 작성해보겠습니다. 이 메서드는 IllegalArgumentException을 처리하고 사용자에게 적절한 응답을 반환하는 로직이에요.
@GetMapping("dummy/user/{id}")
public User detail(@PathVariable int id){
User user = userRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("해당 유저는 없습니다. id:"+ id);
});
return user;
}
@ControllerAdvice
@RestController
public class GlobalExceptionHandler {
@ExceptionHandler(value = IllegalArgumentException.class)
public String handleArgumentException(IllegalArgumentException e){
return "<h1>"+e.getMessage()+"</h1>";
}
}
1. "해당 유저는 없습니다 id: {id}"라는 message를 가진 채 Exception을 날리면,
2. @ControllerAdvice는 모든 Exception을 낚아채서 GlobalExceptionHandler class에 모이게 됩니다.
3. 그 중에서도 handleArgementException이 @ExceptionHandler(value = IllegalArgumentException.class) 으로 IllegalArgumentException 을 낚아채는 담당이기 때문에 해당 메서드가 실행됩니다.
이 메서드는 해당 예외의 메시지를 포함한 HTML 형식의 응답을 반환합니다.
➡️이러한 방식으로, 예외가 발생하더라도 사용자는 사용자 친화적인 응답을 받을 수 있습니다.
이러한 글로벌 예외 처리 기능을 이용하면 개발자는 각각의 컨트롤러마다 예외 처리 코드를 반복 작성할 필요 없이 예외를 일관되게 처리할 수 있습니다. 이는 코드의 중복을 방지하고 유지보수성을 향상시킵니다!