스프링 부트의 예외 처리 방식
- 스프링 부트의 예외 처리 방식은 크게 2가지
1. @ControllerAdvice를 통한 모든 Controller에서 발생할 수 있는 예외 처리
- 모든 컨트롤러에서 발생할 예외를 정의
2. @ExceptionHandler를 통한 특정 Controller의 예외 처리
- 발생하는 예외 마다 처리할 메소드를 정의
@ControllerAdvice, @RestControllerAdvice
- @ControllerAdvice는 Spring에서 제공하는 어노테이션
- @ControllerAdvice나 @RestController에서 발생하는 예외를 한 곳에서 관리하고 처리할 수 있게 하는 어노테이션
- 설정을 통해 범위 지정이 가능하며, Default 값으로 모든 Controller에 대해 예외 처리를 관리함
- @RestControllerAdvice(basePackages="com.hooney.server") 와 같이 패키지 범위를 설정할 수 있음
- 예외 발생 시 json의 형태로 결과를 반환하기 위해서는 @RestControllerAdvice를 사용하면 된다.
@ExceptionHandler
- 예외 처리 상황이 발생하면 해당 Handler로 처리하겠다고 명시하는 어노테이션
- 어노테이션 뒤에 괄호를 붙여 어떤 ExceptionClass를 처리할 지 설정할 수 있음
- @ExceptionHandler(XXXXException.class)
- Exception.class는 최상위 클래스로 하위 세부 예외 처리 클래스로 설정한 핸들러가 존재하면, 그 핸들러가 우선처리하게 되며, 처리 되지 못하는 예외 처리에 대해 ExceptionClass에서 핸들링한다.
- @ControllerAdvice로 설정된 클래스 내에서 메소드로 정의할 수 있지만, 각 Controller 안에 설정도 가능
- 전역 설정(@ControllerAdvice)보다 지역 설정(Controller)으로 정의한 Handler가 우선순위를 가진다.
- 예시(Controller)
@PostMapping("/exception")
public void exceptionTest() throws Exception {
throw new Exception();
}
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Map<String, String>> ExceptionHandler(Exception e) {
HttpHeaders responseHeaders = new HttpHeaders();
HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
log.info("Controller 내 ExceptionHandler 호출");
Map<String, String> map = new HashMap<>();
map.put("error type", httpStatus.getReasonPhrase());
map.put("code", "400");
map.put("message", "ERROR!!");
return new ResponseEntity<>(map, responseHeaders, httpStatus);
}
- 예시2
@RestControllerAdvice
public class HooneyExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Map<String, String>> ExceptionHandler(Exception e) {
HttpHeaders responseHeaders = new HttpHeaders();
HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
log.info("Advice 내 ExceptionHandler 호출");
Map<String, String> map = new HashMap<>();
map.put("error type", httpStatus.getReasonPhrase());
map.put("code", "400");
map.put("message", "ERROR!!");
return new ResponseEntity<>(map, responseHeaders, httpStatus);
}
}
- 예시 1이 기본적으로 먼저 실행되지만, 예시 1이 없을 경우 예시 2가 실행된다.
- 예시 2는 클라이언트로 에러처리를 넘길 경우 사용하는 경우가 많다.
- 참고
https://www.youtube.com/watch?v=5XHhAhN-9po&list=PLlTylS8uB2fBOi6uzvMpojFrNe7sRmlzU&index=19
https://www.youtube.com/watch?v=5XHhAhN-9po&list=PLlTylS8uB2fBOi6uzvMpojFrNe7sRmlzU&index=18
'개발 > Java & Kotlin' 카테고리의 다른 글
[Spring] 테스트 커버리지 확인하기 (0) | 2022.11.22 |
---|---|
[Spring] 테스트 코드 적용하기 (0) | 2022.11.21 |
[Spring] 알아두면 좋은 디자인 패턴 (1) | 2022.11.15 |
[Spring] RestTemplate 사용하기 (0) | 2022.10.31 |
[JPA] fetchCount() 대체하기 (2) | 2022.10.25 |