
@ControllerAdvice는 스프링 MVC의 전역 예외 처리와 공통적인 기능을 제공합니다.
이 어노테이션을 사용하면 애플리케이션 전역에서 발생하는 예외를 한 곳에서 처리할 수 있어,
코드의 중복을 줄이고 유지 보수를 용이하게 합니다.
@ControllerAdvice는 컨트롤러의 전역 설정, 공통 기능 적용,
예외 처리 등을 중앙 집중화할 수 있습니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
// 글로벌 예외 처리 클래스
@ControllerAdvice
public class GlobalExceptionHandler {
// NullPointerException 예외 처리
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public ErrorResponse handleNullPointerException(NullPointerException ex) {
return new ErrorResponse("NULL_POINTER", "A null pointer exception occurred: " + ex.getMessage());
}
// 모든 예외를 처리하는 일반 예외 처리
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public ErrorResponse handleException(Exception ex) {
return new ErrorResponse("INTERNAL_ERROR", "An internal error occurred: " + ex.getMessage());
}
// 에러 응답 클래스
public static class ErrorResponse {
private String errorCode;
private String message;
// 생성자, getter, setter
public ErrorResponse(String errorCode, String message) {
this.errorCode = errorCode;
this.message = message;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
}
원인: @ControllerAdvice 클래스가 스프링의 컴포넌트 스캔 범위에 포함되지 않았거나,
예외를 처리할 메서드가 누락되었을 수 있습니다.
해결: @ControllerAdvice 클래스가 애플리케이션의 컴포넌트 스캔 범위에 포함되도록 패키지
구조를 확인하고, 필요한 예외 처리를 위한 메서드를 추가합니다.
@ComponentScan을 사용하여 올바른 패키지를 스캔하도록 설정합니다.
원인: 예외가 특정 클래스 또는 패키지에서 발생하고 @ExceptionHandler 메서드가 그 예외를
처리하지 않거나, 예외 처리 메서드가 잘못된 타입을 지정한 경우입니다.
해결: @ExceptionHandler 어노테이션에 지정된 예외 타입이 실제로 발생하는
예외와 일치하는지 확인합니다.
예외 처리 메서드의 파라미터 타입이 올바른지 확인하고, 메서드의 반환 타입과 응답 상태를 검토합니다.
@ControllerAdvice를 활용하면 스프링 애플리케이션에서 예외를 효율적으로 처리할 수 있어
코드의 가독성과 유지 보수성이 크게 향상됩니다.
전역적으로 예외를 처리할 수 있는 중앙 집중화된 접근 방식은 복잡한 시스템에서 예외를 관리하는 데 매우 유용하며,
예외 처리 로직을 재사용 가능하게 만들어줍니다.
이러한 패턴은 코드의 중복을 줄이고, 일관된 예외 응답을 보장하여 개발자의 생산성을 높이는 데 기여합니다.