⏰ 2024. 06. 26 수
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
API 예외처리
웹 애플리케이션의 예외
에 대하여 다시 인지할 필요가 있다. 만약 웹 애플리케이션에서의 에러를 클라이언트와 서버 모두 알지 못한다면, 서비스하는 환경에서 발생하는 에러
에 대응할 수 없기 때문이다.
에러를 처리하는 것 역시 관심사
를 분리해서 더 효율적으로 처리하는 방법에 대해 알아야 하기 때문이다.
응답(Response) 메세지의 시작 줄(start-line)은 상태 줄
이다.
상태 줄은 프로토콜 버전
, 요청의 성공 여부를 나타내는 상태코드
, 상태코드에 대한 상태메세지
로 구성된다.
프로토콜 버전
은 보통 HTTP/1.1이고 가끔 HTTP2도 있다.
상태코드
는 OK
를 나태내는 200, BAD REQUEST
를 나타내는 400 등 요청을 처리한 결과 또는 오류에 대한 HttpStatus이다.
상태메세지
는 HTTP 메세지를 이해하기 위해 필요한 상태 코드에 따라 정보를 제공하기 위한 메세지이다.
ResponseEntity
사용하는 방법과 @ExceptionHandler
를 사용해 처리하는 방법이 있다.ResponseEntity
객체는 HTTP Response Object를 담기 위한 Wrapper 객체이다.
생성자를 통해 StatusCode, Header, Body를 담아 생성할 수 있다.
응답할 때 어떤 상태코드와 어떤 내용을 담은 객체를 Body에 담아 응답할지 선택할 수 있다.
try-catch 문을 통해 두가지 ResponseEntity로 나눠 응답할 수 있다
ResponseEntity를 통해 모든 Controller에서 해당 작업을 해야하는 일은 너무 번거롭기 때문에 AOP 기능으로 @ExceptionHandler
사용함으로써 모듈화할 수 있다.
@ExceptionHandler
는 Controller에서 발생한 예외를 처리하기 위해 사용한다.
@ExceptionHandler
이 설정된 메서드는 Controller에서 예외가 발생했을 때 호출되고, 예외를 처리하는 로직을 담당한다.
AOP를 이용한 예외처리 방식이기에 반복적인 Try-Catch문을 사용할 필요 없이 예외처리할 수 있다.
Global 예외처리
예외처리 로직은 공통적이고 제대로 짜여진 로직은 해당 예외에 대해 대응할 수 있다.
그렇기 때문에 Contoller에서 발생하는 예외이든, Service에서 발생하는 예외이든, 어떤 계층에서 발생하는 예외든 Client가 해석 가능한 모습으로 정제하여 응답해주는 방법이 Global 예외처리
이다.
@ControllerAdvice
은 Spring에서 예외처리를 위한 클래스 레벨 애너테이션이다.
@ControllerAdvice
이 설정된 클래스에서 @ExceptionHandler
설정한 메서드를 정의하여 예외를 처리하는 로직을 구현할 수 있다.
예외처리를 중앙 집중화하기 좋다.
하나의 예외에 대해 대응되는 로직을 반복하지 않아도 되기 때문에 코드의 중복을 방지하고 유지보수성을 높인다.
예외처리 로직을 모듈화하여 관리하고 쉽고, 공통된 예외처리 로직을 공유하거나 참고할 수 있기 때문에 개발 생상선이 향상된다.
@RestControllerAdvice
애너테이션은 @ContollerAdvice
+ @ResponseBody
를 합친 기능을 한다.