본문 바로가기
Spring

[TIL] 231220 Spring Boot Global Exception @ControllerAdvice

by studymode 2023. 12. 20.

Spring Boot의 예외처리 방식

 

  1.  @ControllerAdvice를 통한 예외처리
    • 모든 컨트롤러의 예외 처리 (@Cotroller / @RestController)
    • @ControllerAdvice, @RestControllerAdvice가 있다
    • @RestControllerAdvice는 Json형태로 결과 반환
  2. @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()));
    }
}

예외처리 해주는 곳!!!