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

2021. 3. 24. 18:41 Spring Framework/Spring boot #2

| 스프링 부트 ExceptionHandler

  • 스프링 부트에서는 ExceptionHandler를 기본적으로 등록하여 Exception을 처리하고 있습니다.
  • 기본 예외 처리기는 스프링에서 자동적으로 등록하는 BasicErrorController에서 관리합니다. ( 에러 발생 시 JSON 형식으로 리턴 )
  • 커스텀 Exception 핸들러, 커스텀 Exception 클래스를 만들어서 예외를 처리할 수 있습니다.
  • Http Status 코드에 맞게 예외 발생시 html 문서를 클라이언트에 전송할 수 있습니다.

 

| 샘플 예제

 

프로젝트 구조

| pom.xml

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



출처: https://engkimbs.tistory.com/779?category=767865 [새로비]