@RestControllerAdvice는 Spring Boot에서 예외 처리, 데이터 바인딩, 전역적인 JSON 변환 등의 기능을 제공하는 어노테이션입니다. 주로 전역 예외 처리를 위해 사용되며, @ExceptionHandler, @InitBinder, @ModelAttribute 같은 어노테이션과 함께 사용할 수 있습니다.
@RestControllerAdvice는 @ControllerAdvice와 동일하지만, REST 컨트롤러에 국한된 역할을 합니다. @ControllerAdvice는 일반적인 컨트롤러를 포함한 모든 컨트롤러에 적용되는 반면, @RestControllerAdvice는 주로 @RestController가 적용된 컨트롤러에서 발생하는 상황에만 적용됩니다. 즉, JSON이나 XML 형식의 데이터를 반환하는 API에서 주로 사용됩니다.
간단하게 모든 예외에 대한 처리 방법을 만들 경우 아래와 같이 만들 수 있다.
@RestControllerAdvice
public class GlobalExceptionHandler {
// 특정 예외 처리: IllegalArgumentException
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
// 예외 발생 시 HTTP 400 Bad Request와 함께 예외 메시지를 반환
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
// 모든 예외를 처리하는 범용 핸들러
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
// 예외 발생 시 HTTP 500 Internal Server Error와 함께 예외 메시지를 반환
return new ResponseEntity<>("Internal server error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RestControllerAdvice(annotations = Example.class)
public class ExceptionAdvice {
}
@ExceptionHandler(value = {NullPointerException.class, ArrayIndexOutOfBoundsException.class})
public String exampleExceptionAdvice(RuntimeException e) {
return "exampleException Occurred!!!!!!!!!!!!!";
}
@RestControllerAdvice
public class ApiExceptionHandler {
// 예외를 JSON 형식으로 응답
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST, ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
// 에러 응답을 위한 DTO
public static class ErrorResponse {
private HttpStatus status;
private String message;
public ErrorResponse(HttpStatus status, String message) {
this.status = status;
this.message = message;
}
// Getters and setters
public HttpStatus getStatus() {
return status;
}
public void setStatus(HttpStatus status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
}
@RestControllerAdvice(basePackages = "com.example.myapp.controllers")
public class SpecificControllerAdvice { }