-
[18] Spring Web MVC : ExceptionHandlerSpring/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