본문 바로가기
Spring

Spring ThreadLocal 이용해서 스레드별 데이터 저장하는 방법

by hera1 2024. 1. 12.

안녕하세요, 소소해라 입니다. 오늘은 spring의 ThreadLocal 에 대해서 여러분들께 소개하고자 합니다.스프링 애플리케이션에서 여러 스레드가 동시에 실행될 때, 각 스레드는 고유한 상태를 가집니다. 그러나 이로 인해서 스레드 간 데이터 공유가 어려워지는 문제가 발생합니다. 이를 극복하기 위해 스프링은 ThreadLocal이라는 매커니즘을 제공합니다. 이제 같이 ThreadLocal이 무엇이고 사용방법은 어떻게 되는지 살펴볼까요 ? 

ThreadLocal이란?

개별 스레드 저장소

ThreadLocal은 스레드 간에 각각 독립적으로 값을 저장하고 관리할 수 있는 기능을 제공합니다. 이를 통해 각 스레드는 자신만의 데이터를 가질 수 있으며, 다른 스레드의 데이터에 접근할 수 없게 됩니다.

주요 메서드

  • set(T value): 현재 스레드의 ThreadLocal에 값을 설정합니다.
  • get(): 현재 스레드의 ThreadLocal에 저장된 값을 반환합니다.
  • remove(): 현재 스레드의 ThreadLocal에 저장된 값을 제거합니다.

스프링에서 활용 하기

Request 스코프 시나리오

웹 애플리케이션에서 Request 스코프를 구현할 때, 각 HTTP 요청에 대해 별도의 스레드가 생성되므로 ThreadLocal을 사용하면 간편하게 데이터를 전파할 수 있습니다.

Spring ThreadLocal

public class RequestContextHolder {
    private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<>();

    public static void setRequest(HttpServletRequest request) {
        requestHolder.set(request);
    }

    public static HttpServletRequest getRequest() {
        return requestHolder.get();
    }

    public static void clear() {
        requestHolder.remove();
    }
}

위 코드를 함께 살펴보도록 하겠습니다. 

 

ThreadLocal 변수 requestHolderHttpServletRequest를 저장합니다.

setRequest 메서드를 통해 현재 스레드의 ThreadLocalHttpServletRequest를 설정합니다.

getRequest 메서드를 통해 현재 스레드의 ThreadLocal에 저장된 HttpServletRequest를 반환합니다.

clear 메서드를 통해 현재 스레드의 ThreadLocal에 저장된 값을 제거합니다.

사용 예제

public class SomeService {
    public void doSomething() {
        HttpServletRequest request = // ...
        RequestContextHolder.setRequest(request);

        // 작업 수행

        RequestContextHolder.clear();
    }
}

ThreadLocal  사용 시 주의사항

ThreadLocal을 사용할 때에는 주의사항이 있습니다. 바로 메모리 누수인데요. 메모리 누수를 방지하는 방법에 대해서 알려드리겠습니다.

메모리 누수

ThreadLocal을 사용할 때 주의할 점은 메모리 누수입니다. ThreadLocal에 저장된 값은 스레드가 종료되기 전까지 메모리에 남아있게 됩니다. 따라서 스레드 풀을 사용하는 환경에서는 명시적으로 remove를 호출하여 메모리 누수를 방지해야 합니다.

 

제가 생각하는 ThreadLocal은 스프링 애플리케이션에서 스레드 간 데이터 공유 및 전파를 용이하게 만드는 강력한 도구입니다. 그러나 올바르게 사용하지 않으면 메모리 누수와 같은 문제가 발생할 수 있으므로 주의가 필요합니다. Request 스코프와 같은 상황에서 적절히 활용하면 스레드 간 데이터 관리를 효과적으로 수행할 수 있을 것 같습니다. 오늘도 도움이 됐길 바라며 이만 글을 마치도록 하겠습니다. 읽어주셔서 감사합니다.

 

다른글 더 보러가기