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 메서드가 동작한다.


참조 포스팅

1. https://jeong-pro.tistory.com/195

2. https://yinq.tistory.com/209