예외처리

CHM·2022년 6월 24일
0

Spring

목록 보기
25/26

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..");
    }
}

0개의 댓글