[Spring Framework] 21강 - 예외처리

seb Incode·2022년 4월 26일
0

Spring Framework

목록 보기
21/22
post-thumbnail

학습 내용

  • 스프링 예외처리

학습 목표

  • 스프링에서의 예외처리 방식을 이해하고 구현한다.
  • @ControllerAdvice 사용한 예외처리를 작성한다.

Spring에서의 예외처리

서버에서 발생된 예외를 최종 사용자에게 전달되는 것 방지

  • 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은 자동으로 앞 단으로 예외를 던져주는 편리함이 있습니다.

Spring 예외처리 특징

  1. 컨트롤러 기반
    • 부가기능을 제공하는 Advice 클래스를 작성함
    • XML 설정 파일 < aop:config>를 이용해서 애스펙트를 설정함
      (즉, 어드바이스와 포인트컷을 설정함)
  2. 글로벌 Exception 핸들러
    • 예외처리는 cross-cutting concern, 어플리케이션 전체에 포인트컷이 적용되어야 함
    • @ControllerAdvice 어노테이션을 포함한 클래스는 전역 예외처리 컨트롤러가 됨
    • 컨트롤러에서 캐치한 예외는 JSP같은 View나 혹은 JSON으로 응답이 가능

@ControllerAdvice가 붙은 클래스는 예외처리를 위한 클래스입니다.
컨트롤러단에서 구현하면 됩니다.

Mybatis에서의 예외처리

JDBC 관련 코드는 대부분 SQLException 발생

  • 대부분의 SQLException은 복구가 불가능
  • Spring-MyBatis SQLExption을 DataAccessException(RuntimeException)으로 re-throwing함
  • DataAccessException으로 부터 SQLException을 추출하여 getErrorCode() 메서드로 에러코드 확인 가능

데이터베이스에서 발생한 예외는 명시적으로 예외를 잡아도 대부분 복구가 불가능한 예외입니다.

@ControllerAdvice 특징

  • 스프링 3.2 이상에서 사용 가능
  • @Controller나 @RestController에서 발생하는 예외를 catch함
  • 스프링 4.0이상에서는 특정한 컨트롤러만 지정해서 catch가 가능함

@ControllerAdvice 사용을 위한 설정

  • 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)
	//예외처리 내용의 메소드

0개의 댓글