아래에서도 잠깐 설명했는데, C# 을 이용한 프로그램들이나 유니티에서는 Application.UnhandledException 이벤트를 등록함으로서
클래스나 함수에서 미처 처리하지 못한 오류가 발생했을때 이를 감지 할 수 있다.
예기치 않게 프로그램이 종료되는것을 막을 수 있을 뿐 아니라, 죽기전에 이용자에게 팝업 등으로 안내를 할 수 도 있고, 로그를 작성할 수도 있다. 스프링부트 (혹은 JVM) 에서 이와 비슷하게 구현하기 위한 방법을 정리해 본다.
다만, 스프링부트와 여타 다른 프로그램과 다른점은, 처리하지 않은 예외가 발생하도 프로그램이 죽지 않는다는 점이다.
프레임워크가 알아서 500 에러를 리턴하고 서버는 계속 동작한다! (톰캣에서 스레드를 생성하여 동작하므로 메인스레드는 살아있다)
1. 스프링에서 사용하는 방법 (API 요청에 대한 오류 전체 핸들링)
- 모든 컨트롤러 (@RestController, @Controller) 에서 발생한 오류를 한번에 잡는다.
- 통신의 리턴값으로 500을 던져준다
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleRuntime(RuntimeException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Runtime error: " + ex.getMessage());
}
}
2. JVM 에서 핸들링 (API 통신 외 전체 어플리케이션에서 처리)
메인 실행시 자동으로 등록을 해주므로 해당 자바 클래스 파일을 생성만 해주면 캐치가 된다.
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;
@Component
public class GlobalExceptionCatcher {
@PostConstruct
public void registerExceptionHandler() {
Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
System.err.println("치명적 예외 발생 (스레드: " + thread.getName() + "): " + throwable);
// TODO: 로그 저장, 알림, 복구 로직 등
});
}
}'Backend > SpringBoot' 카테고리의 다른 글
| 커스텀 Event 발생 -> 수신 (0) | 2025.09.02 |
|---|---|
| NoSQL DB 사용 (0) | 2025.09.02 |
| 생명주기 Event들 활용 하기 (1) | 2025.09.01 |
| AOP 및 Slf4j + logback 로깅 (1) | 2025.09.01 |
| 자바스크립트에서 타임리프 사용하기 (+onclick 인자 전달) (0) | 2024.12.18 |