스프링

@ControllerAdvice, @ExceptionHandler로 에러처리하기

JANNNNNN 2024. 5. 9. 13:35

스프링 프레임워크에서의 에러 처리는 필수적인데요!

웹 개발을 하다보면 에러를 마주칠 때가 정말 많은데

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 형식의 응답을 반환합니다.

 

➡️이러한 방식으로, 예외가 발생하더라도 사용자는 사용자 친화적인 응답을 받을 수 있습니다.

 

이러한 글로벌 예외 처리 기능을 이용하면 개발자는 각각의 컨트롤러마다 예외 처리 코드를 반복 작성할 필요 없이 예외를 일관되게 처리할 수 있습니다. 이는 코드의 중복을 방지하고 유지보수성을 향상시킵니다!