스프링 부트 어플리케이션에서 예외처리하는 방법은 3가지다:
- 전역 처리 Global Level using - @ControllerAdvice
- 컨트롤러단에서 처리 Controller Level using - @ExceptionHandler
- 메소드단위 처리 Method Level using - try/catch
쉽게 어노테이션으로 관리가 가능하다.
@ExceptionHandler 와 @ControllerAdvice 를 이용해서 에러를 관리할 수 있다.
@ExceptionHandler 어노테이션은 @Controller, @RestController가 적용된 bean내에서 발생하는 예외를 처리할 수 있도록 해준다.
예시는 아래와 같이 작성만해 주면 된다.
@RestController
public class TestClass{
......
/**
* 이 컨트롤러 내에서 발생하는 모든 예외를 처리한다 *
* */
@ExceptionHandler(value = Exception.class)
public String exeHandler(Exception e){
System.out.println("ㅇㅇㅇ");
return e.getMessage();
}
}
사용법은 간단하다. @Controller, @RestController 어노테이션이 적용된 컨트롤러 클래스에 @ExceptionHandler 어노테이션을 적용한 메소드내에서 에러가 발생했을때 처리 로직을 구현하면된다. 이때 @ExceptionHandler("처리하고 싶은 에러 클래스")를 적용하여 해당 에러만 처리할 수 있도록 설정이 가능하다.
위의 예제 소스의 경우 Exception이 발생했을때 exeHandler()를 실행하게 된다.
@ExceptionHandler({err.class, err2.class})처럼 여러개의 에러를 필터링 할 수 있다. 해당 어노테이션은 익셉션 핸들러 어노테이션을 등록한 컨트롤러에서만 동작한다.
@ControllerAdvice의 경우에는 모든 @Controller,@RestController에서 발생하는 예외를 핸들링 할 수 있다.
사용법은 별도 클래스 파일을 만들어서 아래와 같이 소스를 작성해 주면 된다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RestException.class)
public ResponseEntity<Map<String, Object>> handler(RestException e) {
Map<String, Object> resBody = new HashMap<>();
resBody.put("message", e.getMessage());
System.out.println("예외 처리 됨");
return new ResponseEntity<>(resBody, e.getStatus());
}
}
public class RestException extends RuntimeException {
private static final long serialVersionUID = 1L;
private HttpStatus status;
private String message;
public RestException(HttpStatus status, String message) {
this.status = status;
this.message = message;
}
public HttpStatus getStatus() {
return status;
}
public void setStatus(HttpStatus status) {
this.status = status;
}
public String getMessage() {
return message;
}
}
위와 같이 소스를 작성하면 모든 @RestController,@Controller에서 발생하는 예외는 모두 handler()를 실행하여 예외를 처리하게 된다.
여기서 @RestControllerAdvice, @ControllerAdvice의 차이점은 리턴 시 json타입으로 데이터를 반환하고 싶을경우 @RestControllerAdvice를 사용하면 된다.
Reference : https://m.blog.naver.com/rhkrehduq/221684602680
'Study > SpringBoot' 카테고리의 다른 글
Entity, DTO, VO 알아보기 (0) | 2021.11.09 |
---|---|
[SpringBoot] 스프링 부트 배치 (0) | 2021.11.05 |
[Spring Boot] 스프링부트 Lombok(롬복) 사용하기 (0) | 2021.11.04 |
[Spring Boot] application.properties -> application.yml로 변경하기. (0) | 2021.11.04 |
Spring Boot에서 외부 경로 매핑 (1) | 2020.11.20 |
댓글