송민준의 개발노트

ThreadLocal이란 뭘까? 본문

웹/Spring Framework

ThreadLocal이란 뭘까?

송민준 2020. 12. 4. 00:44

우선 쓰레드가 뭔지 알아야함.

간략하게 정리하자면 프로세스가 운영체제로부터 할당 받는 작업 단위인데 쓰레드는 하나의 프로세스가 할당 받는 자원을 이용하는 작업 단위임.

 

ThreadLocal

글자 그대로 쓰레드의 지역변수임. 오직 한 쓰레드에 의해 읽고 쓰여질 수 있는 변수를 생성할 수 있도록 함.

 

- 목적 : 쓰레드라는 scope 내에서 공유되어 사용될 수 있는 값으로 다른 쓰레드에서 공유변수를 접근할 시 발생할 수 있는 동시성 문제의 예방을 위해 만들어졌다.

 

- 특징

 1) ThreadLocal은 변수 타입을 다루기 쉽도록 제너릭으로 생성 가능함

 2) 값을 세팅한 Thread만 접근할 수 있음. 모든 Thread가 사용할 수 있는 쓰레드로컬 초기값은 없지만 initialValue() 메소드를 오버라이딩 하는 방법으로 ThreadLocal의 초기값을 설정할 수 있음.

 3) 각 Thread는 Thread가 종료되기 전까지 ThreadLocal 인스턴스를 참조함

 4) ThreadPool을 통해 Thread를 재사용하는 경우 이전에 사용했던 값을 공유할 수 있음 -> 사용이 끝났다면 삭제해주는 것이 필요함.. 물론 재사용도 가능하고

 

- 그렇다면 어디에서 사용하는 것인가?

 1) 사용자 인증정보 전파(security에선 ThreadLocal을 이용해서 사용자 인증 정보를 전파함)

 2) 트랜잭션 컨텍스트 전파 - 트랜잭션 매니저는 트랜잭션 컨텍스트를 전파하는데 ThreadLocal을 사용함

 3) 쓰레드에 안전해야 하는 데이터 보관

 

- 좀 더 디테일 하게 2번 트랜잭션이 어떻게 관리가 되는가를 보겠음

 PlatformTransactionManager는 기본적으로 Thread에 연결된 Stack 기반의 Connection 제공자임. 왜냐? ThreadLocal을 이용하여 Connection을 관리함. 즉 이 말은 Transaction은 하나의 쓰레드에서 시작하고 종료되어야 한다는 말임.

 이건 또 나아가서 Batch 등에서 성능을 위해 멀티 스레드화 했을 때 트랜잭션은 각 Thread별로 실행되게 설계 해야 한다는 제약으로 이어짐.

 예를 들어 트랜잭션 전파옵션 REQUIRED_NEW 를 사용한다면 기존의 Connection을 ThreadLocal stack에 넣어 보관해두고 새로운 Connection을 ThreadLocal에 지정함. 그리고 작업 종료 후 commit/rollback 후 stack에서 다시 pop 해와서 기존 트랜잭션을 이어감.

 

---------------------------------------------------------------------------------------------------------------------------

* ThreadLocal를 상속해줄순 없을까??