안녕하세요, 소소해라 입니다. 오늘은 spring의 ThreadLocal 에 대해서 여러분들께 소개하고자 합니다.스프링 애플리케이션에서 여러 스레드가 동시에 실행될 때, 각 스레드는 고유한 상태를 가집니다. 그러나 이로 인해서 스레드 간 데이터 공유가 어려워지는 문제가 발생합니다. 이를 극복하기 위해 스프링은 ThreadLocal
이라는 매커니즘을 제공합니다. 이제 같이 ThreadLocal이 무엇이고 사용방법은 어떻게 되는지 살펴볼까요 ?
ThreadLocal이란?
개별 스레드 저장소
ThreadLocal
은 스레드 간에 각각 독립적으로 값을 저장하고 관리할 수 있는 기능을 제공합니다. 이를 통해 각 스레드는 자신만의 데이터를 가질 수 있으며, 다른 스레드의 데이터에 접근할 수 없게 됩니다.
주요 메서드
set(T value)
: 현재 스레드의ThreadLocal
에 값을 설정합니다.get()
: 현재 스레드의ThreadLocal
에 저장된 값을 반환합니다.remove()
: 현재 스레드의ThreadLocal
에 저장된 값을 제거합니다.
스프링에서 활용 하기
Request 스코프 시나리오
웹 애플리케이션에서 Request 스코프를 구현할 때, 각 HTTP 요청에 대해 별도의 스레드가 생성되므로 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
변수 requestHolder
는 HttpServletRequest
를 저장합니다.
setRequest
메서드를 통해 현재 스레드의 ThreadLocal
에 HttpServletRequest
를 설정합니다.
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 스코프와 같은 상황에서 적절히 활용하면 스레드 간 데이터 관리를 효과적으로 수행할 수 있을 것 같습니다. 오늘도 도움이 됐길 바라며 이만 글을 마치도록 하겠습니다. 읽어주셔서 감사합니다.
'Spring' 카테고리의 다른 글
[Spring] 독립실행형 서블릿 애플리케이션 개발하기 (1) | 2024.01.29 |
---|---|
Spring AOP(Aspect-Oriented Programming) 개념과 사용방법 (0) | 2024.01.23 |
[JAVA 문법] 자바 메서드 오버로딩 개념과 사용 방법 익히기 (0) | 2024.01.15 |
웹서버란 무엇인가 스프링 부트 프레임워크 이해하기 (0) | 2024.01.09 |