Spring/팀스파르타

50. ExceptionHandler, Spring의 Global 예외처리

열심히 해 2024. 12. 6. 14:57

에러라는 관심사를 분리해서 더 효율적으로 처리 할 수 있지 않을까 -> ExceptionHandler !!

 

 

 

 

출처: https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

 

 

서버가 응답을 보낼 때 start-line에 있는 응답 코드를 보겠습니다. 응답 헤더에는 API 요청에 대한 상태코드를 함께 보냅니다.

관련 포스팅 : 

ResponseEntity란 무엇일까 - https://tes1194.tistory.com/98

HTTP란 무엇일까? - https://tes1194.tistory.com/86

 

 

 

 

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class FolderController {
    private final FolderService folderService;

    @PostMapping("/folders")
    public void addFolders(@RequestBody FolderRequestDto requestDto, @AuthenticationPrincipal UserDetailsImpl userDetails){
        List<String> folderNames = requestDto.getFolderNames();
        folderService.addFolders(folderNames, userDetails.getUser());
    }

    @GetMapping("/folders")
    public List<FolderResponseDto> getFolders(@AuthenticationPrincipal UserDetailsImpl userDetails) {
        return folderService.getFolders(userDetails.getUser());
    }

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

 

  • Controller 의 모든 메서드에 예외처리 적용(AOP) : @ExceptionHandler
    • @ExceptionHandler는 Spring에서 예외처리를 위한 애너테이션입니다.
    • 이 애너테이션은 특정 Controller에서 발생한 예외를 처리하기 위해 사용됩니다.
    • **@ExceptionHandler**가 붙어있는 메서드는 Controller에서 예외가 발생했을 때 호출 되며, 해당 예외를 처리하는 로직을 담고 있습니다.
    • AOP를 이용한 예외처리 방식이기때문에 위에서 본 예시처럼 메서드 마다 try catch할 필요없이 깔금한 예외처리가 가능합니다.

 

 

위처럼 @ExceptionHandler가 붙은 메서드를 Controller의 내부에 넣을 수도 있고

아래처럼 클래스를 만들어 모든 컨트롤러에 적용할 수도 있습니다.

 

/* 모든 컨트롤러에서 발생하는 예외 처리를 잡아올 수 있습니다.
아래에서 ResponseEntity<>를 반환하기 때문에 @ResponseBody + @ControllerAdvice인 @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
        );
    }
}

 

 

 

Spring의 Global 예외처리

 

 

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

'Spring > 팀스파르타' 카테고리의 다른 글

51. Spring의 properties 파일을 이용한 에러 메시지 관리  (1) 2024.12.09
49. Spring AOP  (0) 2024.12.06
48. OAuth로 카카오 로그인 및 회원 가입  (0) 2024.12.06
47. 소셜 로그인 - OAuth  (0) 2024.12.06
44. Mockito  (0) 2024.12.06