ExceptionHandler
- 스프링 부트 실행 시, 기본 예외 핸들러 등록됨 = BasicErrorController
- 콘솔(machine clientf라고 함)에서 curl로 에러페이지 요청 시, json으로 응답이 옴
Exception Handling 테스트하기
- 예외를 던질 컨트롤러 클래스 작성
- URL맵핑 -> throw Exception
- 예외 클래스 작성
- RuntimeException 상속
- 예외 핸들러에서
- @ExceptionHandler(SampleException.class)를 선언한 메소드 작성
- 해당 컨트롤러 안에서, 해당 예외가 발생하면 이 핸들러를 사용하겠다는 의미
- 이벤트 핸들러처럼, 메소드 파라미터로 예외 객체 받을 수 있음
- 커스텀 에러 클래스 구현
- @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}}") 선언
- server.error.path에 해당하는 프로퍼티가 있으면 그 값을 맵핑
- 없으면, error.path에 해당하는 프로퍼티가 있으면 그 값을 맵핑
- 없으면 /error를 맵핑
- 기본적으로 /error를 사용하게 됨
- 커스터마이징
- BasicErrorController를 상속한 클래스 생성
- Bean으로 등록
- 추가적인 예외 핸들링 구현 가능
커스텀 에러 페이지 구현
HTTP 응답 코드에 따라 다른 에러 페이지 보여주기!
- resources/static/error ( resources/templats/error )에 정적(동적) 페이지를 생성
- 응답 코드와 똑같은 이름의 html페이지 생성 (★)
- 404.html
- 500.html
- 4xx.html
해당 디렉토리를 맵핑하는 이유
- 스프링 웹 MVC는 기본적으로 classpath:/static, classpath:/templates 맵핑
- + BasicErrorController에서 @RequestMapping으로 /error 맵핑
cf) ErrorViewResolver를 구현해서 동적인 에러 페이지 생성 가능
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링 웹 MVC의 CORS 지원 (0) | 2020.05.03 |
---|---|
[spring] 스프링 부트의 Hateoas 지원 (2) | 2020.05.03 |
[spring] 스프링 웹 MVC의 동적 리소스 지원 (Thymeleaf) (0) | 2020.04.25 |
[spring] 스프링에서 WebJars 이용하기 (0) | 2020.04.23 |
[spring] 스프링 웹 MVC의 정적 리소스 지원 (0) | 2020.04.23 |
댓글