[Spring Boot #18] 스프링 부트 ExceptionHandler
- Spring/Spring Boot
- 2019. 1. 5. 15:05
| 스프링 부트 ExceptionHandler
- 스프링 부트에서는 ExceptionHandler를 기본적으로 등록하여 Exception을 처리하고 있습니다.
- 기본 예외 처리기는 스프링에서 자동적으로 등록하는 BasicErrorController에서 관리합니다. ( 에러 발생 시 JSON 형식으로 리턴 )
- 커스텀 Exception 핸들러, 커스텀 Exception 클래스를 만들어서 예외를 처리할 수 있습니다.
- Http Status 코드에 맞게 예외 발생시 html 문서를 클라이언트에 전송할 수 있습니다.
| 샘플 예제
프로젝트 구조
| pom.xml
+---src
| +---main
| | +---java
| | | \---com
| | | \---tutorial
| | | \---springboottutorial
| | | | AppError.java
| | | | SampleController.java
| | | | SampleException.java
| | | | SpringBootTutorialApplication.java
| | | |
| | |
| | \---resources
| | | application.properties
| | |
| | +---static
| | | \---error
| | | 404.html
| | | 5xx.html
| | |
| | \---templates
소스 코드
@SpringBootApplication
public class SpringBootTutorialApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootTutorialApplication.class, args);
}
}
public class SampleException extends RuntimeException {
}
- 커스톰 Exception 클래스를 표현한 샘플 클래스입니다. ExceptionHandler에서 해당 Exception이 발생할 때 처리할 수 있는 로직을 구현할 수 있습니다.
public class AppError {
String message;
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;
}
}
- Exception 발생 시 해당 Exception에 대한 정보를 저장하는 용도로 작성된 클래스입니다.
@Controller
public class SampleController {
@GetMapping("/hello")
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("Critical Issue");
return appError;
}
}
- 사용자 측에서 /hello 요청이 왔을 때 위에서 작성한 SampleException을 발생시킵니다. 이 때 @ExceptionHandler 어노테이션이 해당 예외를 받아서 처리할 수 있습니다.
- appError 객체에 Exception 관련 정보를 넣고 사용자에게 JSON 포맷으로서 자동 반환됩니다.
결과 화면
| 예외 발생 시 HTML 문서로 사용자에게 반환하기
프로젝트 구조
| pom.xml
+---src
| +---main
| | +---java
| | | \---com
| | | \---tutorial
| | | \---springboottutorial
| | | | AppError.java
| | | | SampleController.java
| | | | SampleException.java
| | | | SpringBootTutorialApplication.java
| | |
| | \---resources
| | | application.properties
| | |
| | +---static
| | | \---error
| | | 404.html
| | | 5xx.html
- HTML 문서를 작성할 시 HTTP Status 코드에 맞게 Html 문서를 작성해야 합니다.
- HTML 문서의 파일명이 상태코드와 같거나 아니면 5xx 와 같이 패턴을 맞추어서 만들어야 합니다.
!--404.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello 404</h1>
</body>
</html>
<!--5xx.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello 505</h1>
</body>
</html>
소스 코드
@Controller
public class SampleController {
@GetMapping("/hello")
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("Critical Issue");
// return appError;
// }
}
결과 화면
- Root(/) 를 처리하는 코드를 만들지 않았기 때문에 Not Found(Status code : 404)가 리턴되고 그에 맞춰 HTML 문서 404.html 이 반환됩니다.
- /hello 요청을 처리하는 코드를 작성했지만 예외가 발생했기 때문에 Status code : 505 가 리턴되고 그에 맞춰 HTML 문서 5xx. html이 반환됩니다.
참고자료 : https://www.inflearn.com/course/스프링부트
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot #20] 스프링 부트 CORS (0) | 2019.01.05 |
---|---|
[Spring Boot #19] 스프링 부트 Spring HATEOAS (1) | 2019.01.05 |
[Spring Boot #17] 스프링 부트 HtmlUnit 써보기 (0) | 2019.01.05 |
[Spring Boot #16] 스프링 웹 MVC : Thymeleaf 템플릿 (0) | 2019.01.04 |
[Spring Boot #15] 스프링 웹 MVC : 인덱스 페이지와 파비콘 (0) | 2019.01.03 |
이 글을 공유하기