스프링MVC 예외처리

김성수·2022년 11월 28일
0

SEB_BE

목록 보기
14/31

애너테이션

@ExceptionHandler

유효하지 않은 요청 데이터가 API 계층으로 와서 예외가 발생할 때, 클라이언트쪽으로 요청 데이터가 유효하지 않다는 정보를 가진 ResponseEntity 객체를 반환하는 메서드가 있다고 가정할 때,

@ExceptionHandler
public ResponseEntity 예외처리메서드이름(발생한예외) {
~~~
}

이런 식으로 Controller 클래스에 메서드가 구현되어있으면, API 계층으로 전달된 요청데이터가 유효하지 않아서 예외를 발생하게 될 때, @ExceptionHandler 애너테이션이 있고, 발생한 예외에 대한 객체를 동일한 매개변수로 가지는 메서드가 있을 때,
컨트롤러 내에서 구현된 메서드가 그 예외를 처리해서 요청데이터가 유효하지 않다는 메세지의 정보를 가지고 있는 ResponseEntity객체를 클라이언트로 보내준다.

@ExceptionHandler의 단점

해당 발생하는 예외마다 Controller에서 ExceptionHandler메서드를 계속 추가로 구현해줘야 한다.

  • 클래스 내에서 코드 중복이 발생한다.
  • 발생하는 예외마다 ExceptionHandler 메서드를 추가하면, 코드가 늘어날 수 밖에 없다. 그리고 예외가 한 두가지도 아니다..

@RestControllerAdvice

특정 클래스에서 이 애너테이션을 추가하면 여려 개의 Controller클래스에서 @ExceptionHandler,@InitBinder,@ModelAttribute가 추가된 메서드를 공유해서 사용가능하다.
즉, 이 애너테이션을 추가한 클래스를 이용하면 예외처리를 공통화 할 수 있다는 것이다.

@ResponseStatus

컨트롤러 메서드 앞에 붙일 수 있는 애너테이션으로써 값으로 응답상태코드를 지정할 수 있다.

@RestControllerAdvice

쉽게 생각하면, @RestControllerAdvice@ControllerAdvice+@ResponseBody라고 할 수 있다..

Custom Exception을 정의할 때

enum으로 정의하는 것이 좋다. enum으로 정의하면 비즈니스로직에서 발생하는 다양한 유형의 예외를 enum에 추가해서 사용할 수 있다.

profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

1개의 댓글

comment-user-thumbnail
2022년 11월 29일

커밋 ㅇ

답글 달기