[Spring Boot #18] 스프링 부트 ExceptionHandler

| 스프링 부트 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 코드
  • 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/스프링부트


이 글을 공유하기

댓글(0)

Designed by JB FACTORY