여기서의 예외는 서버에서 발생하는 오류를 뜻합니다.
이 오류가 발생했을 때에 어떻게 처리하는지를 예외 처리라고 하며,
이 예외 처리를 하는 목적에 대해서 먼저 알아보겠습니다.
사용자에게 명확한 에러 메시지를 전달
사용자에게 현재의 에러가 어떤 문제가 있는지를, 뭐가 잘못되었는지를
알려주어 사용자 경험 상승
개발자에게 문제 상황을 추적 가능하게 함
어떤사용자가 어떤 요청에서 어떤 문제가 생겼는지를 확인하여 디버깅 및
유저의 문제를 파악
본 글에서는 예외를 처리하는 방법들 중에 @ExceptionHandler를 사용하여
에러를 처리하는 방안에 대해서 알아 볼 것입니다.
예시를 보며 각 역할에 대해서 알아보도록 하겠습니다.
ex)
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException e) {
ErrorResponse error = new ErrorResponse("USER_NOT_FOUND", e.getMessage());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception e) {
ErrorResponse error = new ErrorResponse("INTERNAL_ERROR", "알 수 없는 오류가 발생했습니다.");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
}
@ControllerAdvice
Spring MVC 전역 컨트롤러 설정을 도와주는 클래스 레벨 어노테이션으로,
모든 컨트롤러(@Controller)에 대해 예외 처리, 바인딩 설정, 모델 속성 공유
등의 역할을 전역적으로 처리할 수 있는 도우미 클래스 로 만들어주는 어노테이션 입니다.
@ExceptionHandler(----Exception.class)
괄호 안의 ----Exception이 throw 되었을때에 어떻게 작동 할 것인지를
해당 어노테이션이 붙은 메소드에서 정의하는 어노테이션,
특정 예외가 발생 하였을 때에 어떠한 동작을 하며, 어떠한 값을 리턴해
줄 것인지를 구현 할 수 있습니다.
@ControllerAdvice 어노테이션이 붙은 클래스 안에서 구현하여
모든 Controller에서 적용 시킬 수도 있습니다.
@ExceptionHandler, 그래서 왜 쓰는 걸까요?
사용했을 때의 장점으로 알아 봅시다!
지금까지 예외 발생을 경계하는 곳에 try-catch문으로 감싸서
에러를 처리했었습니다.... 만!
ex)
try {
userService.getUser(id);
} catch (UserNotFoundException e) {
// 처리
}
ExceptionHandler를 쓰면, 예외 처리를 별도 메서드나 전용 클래스에
따로 분리하여 구현 할 수 있기 때문에,
코드의 가독성이 좋아지고, 관심사 분리가 명확해 집니다.
@ControllerAdvice와 함께 사용하여 프로젝트 전체에서 발생하는 예외를
중앙에서 한 번에 처리, 컨트롤러마다 똑같은 예외 처리 안해도 됨으로,
유지보수성이 증가합니다.
예외가 발생했을 때 어떤 HTTP 상태코드로 응답할지,
응답 포멧을 자유롭게 설정할 수 있습니다.
@ControllerAdvice로 전역에서 구조화된 방식으로 예외를 처리 해 봅시다!