- 스프링 예외처리
- 스프링에서의 예외처리 방식을 이해하고 구현한다.
- @ControllerAdvice 사용한 예외처리를 작성한다.
- DAO와 Service에서 발생된 예외는 Controller로 모여짐
- System 예외는 Business 예외로 다시 던지는(re-throwing) 방식 사용
- @ExceptionHandler 와 @ControllerAdvice 를 사용하여 예외를 처리
예외는 일반적으로 DAO 즉, 뒤쪽에서 발생해서 앞 단으로 모여져서 넘어옵니다. 시스템 단에서 예외가 발생해서 Business단으로 예외를 다시 던지는 방식을 사용합니다.
스프링에서는 Controller단에서 예외처리를 최종적으로 하는 것을 권장하고 있습니다. 그래서 Controller단에서 예외를 글로벌하게 처리할 수 있게 하는 @ControllerAdvice를 제공하고 있습니다.
중요한 것은, System(DAO)단에서 발생한 예외가 Business단 예외로 다시 던질 때 checked exception으로 던질 것인지, unchecked exception으로 던질 것인지를 결정하는 것입니다.
예외는, 우리가 직접 try-catch문으로 잡아주는 checked exception이 있고, 예외처리 구문을 직접 작성하지 않아도 되는 unchecked exception이 있습니다. unchecked exception은 RuntimeException을 상속받습니다. unchecked exception은 자동으로 앞 단으로 예외를 던져주는 편리함이 있습니다.
- 컨트롤러 기반
- 부가기능을 제공하는 Advice 클래스를 작성함
- XML 설정 파일 < aop:config>를 이용해서 애스펙트를 설정함
(즉, 어드바이스와 포인트컷을 설정함)- 글로벌 Exception 핸들러
- 예외처리는 cross-cutting concern, 어플리케이션 전체에 포인트컷이 적용되어야 함
- @ControllerAdvice 어노테이션을 포함한 클래스는 전역 예외처리 컨트롤러가 됨
- 컨트롤러에서 캐치한 예외는 JSP같은 View나 혹은 JSON으로 응답이 가능
@ControllerAdvice가 붙은 클래스는 예외처리를 위한 클래스입니다.
컨트롤러단에서 구현하면 됩니다.
- 대부분의 SQLException은 복구가 불가능
- Spring-MyBatis SQLExption을 DataAccessException(RuntimeException)으로 re-throwing함
- DataAccessException으로 부터 SQLException을 추출하여 getErrorCode() 메서드로 에러코드 확인 가능
데이터베이스에서 발생한 예외는 명시적으로 예외를 잡아도 대부분 복구가 불가능한 예외입니다.
- 스프링 3.2 이상에서 사용 가능
- @Controller나 @RestController에서 발생하는 예외를 catch함
- 스프링 4.0이상에서는 특정한 컨트롤러만 지정해서 catch가 가능함
- servlet-context.xml에서 ControllerAdivce를 include
<context:component-scan base-package="kr.co.acompp.hello" user-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" /> </context:component-scan>
@ControllerAdivce //클래스 @ExceptionHandler(SQLExption.class) //예외처리 내용의 메소드