Spring Boot의 예외처리 방식
- @ControllerAdvice를 통한 예외처리
- 모든 컨트롤러의 예외 처리 (@Cotroller / @RestController)
- @ControllerAdvice, @RestControllerAdvice가 있다
- @RestControllerAdvice는 Json형태로 결과 반환
- @ExceptionHandlerer를 통한 예외처리
- 예외 처리할 메소드 정의
- @ControllerAdvice로 설정된 class 내에서 메소드로 설정하거나
- 각 Controller안에서 설정 가능
- @ControllerAdvice로 설정된 것보다 Controller안에서 설정한게 우선순위가 높음
여기서!! Controller와 RestController의 차이!
@RestController = @Controller + @ResponseBody (두개 에너테이션을 모두 갖고 있음 )
@Controller는 View를 반환할때 사용하고,
@RestController는 Data(Json format)를 반환할 때 사용
출처: https://www.youtube.com/watch?v=nyN4o9eXqm0
GlobalException 예외처리 전
- @Controller
@RestController
@RequiredArgsConstructor
@RequestMapping("api/posts")
public class PostController {
//게시글 개별 조회
@GetMapping("/{postId}")
public ResponseEntity<CommonResponseDto> getPost(@PathVariable Long postId){
try {
PostResponseDto postResponseDto = postService.getPost(postId);
return ResponseEntity.ok().body(postResponseDto);
}catch (IllegalArgumentException e){
return ResponseEntity.badRequest().body(new CommonResponseDto(e.getMessage(), HttpStatus.BAD_REQUEST.value()));
}
}
}
@Service단에서 throw한 예외를 하나씩 try-catch로 잡아줘야 했음
GlobalException 예외처리 적용
- @Controller
@RestController
@RequiredArgsConstructor
@RequestMapping("api/posts")
public class PostController {
//게시글 개별 조회
@GetMapping("/{postId}")
public PostResponseDto getPost(@PathVariable Long postId){
return postService.getPost(postId);
}
}
GlobalExceptionHandler에서 @RestControllerAdvice 에너테이션을 붙이면 AOP로
모든 컨트롤러의 예외처리(try-catch)를 대신 해줌
- @RestControllerAdvice (GlobalExceptionHandler)
@RestControllerAdvice
public class GlobalExceptionHandler {
//IllegalArgumentExcepition 예외처리
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<CommonResponseDto> IllegalArgumentException(IllegalArgumentException e){
return ResponseEntity.badRequest().body(new CommonResponseDto(e.getMessage(), HttpStatus.BAD_REQUEST.value()));
}
//기본 예외처리
public ResponseEntity<CommonResponseDto> handleException(Exception e){
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new CommonResponseDto("Internal Server Error",HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
예외처리 해주는 곳!!!
'Spring' 카테고리의 다른 글
[TIL] 231228 ResponseEntity<T> ResponseEntity<?> 제네릭 클래스 (2) | 2023.12.28 |
---|---|
[TIl] 231221 Spring Security (0) | 2023.12.21 |
[TIL] 231219 Spring JPA ORM (0) | 2023.12.19 |
[TIL] 231219 Spring @JoinColumn @OnDelete (0) | 2023.12.19 |
[TIL] 231219 Timestamped null값 에러 (0) | 2023.12.19 |