Spring Boot @RestControllerAdvice

과녁스·2021년 9월 27일
0

Spring

목록 보기
5/14
post-thumbnail
post-custom-banner

개요


@RestControllerAdvice는 Spring Boot에서 예외 처리, 데이터 바인딩, 전역적인 JSON 변환 등의 기능을 제공하는 어노테이션입니다. 주로 전역 예외 처리를 위해 사용되며, @ExceptionHandler, @InitBinder, @ModelAttribute 같은 어노테이션과 함께 사용할 수 있습니다.

@RestControllerAdvice@ControllerAdvice와 동일하지만, REST 컨트롤러에 국한된 역할을 합니다. @ControllerAdvice는 일반적인 컨트롤러를 포함한 모든 컨트롤러에 적용되는 반면, @RestControllerAdvice는 주로 @RestController가 적용된 컨트롤러에서 발생하는 상황에만 적용됩니다. 즉, JSON이나 XML 형식의 데이터를 반환하는 API에서 주로 사용됩니다.

주요 기능

  1. 전역 예외 처리: 애플리케이션 전체에서 발생할 수 있는 예외를 한 곳에서 처리할 수 있습니다.
  2. 데이터 바인딩 처리: 컨트롤러로 전달되는 요청 데이터에 대한 전처리 작업을 할 수 있습니다.
  3. 전역적으로 JSON 변환 설정: 모든 컨트롤러에서 반환되는 응답의 형식이나 변환 규칙을 일관되게 설정할 수 있습니다.

@RestControllerAdvice의 구성 요소

  • @ExceptionHandler: 특정 예외를 처리하기 위한 메서드에서 사용합니다.
  • @InitBinder: 컨트롤러의 특정 요청에 대한 바인딩 설정을 커스터마이징할 때 사용합니다.
  • @ModelAttribute: 모든 컨트롤러에서 공통적으로 사용할 모델 속성을 정의합니다.

사용법


기본 사용

간단하게 모든 예외에 대한 처리 방법을 만들 경우 아래와 같이 만들 수 있다.

@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!!!!!!!!!!!!!";
}

JSON 응답으로 예외 정보 반환

@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;
        }
    }
}

장점

  1. 중앙집중화된 예외 처리: 모든 컨트롤러에서 발생하는 예외를 하나의 클래스에서 관리할 수 있어 코드의 중복을 줄이고 유지보수를 용이하게 합니다.
  2. 특정 컨트롤러에 한정된 적용: @RestControllerAdvice에 특정 컨트롤러 패키지나 클래스만 지정할 수도 있습니다.
@RestControllerAdvice(basePackages = "com.example.myapp.controllers")
public class SpecificControllerAdvice { }
  1. REST API에 적합한 응답 형식 제공: Spring MVC와는 달리 REST 컨트롤러에서 발생하는 예외를 JSON이나 XML 등의 형식으로 쉽게 응답할 수 있습니다.
profile
ㅎㅅㅎ
post-custom-banner

0개의 댓글