@ControllerAdvice

Yuno·2024년 8월 19일
0

Spring Framework 에서 전역적으로 예외를 처리하거나, 특정 컨트롤러 클래스에 대한 공통 기능을 제공할 때 사용하는 어노테이션.
@ControllerAdvice 를 사용하면 여러 컨트롤러에서 공통적으로 사용될 로직을 한 곳에 모아 관리할 수 있음


👉 주요 기능

  1. 예외 처리(@ExceptionHandler)
  • 어플리케이션 전역에서 발생하는 예외를 한 곳에서 처리할 수 있음. 이로 인해 각 컨트롤러마다 개별적으로 예외 처리 코드를 작성할 필요가 없음
  1. 전역 데이터 바인딩(@ModelAttribute)
  • 모든 컨트롤러에서 공통으로 사용될 데이터를 모델에 바인딩할 수 있음
  1. 전역적인 뷰 설정(@InitBinder)
  • 컨트롤러에서 사용하는 데이터의 포맷팅, 바인딩 규칙 등을 설정할 수 있음

👉 기본 사용법

예외 처리(@ExceptionHandler 와 함께 사용)

@ControllerAdvice
public class GlobalExceptionHandler {
	
    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<Object> handleException(Exception ex) {
    	return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

모든 컨트롤러에서 발생하는 Exception 을 전역적으로 처리함. 예외가 발생하면, HTTP 상태 코드 500과 함께 에러메세지를 반환


전역 데이터 바인딩(@ModelAttribute)

@ControllerAdvice
public class GlobalModelAttribute {
	
    @ModelAttribute
    public void addAttributes(Medel model) {
    	model.addAttribute("globalAttribute", "This is a global attribute");
    }
}

모든 컨트롤러의 뷰에 "globalAttribute" 라는 이름의 속성을 추가


전역적인 데이터 포맷팅(@InitBinder)

@ControllerAdvice
public class GlobalBindingConfig {
	
    @InitBinder
    public void initBinder(WebDataBinder binder) {
    	// 특정 필드 이름에 대해 특정 타입으로 변환하는 커스텀 에디터 설정
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
    }
}

모든 컨트롤러에서 날짜 형식을 "yyyy-MM-dd" 로 처리하도록 설정


📌 @ControllerAdvice의 주요 속성

  • basePackages : 특정 패키지의 컨트롤러에만 적용하고자 할 떄 패키지 경로를 지정
  • assignableTypes : 특정 컨트롤러 클래스에만 적용하고자 할 때 해당 클래스를 지정
  • annotations : 특정 어노테이션이 붙은 컨트롤러에만 적용할 수 있음

🤝 @ControllerAdvice 와 @ExceptionHandler 와의 결합

@ControllerAdvice@ExceptionHandler 와 결합하여 어플리케이션 전반에서 예외를 일관되게 처리할 수 있는 강력한 도구임

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = NullPointerException.class)
    public ResponseEntity<Object> handleNullPointerException(NullPointerException ex) {
        return new ResponseEntity<>("Null value encountered: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(value = IllegalArgumentException.class)
    public ResponseEntity<Object> handleIllegalArgumentException(IllegalArgumentException ex) {
        return new ResponseEntity<>("Illegal argument: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<Object> handleGenericException(Exception ex) {
        return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

이러한 예외 처리를 통해 어플리케이션의 예외 관리를 중앙집중식으로 할 수 있으며, 일관된 오류 응답을 제공할 수 있음

profile
Hello World

0개의 댓글