@ControllerAdvice란?

젼이·2024년 12월 1일

@ControllerAdvice는 Spring Framework에서 제공하는 어노테이션으로, 전역적으로 모든 컨트롤러에서 공통적인 동작을 정의할수 있도록 도와준다. 주로 예외 처리, 데이터 바인딩, 또는 모델 개게를 컨트롤러 메서드에 추가하는 데 사용된다.




주요 역할

  1. 전역 예외 처리
    모든 컨트롤러에서 발생하는 예외를 처리하는 전역적인 핸들러를 정의할 수 있습니다.

  1. 전역 데이터 바인딩
    모든 컨트롤러에서 사용할 수 있는 공통 데이터나 모델 속성을 정의할 수 있다.

  1. 전역 데이터 변환
    데이터 포맷팅이나 커스텀 데이터 변화기를 적용할 수 있다.



사용 시점

  • 여러 컨트롤러에서 반복적으로 사용되는 로직을 중앙에서 관리해야 할 때
  • 공통적인 예외 처리가 필요할 때
  • 컨트롤러 메서드마다 반복적으로 모델 데이터를 추가해야 하는 경우



예시

  1. 전역 예외 처리
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGlobalException(Exception ex) {
        return new ResponseEntity<>("Something went wrong: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

상황:

  • 모든 컨트롤러에서 Exception이나 특정 예외가 발생할 때, 해당 핸들러가 실행된다.
  • 예외 처리를 각 컨트롤러에서 반복적으로 작성할 필요가 없다.

  1. 전역 데이터 바인딩
@ControllerAdvice
public class GlobalModelAttribute {

    @ModelAttribute("appName")
    public String addGlobalAttributes() {
        return "My Application";
    }
}

상황:

  • 모든 컨트롤러의 뷰에서 공통적으로 사용할 appName 속성을 추가한다.
  • 예를 들어, Thymeleaf 템플릿에서 ${appName}으로 접근 가능

  1. JSON 데이터 변환 예외 처리
@ControllerAdvice
public class JsonExceptionHandler {

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<String> handleInvalidJson(HttpMessageNotReadableException ex) {
        return new ResponseEntity<>("Invalid JSON format: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

상황:

  • 클라이언트가 잘못된 JSON 데이터를 보냈을 때, HttpMessageNotReadableException을 처리하여 사용자 친화적인 에러 메시지를 반환한다.



사용하면 안 되는 경우

  • 특정 컨트롤러나 특정 상황에서만 처리해야 하는 경우.
    이런 경우에는 해당 컨트롤러 내부에 직접 예외 핸들러를 작성하는 것이 적합하다.



요약

@ControllerAdvice는 모든 컨트롤러에 적용되는 공통 로직을 정의할 때 유용하다.
이를 사용하면 코드의 중복을 줄이고, 유지보수를 용이하게 할 수 있다.
전역 예외 처리와 공통 데이터 추가가 가장 일반적인 사용 사례이다.

profile
신입 개발자 임니당 : > (2025.02.05~)

0개의 댓글