Spring & Boot

예외처리 Exception Handling

린예라 2024. 11. 25. 19:45

Spring에서의 예외처리(Exception Handling) 메커니즘 > 프로그램의 비정상적 종료를 막기위해, 예외가 발생한 시점부터 예외처리기가 호출되고 처리되는 과정

 

예외처리는 3가지 부분으로 나뉜다.

1.예외를 발생시키는 과정(throwing) / 2.예외 전파(propagation)  / 3.예외를 처리하는 과정(handling)

 

1.예외 발생 (Throwing Exception)

- 일반적으로 코드 실행 중 예기치 않은 상황이 발생 했을 때 throw 키워드를 사용하여 예외를 발생시킴

- 자바에서는 예외를 나타내는 클래스들이 있으며, 예외가 발생한 상황에 따라 적절한 예외 클래스를 선택하여 예외를 발생시킴

- 프로그램 실행중 예외가 발생하면 JVM은 해당 예외를 발생시킨 메서드의 호출스택정보를 스택추적(Stack Trace)형태로 제공

- 아래의 코드는 인자로 받은 값이 음수일 때 예외를 발생시키는 예제

public void someMethod(int value) {
    if (value < 0) {
        throw new IllegalArgumentException("value값은 음수일 수 없습니다");
    }
}

 

*Stack Trace : 예외 발생 시점에서부터 예외를 처리하는 메서드까지의 호출 스택을 역순으로 표시하여, 이를 통해 어떤 메서드에서 예외가 발생했는지, 그 메서드를 호출한 메서드는 무엇이었는지 등을 확인할 수 있음

 

2.예외 전파 (Exception Propagation)

- 예외가 발생한 메서드에서부터 시작하여, 예외를 처리 할 수 있는 예외처리기를 찾아가는 과정

- Stack Trace를 기반으로 예외를 처리할 수 있는 메서드를 찾아가면서 예외를 전파

- 호출 스택을 따라 상위 메서드로 전파되며, 이 과정에서 호출 스택에 있는 메서드들은 해당 예외를 처리할 기회가 생김

- 예외처리기가 발견될 때까지 계속되고, 발견되지 않으면, 프로그램은 비정상적으로 종료되며, 스택 추적 정보가 출력

 

 

3. 예외 처리 (Exception Handling)

- 예외가 발생하였을 때, 프로그램이 비정상적으로 종료되지 않게 적절히 처리하는 것을 말함

- @ControllerAdvice 어노테이션을 사용하여 전역적으로 예외를 처리하는 핸들러 클래스를 정의할 수 있음

- 이 핸들러 클래스에서는 @ExceptionHandler 어노테이션을 사용하여 특정 예외 클래스에 대한 처리 방법을 정의

- 다음은 IllegalArgumentException 예외를 처리하는 핸들러 클래스의 예시

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
}

IllegalArgumentException이 발생하면 해당 예외를 받아들여서 HTTP 응답 상태코드를 400 Bad Request로 설정하고 예외 메시지를 응답 본문에 담아 클라이언트에게 반환