어플리케이션내전역적 범위의API에서예외발생 시통일된 Format의DTO로클라이언트에게응답
。@RestControllerAdvice가 선언된Advice 용도의클래스를 정의 및 내부에 특정예외발생 시 처리하는Logic을 작성한@ExceptionHandler가 정의된메서드를 정의
。@ExceptionHandler에 정의된예외의 경우구체화된예외가 선언된메서드를 우선적으로 실행하여 처리
▶MethodArgumentNotValidException가 발생할 경우Exception보다구체화된MethodArgumentNotValidException를 처리하는메서드를 먼저 처리한다.
API에서MethodArgumentNotValidException발생 시 처리하는로직작성하기
@RestControllerAdvice가 선언된Advice 클래스에서예외 처리에 대한Logic을 작성
。@RestControllerAdvice는어플리케이션에서전역적으로 발생하는예외를 catch하여 선언된클래스로 전달
일관성있는JSON format의응답을클라이언트로 전달하기위해DTO를 하나로 통일
。해당DTO객체는DTO내정적팩토리메서드로ResponseEntity에 포함되어 생성 후 반환@Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class ApiErrorResponse { private final String code; private final String message; public static ResponseEntity<ApiErrorResponse> toResponseEntity( HttpStatus httpStatus, String message ) { return ResponseEntity .status(httpStatus) .body( new ApiErrorResponse( httpStatus.toString(), message ) ); } }
DTO 객체를 포함한ResponseEntity<DTO>를 반환하는정적 팩토리 메서드정의
。해당메서드는HttpStatus객체와String을 전달받아DTO 객체생성 후ResponseEntity를 생성하여 반환
- 지정된
Exception발생 시 처리하는@ExceptionHandler 메서드정의
。해당Exception발생 시 자동으로 catch하여 내부logic을 실행
▶객체를 반환하도록 설정 시@ControllerAdvice 클래스에 의해JSON으로직렬화되어Message Body에 포함// 어플리케이션 전역적으로 API에서 발생하는 예외를 가져온다. // 각 @ExceptionHandler에서 지정된 예외를 처리 @Hidden @Slf4j @RestControllerAdvice public class ApiAdvice { // 가장 후순위로 예외를 처리하는 메서드 @ExceptionHandler(Exception.class) public ResponseEntity<ApiErrorResponse> handleException(Exception e) { log.error(e.getMessage(), e); return ApiErrorResponse.toResponseEntity( ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), ErrorCode.INTERNAL_SERVER_ERROR.getMessage() ); } // 사용자 정의 예외를 처리하는 메서드 @ExceptionHandler(CustomException.class) public ResponseEntity<ApiErrorResponse> handleCustomException(CustomException e) { return ApiErrorResponse.toResponseEntity( e.getStatus(), e.getMessage() ); } }。
CustomException발생 시 해당Exception에HttpStatus.BAD_REQUEST,"삭제된 계정이 아닙니다"라는 데이터가 포함된 경우 해당데이터를 기반으로ApiErrorResponse의DTO를 생성 및ResponseEntity로Wrapping하여클라이언트에게 응답
。MethodArgumentNotValidException가 발생할 경우Exception보다구체화된MethodArgumentNotValidException를 처리하는메서드를 우선적으로 실행하여 처리
▶ 사용자가 정의한Custom Exception도 발생한 경우 catch하여 처리할 수 있다.
사용자 정의 예외
@RestControllerAdvice
。Controller의 모든@RequestMapping,@GetMapping,@PostMapping등의REST API Endpoint에서 발생하는Exception을어노테이션이 선언된Advice 용도의클래스로 유도
。@ControllerAdvice + @ResponseBody가 결합된 형태로서예외발생 시 처리되어 반환되는자바객체는 자동으로JSON으로직렬화되어Message Body에 포함되어클라이언트에게 전달
。Swagger를 통한문서화를 수행하는 경우@Hidden을 선언하여 숨겨야한다.
@ExceptionHandler(처리할예외.class)
。지정한Exception Type을 처리하는Logic이 작성된메서드에 선언하는어노테이션
▶ 지정한Exception이 발생한 경우 자동으로catch하여메서드 내부 로직대로 처리
▶Exception Type은클래스 리터럴로 지정 ( ex.Exception.class)
。@ExceptionHandler에 정의된예외의 경우구체화된예외가 선언된메서드를 우선적으로 실행하여 처리
▶Exception이 가장후순위
。Controller내부메서드에 선언 시 해당Controller의API에서 발생되는예외에만 적용
▶@RestControllerAdvice이 선언된Advice 클래스내부메서드에 선언 시 전역적으로 발생하는예외에 적용
@ExceptionHandler({예외1.class, 예외2.class , ... })
。중괄호를 통한배열 형태로 처리할 여러예외를 한번에 지정가능.