Spring에서의 예외 처리-ExceptionHandler

이건우·2025년 3월 31일

웹 프로그래밍

목록 보기
39/43

예외 처리의 목적

여기서의 예외는 서버에서 발생하는 오류를 뜻합니다.
이 오류가 발생했을 때에 어떻게 처리하는지를 예외 처리라고 하며,
이 예외 처리를 하는 목적에 대해서 먼저 알아보겠습니다.

  1. 사용자에게 명확한 에러 메시지를 전달
    사용자에게 현재의 에러가 어떤 문제가 있는지를, 뭐가 잘못되었는지를
    알려주어 사용자 경험 상승

  2. 개발자에게 문제 상황을 추적 가능하게 함
    어떤사용자가 어떤 요청에서 어떤 문제가 생겼는지를 확인하여 디버깅 및
    유저의 문제를 파악


@ExceptionHandler

본 글에서는 예외를 처리하는 방법들 중에 @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로 전역에서 구조화된 방식으로 예외를 처리 해 봅시다!

profile
새싹개발자

0개의 댓글