2016년 1월 6일 수요일

Spring에서 Exception 처리 ( @ExceptionHandler, @ControllerAdvice )

@ExceptionHandler
같은 컨트롤러에 @ExceptionHandler 어노테이션을 적용한 메서드가 존재하면, 스프링은 그 메서드가 익셉션을 처리하도록 한다.
따라서, 컨트롤러에 발생한 익셉션을 직접 처리하고 싶다면 @ExceptionHandler 어노테이션을 적용한 메서드를구현해주면 된다.

@Controller
public class MemberDetailController {
   ...
   @RequestMapping("/member/detail/{id}")
   public String detail(@PathVariable("id") Long memId, Model model) {
      Member member = memberDao.selectById(memId);
      if (member == null) {
         throw new MemberNotFoundException();
      }
      model.addAttribute("member", member);
      return "member/memberDetail";
   }

   @ExceptionHandler(TypeMismatchException.class)
   public String handleTypeMismatchException(TypeMismatchException ex) {
      // ex 사용해서 로그 남기는 등 작업
      return "member/invalidId";
   }

   @ExceptionHandler(MemberNotFoundException.class)
   public String handleNotFoundException() throws IOException {
      return "member/noMember";
   }
}

이렇게하면 컨트롤러에서 에러가 날 경우  익셉션을 전달하는 것이 아니라, 컨트롤러 내부에서 직접 에러를 처리하게 된다.

@ControllerAdvice
@ControllerAdivice는 하나의 컨트롤러가 아닌 여러컨트롤러에서 하나의 익셉션을 처리할 때 사용된다.

@ControllerAdivce("chap13.spring")
public class CommonExceptionHandler {
   @ExceptionHandler(RuntimeException.class)
   private ModelAndView errorModelAndView(Exception ex) {
      ModelAndView modelAndView = new ModelAndView();
      modelAndView.setViewName("/error_common");
      modelAndView.addObject("exception", ex );
      return modelAndView;
   }
}

이렇게 M&V 를 사용하면   뷰와,  모델객체를 같이 보낼 수 있다.

참고
  • http://blog.naver.com/xcv1524/220497274201

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.