Spring/Spring Framework
@ControllerAdvice에 대해 알아보자.
Ynghan
2024. 3. 22. 14:46
이 글은 @ControllerAdvice에 대한 동작원리를 이해하기 위해서 다른 외부 블로그나 링크들을 참조하여 정리한 포스팅 입니다.
@ControllerAdvice를 사용하는 이유
많은 예외 처리들을 적용하게 되면 코드량이 증가하고 복잡해집니다. 따라서, 비지니스 로직에 집중하기 힘들고 유지보수 하기가 어려워 집니다. 이러한 문제를 개선하기 위해서 @ExceptionHandler와 @ControllerAdvice를 사용한다고 생각하면 됩니다.
여러 예외 처리들을 적용하다보면 코드가 엄청나게 복잡해진다. 그렇게 되면 유지보수하기 아주 어려워진다.
또한, 비지니스 로직에 집중하기 어렵고, 비지니스 로직과 관련된 코드보다 예외 처리를 위한 코드가 더 많아지는 경우도 생긴다.
이런 문제를 조금이라도 개선하기 위해 @ExceptionHandler와 @ControllerAdvice를 사용한다고 보면 이해가 쉬워진다.
@ControllerAdvice의 동작 코드
Enum 타입의 ErrorCode 정의
@AllArgsConstructor
@Getter
public enum ErrorCode {
USER_NOT_EXIST(HttpStatus.NOT_FOUND, "존재하지 않는 회원입니다.")
private final HttpStatus httpStatus;
private final String message;
}
Http 상태 코드와 에러 발생 시 전달할 message가 담긴 Enum 타입 ErrorCode 정의.
RuntimeException을 상속하는 CustomApiException을 정의
@Getter
public class CustomApiException extends RuntimeException {
private final ErrorCode errorCode;
public CustomApiException(ErrorCode errorCode){
super(errorCode.getMessage());
this.errorCode = errorCode;
}
}
ErrorCode를 통해 예외 원인 정보를 담고 있다.
CustomApiException을 처리하는 Handler 정의
@RestControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(CustomApiException.class)
public ResponseEntity<?> apiException(CustomApiException e) {
return new ResponseEntity<>(new ResponseDto<>(-1, e.getMessage(), null), HttpStatus.BAD_REQUEST);
}
}
위와 같이 정의하면, 런타임 시 CustomApiException이 발생했을 때, CustomExceptionHandler 메서드가 동작한다.