Back-End (Web)/Spring

API 예외처리

JABHACK 2025. 1. 19. 16:09

@ExceptionHandler

📌 컨트롤러 클래스 내에서 특정 예외를 처리하는 메서드를 정의하는 Annotation으로 예외가 발생했을 때 설정된 메서드가 호출되어 예외를 처리한다.

  • 특정 컨트롤러에서 발생한 예외를 처리하기 위한 메서드를 지정한다.
  • 단일 컨트롤러 내에서 예외를 처리한다.
  • 계층별로 알맞은 예외를 발생(throw new)시키기만 하면된다.
더보기
@RestController
@RequiredArgsConstructor
public class ExceptionHandlerController {

    private final ExceptionHandlerService exceptionHandlerService;

    @RequestMapping("/v1/exception")
    public void illegalArgumentException() {

        throw new IllegalArgumentException("IllegalArgumentException 발생");

    }

    @RequestMapping("/v2/exception")
    public void nullPointerException() {

        throw new NullPointerException("NPE 발생");
    }

    @RequestMapping("/v3/exception")
    public void serviceLayerException() {

        exceptionHandlerService.throwNewIllegalArgumentException();
    }

    // IllegalArgumentException을 처리하는 메서드
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {

        Map<String, String> response = new HashMap<>();
        response.put("error", ex.getMessage());

        return ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .body(response);
    }

}
@RestController
public class NonExceptionHandlerController {

    @RequestMapping("/v4/exception")
    public void illegalArgumentException() {

        throw new IllegalArgumentException("IllegalArgumentException 발생");

    }

}
@Service
public class ExceptionHandlerService {

    public void throwNewIllegalArgumentException() {
        throw new IllegalArgumentException("ServiceLayer Exception");
    }

}

 

  • 문제점
    1. Controller 코드에 Exception 처리를 위한 책임이 추가된다.(단일 책임 원칙 위반)
    2. 단일 컨트롤러 내의 예외만 처리가 가능하다.(컨트롤러 예외처리 중복코드)
    3. 코드 재사용, 유지보수성 부족
CustomException 사용자 정의 Exception을 만들어서 처리할 수 있다.

 

 

@ControllerAdvice

📌 @ControllerAdvice와 동일한 기능을 제공하지만 @RestController를 포함하고 있어 반환 값이 자동으로 JSON 형태로 변환되며 REST API에서 발생하는 예외를 처리할 때 사용한다.

  • Application 전역에서 발생한 예외를 처리한다.

 

  • @RestControllerAdvice
    • REST API의 예외를 처리한다.
    • 반환 값이 JSON이다.
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {

        Map<String, String> response = new HashMap<>();
        response.put("error", ex.getMessage());

        return ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .body(response);
    }

}

  • @ExceptionHandler 이 선언되지 않은 컨트롤러의 예외처리 가능
일반적으로 문자열이 아닌 공통된 응답 형태를 만들어서 반환한다.
 
Annotation 정리
Annotation
용도
반환 형식
예시 처리 범위
@ExceptionHandler
특정 컨트롤러 내에서 발생한 예외 처리
뷰 이름, String 등
단일 컨트롤러 내
@ControllerAdvice
애플리케이션 전체에서 발생한 예외 처리
뷰 이름, String 등
모든 컨트롤러에 전역 적용
@RestControllerAdvice
REST API에서 발생한 예외를 JSON 형식으로 처리
ResponseEntity (JSON)
모든 컨트롤러에 전역 적용 (RESTful 서비스)

 

'Back-End (Web) > Spring' 카테고리의 다른 글

fetch join  (1) 2025.01.21
Formatter  (0) 2025.01.11
TypeConverter  (0) 2025.01.10
HttpMessageConverter  (0) 2025.01.09
ArgumentResolver  (0) 2025.01.08