Spring 예외처리
- 끝단(DAO와 Service)에서 발생된 예외는 앞단(Controller)로 모여짐.
- 스프링은 Controller에서 예외처리 하는 것을 권장하고 있다. Controller에서 @ExceptionHandler와 @ControllerAdvice를 사용해 예외를 처리
- System 예외는 Business 예외로 다시 던지는 re-throwing 방식 사용
예외처리 종류
- Checked Exception : try-catch 등으로 잡아놓은 예외처리
- Unchecked Exception : RuntimeException을 상속받은 Exception들
- 비즈니스 예외를 만들 때는 위 둘중 어떤 Exception을 사용할 것인지를 먼저 결정해 주어야한다.
Spring 예외처리 특징
1. 컨트롤러 기반
- 부가기능을 제공하는 Advice 클래스를 작성함
- XML 설정 파일에 <aop:config>를 이용해서 Aspect를 작성함(즉, 어드바이스와 포인트컷을 설정함)
2. 글로벌 Exception 핸들러
- 예외처리는 부가기능(cross-cutting concern)에 해당되기 때문에 애플리케이션 전체에 포인트컷이 적용되어야 함.
- @ControllerAdvice 어노테이션을 포함한 클래스는 전역 예외처리 컨트롤러가 된다.
- 컨트롤러에서 캐치한 예외는 JSP같은 view나 JSON으로 응답 가능
MyBatis에서의 예외처리
JDBC 관련 코드는 대부분 SQLException 발생
- 대부분 SQLException은 복구 불가능
- Spring-MyBatis는 SQLException을 DataAccessException(RuntimException)으로 re-throwing함
- DateAccessException으로부터 SQLException을 추출하여 getErrorCode()메서드로 에러코드 확인 가능
예외처리 클래스 예제
public class BizException extends RuntimeException {
public BizException() {
super();
}
public BizException(Throwable t) {
super(t);
}
public BizException(String msg) {
super(msg);
}
}
@ControllerAdvice //컨트롤러이면서 예외를 처리할 수 있는 클래스
public class GlobalExceptionHandler {
@ExceptionHandler(BizException.class)
public String handleBizException(Exception e, Model model) { // Controller와 동일 -> jsp 페이지를 리턴
model.addAttribute("type", e.getClass().getSimpleName());
model.addAttribute("msg", e.getMessage());
return "error";
}
}
@Service
public class BbsService{
...
public void testService() {
System.out.println("target invoked..");
throw new BizException("testService fail..");
}
}