API 예외처리란?

금은체리·2023년 11월 30일
0

Spring

목록 보기
46/49

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

  1. 웹 애플리케이션의 "예외"에 대해 다시 한 번 인지할 필요성 존재
    • 웹 애플리케이션에서의 에러를 Client와 Server 모두가 잘 알지 못하면,
    • 서비스하는 환경에서 발생하는 에러에 대해서 제대로 대응 불가능
  2. 관심사를 분리해서 더 효율적으로 처리 할 수 있지 않을까하는 고민의 시간이 필요

웹 애플리케이션의 에러

  • 서버가 응답을 보낼 때 start-line에 있는 응답 코드를 봄
  • 응답 헤더에는 API 요청에 대한 상태코드도 같이 보냄
  • 상태코드는 세자리로 되어있는 해당번호에 각각의 의미가 존재
  • 모든 상태코드를 알 필요는 없지만, 주로 쓰는 몇가지의 코드와 가장 앞자리숫자가 어떤 것을 의미하는지는 알아두자!
  • 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번대의 상태코드는 서버 에러, 즉 정확한 요청에 서버쪽 사유로 에러가 난 상황을 의미
  • 현재 중복 폴더 Error 발생 시 어떻게 응답되는지 Client 에러 메시지 확인

    • 현재 내부적으로 Security에 의해서 Error가 발생하자 로그인 페이지를 반환
    • Client에서는 이를 제어하여 Error가 발생한 것 처럼 처리하고 있었음
    • 따라서 제대로 된 Error 처리를 위해 요구사항을 보내옴
  • Client의 Error 처리에 대한 요구사항

    1. 폴더 중복 발생 시 상태코드는 400
      • statusCode : 400
    2. errorMessage : 중복된 폴더명을 제거해 주세요! 폴더명: {중복 폴더명}

Spring 예외처리 방법

  1. Controller 코드 수정

    • ResponseEntity는 HTTP response object를 위한 Wrapper

      • HTTP status Code
      • HTTP headers
      • HTTP body
    • 를 담아서 response로 내려주면 간편하게 처리 가능

       @PostMapping("/folders")
       public ResponseEntity<RestApiException> addFolders(@RequestBody FolderRequestDto folderRequestDto,
                                        @AuthenticationPrincipal UserDetailsImpl userDetails) {
           try {
               List<String> folderNames = folderRequestDto.getFolderNames();
      
               folderService.addFolders(folderNames, userDetails.getUser());
               return new ResponseEntity<>(HttpStatus.OK);
           } catch(IllegalArgumentException ex) {
               RestApiException restApiException = new RestApiException(ex.getMessage(), HttpStatus.BAD_REQUEST.value());
               return new ResponseEntity<>(
                       // HTTP body
                       restApiException,
                       // HTTP status code
                       HttpStatus.BAD_REQUEST);
           }
       }
      • addFolders 메서드를 보면 이제 try-catch문을 통해서
        return new ResponseEntity<>(HttpStatus.OK);

        return new ResponseEntity<>(
        // HTTP body
        restApiException,
        // HTTP status code
        HttpStatus.BAD_REQUEST);

      • 이렇게 나뉘어서 응답을 내주는 것 을 볼 수 있음

      • 에러문구도 캐치하고, 그에 따라서 어느 부문에서 오류가 났는지 적어서 보내 줄 수 있음

  2. @ExceptionHandler 사용

    • FolderController 의 모든 메서드에 예외처리 적용 (AOP) : @ExceptionHandler
      • @ExceptionHandler 는 Spring에서 예외처리를 위한 애너테이션
      • 이 애너테이션은 특정 Controller에서 발생한 예외를 처리하기 위해 사용됨
      • @ExceptionHandler 가 붙어있는 메서드는 Controller에서 예외가 발생했을 때 호출 되며, 해당 예외를 처리하는 로직을 담고 있음
  3. 예외처리 적용 결과 확인

profile
전 체리 알러지가 있어요!

0개의 댓글