ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [18] Spring Web MVC : ExceptionHandler
    Spring/Spring boot 2020. 6. 28. 09:19
    반응형

    [BasicErrorController]

    BasicErrorController는 spring boot에 기본적으로 등록되어 있는 error handler입니다. accept header에 따라 구분된 결과를 response 합니다.

    • accept header에 "text/html"이 있는 경우(browser에서 reqeust 시) : html로 response 합니다.
    • accept header에 "text/html"이 없는 경우(console에서 curl로 request 시) : json으로 response합니다.

     

    BasicErrorController class의 내용을 보면 다음과 같습니다. @ExceptionHandler 대신 @RequestMapping을 통한 기본 mapping이 error로 되어 있습니다.

    @Controller
    @RequestMapping("${server.error.path:${error.path:/error}}")	//	①
    public class BasicErrorController extends AbstractErrorController {
    
    	private final ErrorProperties errorProperties;
        ...
    }

    ① property에 server.error.path key가 있으면 사용하고 없으면 error.path key가 있는지 확인하여 있으면 사용하고 없으면 /error를 mapping 합니다. 

     

    특별한 error handler가 없는 경우 ~/error response가 진행되며 browser에서 보이는 화면은 다음과 같습니다.

     

    Spring boot가 제공하는 기본 예외 처리기를 사용자의 입맛에 맞게 고쳐 쓰려면 BasicErrorController class를 상속받은 class에 원하는 예외처리 기능을 추가해주면 됩니다.

     

     


    [Spring Web MVC annotation 기반의 예외처리]

    Spring Web MVC에서 예외처리를 위한 두 가지 annotation을 제공하고 있습니다.

     

    1) @ExeptionHandler

    @ExceptionHandler는 특정 controller 안에서 예외처리를 위해 사용됩니다.

     

    1.request를 받아 예외를 throw 하는 controller를 만듭니다.

    @Controller
    public class SampleController {
    
        @GetMapping("/exception")	//	①
        public String hello() {
            throw new SampleException();	//	②
        }
    
        @ExceptionHandler(SampleException.class)	//	③
        public @ResponseBody AppError sampleError(SampleException e) {	//	④
    
            //	⑤
            AppError appError = new AppError();
            appError.setMessage("error.app.key");
            appError.setReason("IDK IDK IDK");
            return appError;
        }
    }
    

     

    ① @Controller와 함께 사용돼 ~/exception 들어오는 get reqeust를 처리하는 controller입니다.

    ② SampleException 예외를 발생시킵니다.

    ③ annotation 다음에 따라오는 method가 SampleException 예외가 발생했을 때 처리될 exception handler임을 나타냅니다.

    ④ response body에 JSON 형태로 error 내용을 넣어 client로 전달합니다.

    ⑤ response body를 통해 전달될 error 내용을 작성 후 return 합니다.

     

    2. 예외처리에 사용할 예외 객체 생성에 필요한 class를 선언합니다.

    public class SampleException extends RuntimeException {	//	①
    
    
    }
    

    ① RuntimeException을 상속받아 예외 class를 선언합니다.

    3. 예외 발생 시 그 정보를 담을 class를 선언합니다.

    public class AppError  {
    
        private String message;
        private String reason;
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public String getReason() {
            return reason;
        }
    
        public void setReason(String reason) {
            this.reason = reason;
        }
    }
    

     

    application 실행 후 실행창에 curl http://localhost:8080/exception 이라고 reqeust 넣거나 browser를 실행하여 http://localhost:8080/exception에 접속하면 예외가 발생되고 그에 따른 예외 처리로 JSON 형태의 error 정보가 response 되는 것을 볼 수 있습니다.

     

     

     

    2) @ControllerAdvice

    예외처리를 전역적으로 관리하기 위한 annotation으로 예외처리를 위한 class를 별도로 만들어 @ControllerAdvice를 붙인 뒤 그 class 안에서 @ExceptionHandler를 사용하여 exception handler를 정의하면 여러 controller에서 이 exception handler를 사용할 수 있습니다.

     

     


    [Custom Error Page]

    custom error page는 error 발생 시 response의 status code에 따라 각각 다른 page를 보여주고 싶을 때 사용합니다.

     

    • custom error page가 위치할 path
      • static page : resources/static/error
      • dynamic page : ?
    • custom error page의 file명
      • 특정 status code를 정확히 명시하는 경우 : 404.html
      • status code 대에 대해 처리하는 경우 : 5xx.html

     

     

    ErrorViewResolver를 구현하여 Server error에 대한 동적인 view를 제공할 수 있습니다.

     

    'Spring > Spring boot' 카테고리의 다른 글

    [20] Spring Web MVC : CORS  (0) 2020.07.04
    [19] Spring Web MVC : Spring HATEOAS  (0) 2020.06.30
    [17] Spring Web MVC : HtmlUnit  (0) 2020.06.26
    [16] Spring Web MVC : Template Engine  (0) 2020.06.24
    [15] Spring Web MVC : Index page and Favicon  (0) 2020.06.24

    댓글

Designed by Tistory.