에러라는 관심사를 분리해서 더 효율적으로 처리 할 수 있지 않을까 -> ExceptionHandler !!
서버가 응답을 보낼 때 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
);
}
}
- @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 |