Java/Spring

Java ThreadLocal 이란?

Z_Z 2025. 4. 21. 15:28
반응형

Process(프로세스) 란?

메모리에 올라가 실행중인 프로그램을 말한다.

 

Thread (쓰레드) 란?

프로세스 안에서 실질적으로 작업을 실행하는 단위를 말한다.

 

예를 들어 생각해보면

브라우저에서 음악을 들으면서 동시에 웹서핑을 한다고 치면

  • 음악 재생하는 쓰레드
  • 웹 페이지 로딩하는 쓰레드
  • 다운로드 중인 파일 쓰레드

이 모든게 각각 독립된 Thread 에서 실행된다.

 

 

 

ThreadLocal 이란?

ThreadLocal 은 자바에서 멀티스레딩 프로그래밍을 할 때 사용되는 클래스이다.

각 스레드가 독립적으로 값을 가지도록 해주며, 여러 스레드가 동시에 같은 변수를 사용할 때 발생할 수 있는

문제를 해결할 수 있다.

 

일반적으로 멀티스레딩 환경에서는 공유 변수에 대한 동기화가 필요하다.

하지만 동기화는 성능에 영향을 미칠 수 있으나 ThreadLocal 을 사용하면 쓰레드마다 고유한 변수를 가질 수 있기 때문에

동기화가 필요하지 않다.

 

하지만 쓰레드 풀 사용시 주의해야한다.

쓰레드 풀에서 쓰레드를 재사용할 때 이전 작업의 Thread 값을 제거하지 않으면 다음 작업에서 재사용되기 때문에

항상 사용한 ThreadLocal 의 쓰레드 값은 마지막에 제거를 해줘야한다.

 

Spring Security 6 에서의 ThreadLocal 사용

예를 들어 Spring Security 6 에서 인증된 객체 Authentication 을 저장할 때 SecurityContext 를 사용하고

SecurityContext 를 관리하는 SecurityContextHolder 가 있다.

 

Security 에서 Authentication 인증 객체를 각 사용자별 고유 공간에서 저장하고 사용하기 위해서

ThreadLocal 을 사용한다.

 

SecurityContextHolder 는 SecurtyContext 를 저장하는 방식을 전략패턴으로 유연하게 대응하는데

기본 전략인 MODE_THREADLOCAL 로 ThreadLocal 을 사용하여 SecurityContext를 저장하고 관리한다.

 

 

SecurityContextHolderStrategy 전략중 하나로 기본 전략인 ThreadLocalSecurityContextHolderStrategy 를 사용한다.

기본 contextHolder 전역변수를 살펴보면 ThreadLocal 로 사용중인걸 확인할 수 있다.

 

위에서 설명했듯이 ThreadLocal 사용시 주의할점이 있다.

우리가 사용하는 WAS(Tomcat) 은 Thread pool 기반으로 동작한다. 따라서 ThreadLocal 을 사용할 때

사용 후 비워주지 않는다면 반환된 Thread 를 부여받은 다른 사용자가 기존에 세팅된

ThreadLocal 데이터를 공유받게 될 수도 있다.

그래서 Thread pool 에 반환되기전에 clearContext() 함수를 통해 꼭 비워줘야 한다.

 

 

 

 

 

 

반응형