Spring에서 Exception 제대로 처리하기, Spring Exception 전역 예외 처리, Spring exception 처리, Spring exception handler, ExceptionHandler, 스프링 예외처리, Spring exception 예외처리, Spring exception
Spring에서의 예외처리 방법
Spring에서는 Java에서의 try catch 블록을 사용하는것 외에 예외를 처리할 수 있는 간단한 방법을 제공합니다.
대표적으로 @ExceptionHandler라는 annotation(어노테이션)을 이용하여 예외처리할 수 있습니다.
또한, 이를 프로젝트 전체에 적용하기 위해, @ControllerAdvice라는 annotation 을 사용할 수 있습니다.
이에 대한 설명을 해보고자 합니다.
@ExceptionHandler annotation
컨트롤러 클래스에 @ExceptionHandler가 명시되어있는 메소드를 추가하여,
해당 컨트롤러에서 요청 처리 (@RequestMapping)에 의해 발생한 예외를 특별히 처리할 수 있습니다.
@ExceptionHandler를 이용하여 예외처리를 하는 구체적인 방식은 아래와 같이 크게 세가지가 있습니다.
1. @ResponseStatus annotaion 을 사용한 처리
2. 에러 페이지로 리다이렉션
3. 커스텀 에러 reponse(응답)
@ExceptionHandler([class명.class]) 와 같이 @ExceptionHandler에 인자를 넣어서,
어떤 에러를 처리할지 지정할 수 있습니다.
예를 들어 @ExceptionHandler(SQLException.class) 와 같이 사용할 수 있습니다.
한 메소드가 여러 가지의 exception 처리를 하고 싶다면, class 배열을 인자로 넣어주면 됩니다.
예를 들어 @ExceptionHandler({SQLException.class,DataAccessException.class}) 와 같이 사용할 수 있습니다.
구체적인 예시 코드는 아래와 같습니다.
@Controller
public class ExceptionHandlingController {
// @RequestMapping한 메소드, 각 메소드들은 exception을 일부러 발생하도록 작성
@RequestMapping("/test1")
public String ControllerTest1(){
throw new SQLException();
}
@RequestMapping("/test2")
public String ControllerTest2(){
throw new DataIntegrityViolationException();
}
// @ExceptionHandler를 사용하여 Exception 처리 메소드들을 작성
// error를 보여줄 viewname을 리턴
@ExceptionHandler({SQLException.class,DataAccessException.class})
public String databaseError() {
return "databaseError";
}
// model 과 viewname을 리턴
@ExceptionHandler(DataIntegrityViolationException.class)
public ModelAndView handleError(HttpServletRequest req, Exception ex) {
logger.error("Request: " + req.getRequestURL() + " raised " + ex);
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", req.getRequestURL());
mav.setViewName("error");
return mav;
}
}
전역 익셉션 처리, Global Exception Handling, @ControllerAdvice
@ControllerAdvice 어노테이션을 사용하면 개별 컨트롤러뿐만 아니라 전체 컨트롤러에 적용할 수 있습니다.
@ControllerAdvice가 붙은 어떠한 클래스는 controller advice가 되며, 세가지 타입의 메소드가 지원됩니다.
여기서 Advice란, 비지니스 로직에서 주 로직이 아닌 부가적인 로직이라고 생각을 하시면 되니다.
ControllerAdvice에서 지원하는 세가지 타입의 메소드는 다음과 같습니다.
- Exception처리를 할 수 있는 @ExceptionHandler 가 붙은 메소드
- 향상된 Model 메소드를 사용할 수 있게 해주는 @ModelAttribute가 붙은 메소드.
- @initBinder가 붙은 메소드
아래와 같이 @ControllerAdvice를 사용하여 클래스를 스프링 프로젝트에 작성을 하면,
Exception이 어디에서 발생하든 이 클래스가 DataIntegrityViolationException 처리를 할 수 있게 됩니다.
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.CONFLICT) // 409 에러코드 발생
@ExceptionHandler(DataIntegrityViolationException.class)
public void handleConflict() {
// 아무것도 하지 않음.
}
}
만일 어떠한 Exception을 처리하고자 한다면,
아래와 같이 @ExceptionHandler(value = Exception.class) 코드를 사용하면 좋습니다.
@ControllerAdvice
class GlobalDefaultExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error";
@ExceptionHandler(value = Exception.class)
public ModelAndView
defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;
}
}
총평
Spring은 정말 코드 작성을 적게 하기 위해 다양한 annotation을 제공해주는구나 라고 느꼈습니다.
개인적으로는 @ExceptionHandler를 쓰는 프로젝트를 잘 못보긴 했는데,
사용하면 더 빠르고 간단하게 개발이 가능할거 같습니다.
#스프링프레임워크,#어노테이션,#스프링,#프레임워크,#익셉션,#처리,#exceptionhandler,#exception,#spring,#framework,#springframework,#controlleradvice,#annotation
댓글