스프링부트는 사랑입니다

스프링부트 : REST 어플리케이션에서 예외처리하기 본문

기타

스프링부트 : REST 어플리케이션에서 예외처리하기

얼바인 2016. 3. 10. 02:43
728x90
스프링부트 : REST어플리케이션에서 예외처리하기

(원문소스: http://www.ekiras.com/2016/02/how-to-do-exception-handling-in-springboot-rest-application.html)


기억할 점

스프링 부트 어플리케이션에서 예외처리하는 방법은 3가지다:

  1. 전역 처리 Global Level using -  @ControllerAdvice
  2. 컨트롤러단에서 처리 Controller Level using@ExceptionHandler 
  3. 메소드단위 처리 Method Level usingtry/catch  

REST 어플리케이션에서 예외처리하기 

예외처리를 테스트하기위에 3가지 예외를 만들것이다:

  • 모든 커스텀 예외의 부모가 될 BaseException.
  • Base Exception을 확장한 CustomException1.
  • Base Exception을 확장한 CustomException2.

다음의 메소드들을 만든다
  • ex1() throws BaseException
  • ex2() throws CustomException1
  • ex3() throws CustomException2
  • ex4() throws NullPointerException 
  • ex5() throws NumberFormatException

이제 위에 언급한 방법을을 사용하여 이들 예외를 어떻게 처리하는지 둘러보자

방법 1 :  @ControllerAdvice를 사용한 전역 처리Global Exception Handling

클래스에 @ControllerAdvice and @RestController. 를 어노테이션을 추가하면 REST 응답을 리턴하게 될 것이다.

  • @ControllerAdvice는 당신의 스프링 어플리케이션에게 이 클래스가 당신의 어플리케이션의 예외처리를 맡을 거라고 알려주게 된다.
  • @RestController 는 이 클래스를 컨트롤러로 만들어주고 이 클래스가 응답을 렌더할 수 있게 해준다.
  • @ExceptionHandler 어노테이션을 사용하여 예외를 처리할 클래스를 정의한다. ( 기본클래스는 모두 상속되거나 확장된 클래스를 처리할 것이다) 
  • 당신은 @ResponseStatus 어노테이션을 사용하여 예외의 응답 상태를 설정할 수 있다.

HomeController.class

  1. package com.ekiras.controller;  
  2.   
  3. import com.ekiras.exception.BaseException;  
  4. import com.ekiras.exception.CustomException1;  
  5. import com.ekiras.exception.CustomException2;  
  6. import org.springframework.web.bind.annotation.ExceptionHandler;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8. import org.springframework.web.bind.annotation.RestController;  
  9.   
  10. /** 
  11.  * @author ekansh 
  12.  * @since 19/2/16 
  13.  */  
  14. @RestController  
  15. @RequestMapping({"","/"})  
  16. public class HomeController {  
  17.   
  18.     @RequestMapping("/ex1")  
  19.     public String ex1(){  
  20.         // 전역 처리자 메소드 handleBaseException에 잡힐 것이다.  
  21.         throw new BaseException("Base Exception");  
  22.     }  
  23.   
  24.     @RequestMapping("/ex2")  
  25.     public String ex2(){  
  26.         //전역 처리자 메소드 handleBaseException에 잡힐 것이다.    
  27.         throw new CustomException1();  
  28.     }  
  29.   
  30.     @RequestMapping("/ex3")  
  31.     public String ex3(){  
  32.         // 전역 처리자 메소드 handleBaseException에 잡힐 것이다.    
  33.         throw new CustomException2();  
  34.     }  
  35.   
  36.     @RequestMapping("/ex4")  
  37.     public String ex4(){  
  38.         //전역 처리자 메소드 handleBaseException에 잡힐 것이다.    
  39.         throw new NullPointerException("null pointer exception");  
  40.     }  
  41.   
  42.     @RequestMapping("/ex5")  
  43.     public String ex5(){  
  44.         // 컨트롤러 예외 처리자 메소드 nfeHandler에 잡힐 것이다.
  45.         throw new NumberFormatException("number format exception");  
  46.     }  
  47.   
  48.     /** 
  49.      * 이 컨트롤러 내에서 발생하는 모든 Number Format 예외를 처리한다     *  
  50.      * */  
  51.     @ExceptionHandler(value = NumberFormatException.class)  
  52.     public String nfeHandler(NumberFormatException e){  
  53.         return e.getMessage();  
  54.     }  
  55.   
  56. }  

GlobalExceptionHandler.class

  1. package com.ekiras.handler.exception;  
  2.   
  3. import com.ekiras.exception.BaseException;  
  4. import org.springframework.http.HttpStatus;  
  5. import org.springframework.web.bind.annotation.ControllerAdvice;  
  6. import org.springframework.web.bind.annotation.ExceptionHandler;  
  7. import org.springframework.web.bind.annotation.ResponseStatus;  
  8. import org.springframework.web.bind.annotation.RestController;  
  9.   
  10. /** 
  11.  * @author ekansh 
  12.  * @since 19/2/16 
  13.  */  
  14. @ControllerAdvice  
  15. @RestController  
  16. public class GlobalExceptionHandler {  
  17.   
  18.     @ResponseStatus(HttpStatus.BAD_REQUEST)  
  19.     @ExceptionHandler(value = BaseException.class)  
  20.     public String handleBaseException(BaseException e){  
  21.         return e.getMessage();  
  22.     }  
  23.   
  24.     @ExceptionHandler(value = Exception.class)  
  25.     public String handleException(Exception e){return e.getMessage();}  
  26.   
  27.   
  28. }  
  • handleBaseException(BaseException e) ::  BaseException, CustomException1 과 CustomException2 클래스들의 예외를 잡는다.
  • handleException(Exception e) ::  Exception클래스의 자식들의 모든 예외를 처리한다.

알림 :: 만일 BaseException 또는 그의 자식 예외가 발생하면 handleException() 메소드가 아닌 handleBaseException()이 이 예외를 잡을 것이다. 

방법 2 : @ExceptionHandler를 사용한 컨트롤러단 예외처리


  1. @ExceptionHandler(value = NumberFormatException.class)  
  2.  public String nfeHandler(NumberFormatException e){  
  3.      return e.getMessage();  
  4.  }  

HomeController.java 에 있는 위의 코드는 이 컨트롤러내에서 발생하는 모든 NumberFormatException를잡을 것이다. 다른 컨트롤러에서 발생하는 NumberFormatException는 처리하지않는다.







728x90