ThreadLocal 이란?
ThreadLocal 는 하나의 쓰레드에 의해 읽고 쓸 수 있는 변수를 생성한다.
만약 두개의 쓰레드가 같은 코드를 실행한다면 각각의 쓰레드들은 서로의 ThreadLocal 변수를 확인할 수 없다.
Thread 단위 Local 변수를 할당하는 기능이다.
ThreadLocal 클래스는 thread-local 변수들을 제공한다. 이 변수들은 get 또는 set 메소드를 통해 접근하는 각 스레드가 독립적으로 변수의 초기화 된 사본을 가지고 있다는 점에서 다르다. ThreadLocal 인스턴스들은 보통 스레드와 상태를 연결하려고 하는 클래스들의 private static 필드들이다. (예를들어, 유저 ID 또는 트랜잭션 ID) (참고- 오라클 Docs)
// 쓰레드 로컬 선언
ThreadLocal<String> local = new ThreadLocal<String>();
쓰레드 로컬은 여러 Thread에서 각자의 값을 가질 수 있다.
그렇기 때문에 Thread1 과 Thread2의 값이 다르게 나타난다.
// ThreadLocal 현재 쓰레드의 값을 저장
local.set("First");
// 현재 쓰레드의 값을 호출
local.get();
ThreadLocal 사용
- 사용자 고유값(인증값) 으로 활용 - ThreadLocal을 이용해서 사용자 key을 갱신 및 전달한다.
- 트랜잭션 매니저에서 transaction Context를 전파하는데 사용.
주의할점
지금 내가 서비스하는 곳에선 해당 ThreadLocal을 통해 고객 Session을 유지하고있다.
세션이 만료되지 않고 잘 유지되고 있다면 기존 Session을 각 Thread에서 동일한 값을 가지고 있을 것이다.
다만, 세션이 만료되어 재갱신이 필요한 Case가 존재한다.
그럴때는 ThreadLocal의 값을 초기화 시켜주는 과정이 필요하다. 초기화 하지 않는다면, 비동기 호출시 각 Thread들은 많은 세션값들을 생성하게 된다. (만료된 ket를 가지고 있으니.. 값은 전역이 아니라 공유가 안됌.)
(아니면 세션을 갱신시키는 API를 동기화 시켜 첫 호출이 완료된 후 세션 갱신이 이루어졌으면 그 값으로 재통신을 이루어지는 로직을 타야된다.)
댓글