스프링 ThreadLocal

김개발세발바닥·2024년 4월 22일

스프링

목록 보기
11/13

ThreadLocal.

ThreadLocal은 Thread에 대한 로컬 변수를 제공한다.
따라서 각각의 Thread가 변수에 대해서 독립적으로 접근할 수 있다.

ThreadLocal은 한 Thread에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 지원해주기 때문에 Thread와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파하도록 할 수 있다.

ThreadLocal은 기본적으로 Thread의 정보를 Key 값으로 하여 값을 저장하는 Map의 구조(ThreadLocalMap)를 가지고 있다.

메소드.

get() - Map이 null이 아니라면 ThreadLocalMap의 내부에 있는 Entry를 불러오고 ThreadLocal에 저장한 값을 불러온다.

set() - ThreadLocal 객체를 key로 사용해 ThreadLocalMap에 값을 주입한다.
내부적으로 현재 ThreadLocal이 가진 hash code를 사용한다.

getMap() - Thread를 받아와 해당 Thread에서 사용될 참조할 ThreadLocalMap값을 반환한다.

createMap() - Thread 내부 ThreadLocalMap을 새로 생성해 준다.

remove() - 현재 수행 중인 Thread를 기준으로 getMap()시켜 내부 ThreadLocalMap를 가져온다. 그리고 안에 있던 값을 제거.

withInitial() - 메소드로 로컬 변수를 생성하면서 특정 값으로 초기화하도록 도와준다.

ThreadPool을 사용한 경우.

ThreadLocal은 Thead의 정보를 key로 하여 Map의 형식으로 데이터를 저장한 후 사용한다.
따라서 Thread Pool을 사용하여 Thread를 재활용한다면 이전에 사용한 ThreadLocal의 정보가 남아있어 원치 않는 동작을 할 수 있다.
이 경우에는 Thread가 끝나가는 시점에 remove()로 값을 제거해주는 것이 필요하다! (아주 중요)

활용

ThreadLocal은 각각의 Thread가 독립적으로 데이터를 처리해야 하는 곳에서 활용될 수 있다.
예를 들어 Spring Security에서는 ContextHolder가 ThreadLocal로 구현되어 있다.
ContextHolder의 내부에는 authentication 정보를 담게 되는데 여기서 여러 Thread의 요청에도 꼬이지 않는다는 ThreadLocal만의 장점이 적용되고 있다.

0개의 댓글