24.09.11

윤지현·2024년 9월 11일

TIL

목록 보기
61/75
post-thumbnail

API 예외처리란 무엇일까?

  • 예외처리를 따로 배우는 이유

    • 웹 애플리케이션에서의 에러를 Client와 Server 모두가 잘 알지 못하면 -> Service 환경에서 발생한 에러에 제대로 대응 불가
    • 에러를 처리하는 것 역시 관심사를 분리해서 더 효율적으로 처리할 수 있음
  • 웹 애플리케이션의 에러

    • Response 메시지

      • start-line (상태줄) : API 요청 결과 (상태 코드, 상태 텍스트)

        HTTP/1.1 404 Not Found
        • HTTP 상태 코드 종류
          1. 2xx Success → 200번대의 상태코드는 성공을 의미
          2. 4xx Client Error → 400번대의 상태코드는 클라이언트 에러, 즉 잘못된 요청을 의미
          3. 5xx Server Error → 500번대의 상태코드는 서버 에러, 즉 정확한 요청에 서버쪽 사유로 에러가 난 상황을 의미
  • Spring 예외처리 방법

    1. @ExceptionHandler 사용
      • FolderController 의 모든 메서드에 예외처리 적용 (AOP) : @ExceptionHandler
        • @ExceptionHandler 는 Spring에서 예외처리를 위한 애너테이션
        • 이 애너테이션은 특정 Controller에서 발생한 예외를 처리하기 위해 사용
        • `@ExceptionHandler` **가 붙어있는 **메서드는 Controller에서 예외가 발생했을 때 호출 되며, 해당 예외를 처리하는 로직을 담고 있다.
        • AOP를 이용한 예외처리 방식이기때문에, 위에서 본 예시처럼 메서드 마다 try catch할 필요없이 깔금한 예외처리가 가능
      @ExceptionHandler({IllegalArgumentException.class})
      public ResponseEntity<RestApiException> handleException(IllegalArgumentException ex) {
          RestApiException restApiException = new RestApiException(ex.getMessage(), HttpStatus.BAD_REQUEST.value());
          return new ResponseEntity<>(
                  // HTTP body
                  restApiException,
                  // HTTP status code
                  HttpStatus.BAD_REQUEST
          );
      }
  • 예외처리 적용 결과 확인
    - HTTP 응답 (상태코드)

    - HTTP 응답 본문 (Body)

Spring의 Global 예외처리

  • Global 예외 처리

  • @ControllerAdvice 사용

    • @ControllerAdvice
      • @ControllerAdvice는 Spring에서 예외처리를 위한 클래스 레벨 애너테이션
      • 이 애너테이션은 모든 Controller에서 발생한 예외를 처리하기 위해 사용
      • @ControllerAdvice 가 붙은 클래스에서는 @ExceptionHandler메서드를 정의하여 예외를 처리하는 로직을 담을 수 있다.
      • @ControllerAdvice 를 사용하는 이유?
        • 예외처리를 중앙 집중화하기 좋다.
        • 각각의 Controller에서 예외처리 로직을 반복하지 않아도 됨으로 코드의 중복을 방지하고 유지보수성을 높일 수 있다.
        • 또한, @ControllerAdvice를 사용하면 예외 처리 로직을 모듈화하여 관리하기 쉽기 때문에, 팀 내에서 공통된 예외 처리 로직을 공유하거나 다른 팀에서 예외 처리를 참고할 수 있다. 이를 통해 개발 생산성을 향상시키는 것도 가능.
  • @RestControllerAdvice

    • @ControllerAdvice + @ResponseBody
  • @RestControllerAdvice 적용

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({IllegalArgumentException.class})
    public ResponseEntity<RestApiException> handleException(IllegalArgumentException ex) {
        RestApiException restApiException = new RestApiException(ex.getMessage(), HttpStatus.BAD_REQUEST.value());
        return new ResponseEntity<>(
                // HTTP body
                restApiException,
                // HTTP status code
                HttpStatus.BAD_REQUEST
        );
    }
}
profile
첫 시작

0개의 댓글