본문 바로가기
학습/Spring

[spring] 스프링 웹 MVC의 ExceptionHandler

by KKambi 2020. 4. 26.

ExceptionHandler

- 스프링 부트 실행 시, 기본 예외 핸들러 등록됨 = BasicErrorController

- 콘솔(machine clientf라고 함)에서 curl로 에러페이지 요청 시, json으로 응답이 옴

 

Exception Handling 테스트하기

  1. 예외를 던질 컨트롤러 클래스 작성
    • URL맵핑 -> throw Exception
  2. 예외 클래스 작성
    • RuntimeException 상속
  3. 예외 핸들러에서
    • @ExceptionHandler(SampleException.class)를 선언한 메소드 작성
    • 해당 컨트롤러 안에서, 해당 예외가 발생하면 이 핸들러를 사용하겠다는 의미
    • 이벤트 핸들러처럼, 메소드 파라미터로 예외 객체 받을 수 있음
  4. 커스텀 에러 클래스 구현
  5. @ExceptionHandler 메소드 내에
    • 예외 객체에 담긴 예외 정보를 커스텀 에러 객체에 담아 반환
    • @ResponseBody로 에러 객체 반환 시, 메세지 컨버터를 통해 json 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//예외를 던질 맵핑과, 예외 핸들러 메소드를 구현하는 SampleController.java
@Controller
public class SampleController{
    @GetMapping("/hello")
    public String hello(){
        throw new SampleException();
    }
 
    //해당 컨트롤러 내에서 발생하는 SampleException만을 핸들링
    @ExceptionHandler(SampleException.class)
    public @ResponseBody SampleError handleSampleError(SampleException e){
        SampleError error = new SampleError();
        error.setMessage("샘플에러");
        error.setReason("테스트")
        return error;
    }
}
 
//커스텀 예외 클래스
public class SampleExpcetion() extends RuntimeException{
 
}
 
//커스텀 에러 클래스
public class SampleError(){
    private String message;
    private String reason;
    
    //getter
 
    //setter
}
cs

 

전역적으로 예외 핸들링을 적용하려면?

- 별도 클래스에 @ControllerAdvice 선언

- 똑같이 @ExceptionHandler 구현

 

BasicErrorController 살펴보기

- 클래스에 @Controller 선언

- 클래스에 @RequestMapping("${server.error.path:${error.path:/error}}") 선언

  1. server.error.path에 해당하는 프로퍼티가 있으면 그 값을 맵핑
  2. 없으면, error.path에 해당하는 프로퍼티가 있으면 그 값을 맵핑
  3. 없으면 /error를 맵핑

- 기본적으로 /error를 사용하게 됨

- 커스터마이징

  1. BasicErrorController를 상속한 클래스 생성
  2. Bean으로 등록
  3. 추가적인 예외 핸들링 구현 가능

 

커스텀 에러 페이지 구현

HTTP 응답 코드에 따라 다른 에러 페이지 보여주기!

  1. resources/static/error ( resources/templats/error )에 정적(동적) 페이지를 생성
  2. 응답 코드와 똑같은 이름의 html페이지 생성 (★)
    • 404.html
    • 500.html
    • 4xx.html

 

해당 디렉토리를 맵핑하는 이유

  • 스프링 웹 MVC는 기본적으로 classpath:/static, classpath:/templates 맵핑
  • + BasicErrorController에서 @RequestMapping으로 /error 맵핑

cf) ErrorViewResolver를 구현해서 동적인 에러 페이지 생성 가능

 

댓글