동시성문제를 해결하기 위한 클래스
스프링에 등록되는 빈은 싱글톤으로 생성된다.
그래서 객체의 인스턴스가 애플리케이션에 한 개만 존재한다.
그런데 여러 스레드에서 동시에 해당 인스턴스에 접근하게 되면 문제가 발생할 수 있는데 이를 동시성문제라고 한다.
동시성 문제가 발생하려면 빈으로 등록된 클래스에 전역변수가 존재해야 한다.
전역변수는 여러 스레드에서 접근이 가능하기 때문에 너도 나도 변경할 수 있게 된다.
동시성 문제를 해결하기 위해 스레드로컬을 사용한다.
스레드로컬 클래스는 스레드마다 각각 별도의 데이터를 저장할 수 있게 해주는 클래스다.
그래서 A스레드가 B스레드에서 설정한 데이터에 접근할 수 없게 된다.
스레드로컬을 적용하려면 기존의 전역변수를 ThreadLocal클래스로 변경하고, get/set 메서드를 이용하여 값을 핸들링하면 된다.
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
threadLocal.set("name"); // 값 저장
threadLocal.get(); // 값 조회
threadLocal.remove(); // 값 제거
사용 시 주의할 점은 스레드로컬의 사용이 끝나면 remove메서드를 호출하여 값을 제거해야 한다는 점이다.
WAS처럼 스레드를 풀로 관리하는 경우에는 사용이 종료된 스레드는 풀로 반환하고 다시 사용하게 되는데,
스레드로컬에 저장된 데이터를 remove 하지 않고 스레드가 반환되면 재사용 시 이전 스레드로컬에 저장된 데이터에 접근이 가능해지기 때문이다.
또 다른 해결 방법도 있다.
전역변수를 지역변수로 변경하면 다른 스레드에서 접근이 불가능하다.
내가 안바꿨는데? 쓰레드세이프
This story is based on a true story.분명 소스상으로는 변경하는 코드가 없는데...PG사 결제 파라미터로 "상점아이디"라는 걸 전달해야 하는데, 결제 방식에 따라 다른 값을 사용하고 있어.예를 들어서 결
aphrodisiac.tistory.com
스프링 핵심 원리 - 고급편 | 김영한 - 인프런
김영한 | 스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., 핵심 디자인 패턴, 쓰레드 로컬, 스프링 AOP스프링의 3가지 핵심 고급 개념 이해하기
www.inflearn.com