반응형
그니_
삽질탐방기
그니_
  • 분류 전체보기 (24)
    • 개발 (15)
    • ETC (1)
    • 트러블슈팅 & 삽질기록 (7)
    • 성능개선 (1)

인기 글

최근 글

최근 댓글

태그

  • spring log
  • 네트워크
  • chatgpt 기록 삭제
  • db
  • GPT 플러그인
  • chatgpt 확장 추천
  • spring docker
  • 마이크로소프트 ai tour
  • easyrandom
  • spring docker compose
  • Spring
  • java
  • chatgpt 정리
  • chatgpt 히스토리 삭제
  • springboot
  • timeunit
  • chatgpt 채팅 삭제
  • index
  • chatgpt 확장 프로그램
  • Database
hELLO · Designed By 정상우.
그니_

삽질탐방기

개발

Java에서 Thread.UncaughtExceptionHandler 활용하기

2025. 2. 27. 12:03
반응형

Java에서 Thread.UncaughtExceptionHandler란?

최근에 스프링 프레임워크를 사용하지 않고 프로젝트를 진행하면서 Thread.UncaughtExceptionHandler의 필요성을 몸소 체감하게 되었습니다.

기존에는 스레드 내부에서 개별적으로 예외를 처리하는 방식이 일반적이라고 생각했는데, 여러 개의 스레드에서 발생하는 예외를 효과적으로 관리하기 위해서는 보다 체계적인 접근이 필요하다는 것을 깨달았습니다.

주로 프레임워크를 사용하다 보니, 다들 아시다시피 제공해주는 @RestControllerAdvice 같은 어노테이션을 활용해서 예외를 처리하는 것이 일반적이었습니다.

하지만 이번 프로젝트를 진행하면서 프레임워크의 예외 처리 기능 외에도 Thread.UncaughtExceptionHandler를 이용하면 보다 근본적으로 스레드 단위에서 예외를 다룰 수 있다는 점을 알게 되었습니다.

 

보통은 try-catch를 사용해서 예외를 개별적으로 처리하지만, 모든 스레드에 일일이 try-catch를 적용하는 것은 현실적으로 어렵습니다. 이럴 때 Thread.UncaughtExceptionHandler를 사용하면 스레드에서 발생하는 예외를 한 곳에서 처리할 수 있습니다.

//이 메서드는 특정 스레드에서 발생한 미처 처리되지 않은 예외를 감지하여 처리하는 핸들러를 설정할 수 있습니다. 만약 명시적으로 설정된 핸들러가 없을 경우, 해당 스레드가 속한 ThreadGroup의 기본 핸들러가 동작합니다.
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

 

setUncaughtExceptionHandler 예제 코드

public class UncaughtExceptionTest {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            throw new RuntimeException("예외 발생~~~~~~");
        });

        thread.setUncaughtExceptionHandler((t, e) -> {
            System.out.println("예외 발생 스레드: " + t.getName());
            System.out.println("예외 메시지 " + e.getMessage());
        });

        thread.start();
    }
}

처음에는 try-catch 없이도 예외를 감지하고 처리할 수 있다는 점에서 흥미를 느꼈습니다. 그런데 프로젝트를 진행하면서 여러 개의 스레드가 동시에 실행될 때 예외 처리를 개별적으로 하는 것이 비효율적일 수도 있겠다는 생각이 들었습니다.

그래서 공통적으로 처리할 수 있는 방법이 있을까 찾아보다 보니 Thread.setDefaultUncaughtExceptionHandler를 활용하면 app 전체에서 스레드 예외를 일괄적으로 처리할 수 있다는 점을 알게 되었습니다.

// 해당 메서드는 특정 스레드에 대해 별도의 핸들러가 설정되지 않았을 경우, 모든 스레드에 대해 적용되는 기본 예외 처리 핸들러를 설정합니다.
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

setDefaultUncaughtExceptionHandler 예제 코드

public class GlobalExceptionHandler {
    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
            System.out.println("[Global] 예외 발생 in " + t.getName());
            System.out.println("[Global] 예외 메시지: " + e.getMessage());
        });

        Thread thread1 = new Thread(() -> { 
        	throw new RuntimeException("Thread1 에러~~!"); 
        });
        Thread thread2 = new Thread(() -> { 
        	throw new RuntimeException("Thread2 에러~~!"); 
        });
        
        thread1.start();
        thread2.start();
    }
}

이 방법을 적용했더니, 스레드 개별 예외 처리를 신경 쓰지 않아도 한 곳에서 모든 예외를 관리할 수 있어 유지보수가 훨씬 편리해졌습니다. 특히, setDefaultUncaughtExceptionHandler를 활용하면 새롭게 생성되는 모든 스레드에서 자동으로 예외가 감지되므로, 일일이 setUncaughtExceptionHandler를 설정할 필요가 없습니다.

 

 

Thread.UncaughtExceptionHandler 언제 활용하면 좋을까?

활용하면 좋은 경우

  1. 멀티스레드 환경에서 예외 로깅이 필요할 때
  2. 예외 발생 시 슬랙, 디스코드, 이메일 등으로 알림을 보낼 때

굳이 안 써도 되는 경우

  1. 단순한 싱글스레드 애플리케이션에서는 try-catch로 충분할 때
  2. Spring Boot의 @ControllerAdvice, @ExceptionHandler를 활용하면 더 직관적인 예외 처리가 가능할 때

 

Thread.UncaughtExceptionHandler 는 Java의 멀티스레드 환경에서 중앙 집중식 예외 처리를 할 수 있는 강력한 기능입니다. 이번 프로젝트를 진행하며 멀티스레드 환경에서 발생하는 예외를 체계적으로 관리하는 것이 얼마나 중요한지 다시 한 번 깨닫게 되었습니다.

 

 

[참고]

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html 

 

Thread (Java Platform SE 8 )

Allocates a new Thread object so that it has target as its run object, has the specified name as its name, and belongs to the thread group referred to by group, and has the specified stack size. This constructor is identical to Thread(ThreadGroup,Runnable,

docs.oracle.com

 

반응형
저작자표시 (새창열림)

'개발' 카테고리의 다른 글

ChatGPT 채팅 삭제, 크롬 확장 프로그램으로 자동화하기  (1) 2025.03.28
[spring] OpenFeign 로그 사용자화  (0) 2023.08.30
spring-boot docker-compose 사용법  (1) 2023.05.14
Easy Random을 활용한 Unit Test  (0) 2023.03.08
[후기] NHN forward 2022  (0) 2022.11.26
    '개발' 카테고리의 다른 글
    • ChatGPT 채팅 삭제, 크롬 확장 프로그램으로 자동화하기
    • [spring] OpenFeign 로그 사용자화
    • spring-boot docker-compose 사용법
    • Easy Random을 활용한 Unit Test
    그니_
    그니_
    머리속에서만 존재하는 내용을 글로 정리

    티스토리툴바