송민준의 개발노트
ThreadLocal이란 뭘까? 본문
우선 쓰레드가 뭔지 알아야함.
간략하게 정리하자면 프로세스가 운영체제로부터 할당 받는 작업 단위인데 쓰레드는 하나의 프로세스가 할당 받는 자원을 이용하는 작업 단위임.
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를 상속해줄순 없을까??
'웹 > Spring Framework' 카테고리의 다른 글
MYBATIS DB에서 이미지(blob)을 뽑는 방법 (0) | 2021.01.06 |
---|---|
checked, unchecked exception이란? (0) | 2020.11.26 |
[406] path variable email을 사용하는 경우 에러 해결방안 (2) | 2020.11.11 |
[spring] 테스트 중 Unable to initialize 'javax.el.ExpressionFactory' 해결하기 - validator 2.0.0(JSR-380) 적용 (0) | 2020.10.21 |
mybatis procedure 사용법 (0) | 2020.10.19 |