싱글톤에서의 필드 공유 문제와 Spring Security에서 동시성 문제를 해결하기 위해 ThreadLocal을 사용한다는 것을 알 수 있었다.
그래서 이번엔 ThreadLocal에 관하여 포스팅 해보려고 한다.
ThreadLocal에 데이터를 저장하면 할당된 스레드만이 데이터에 접근할 수 있는 것이다. 따라서 동시성으로 인한 문제를 방지할 수 있다.
동시성으로 인한 문제에 관련한 코드는 싱글톤 패턴에서 필드 공유 문제 를 참고 바란다.
쓰레드가 반납될 때, 쓰레드 로컬의 데이터를 제거해 주어야 한다.
@Slf4j
@RestController
public class Controller {
//ThreadLocal 객체를 만든다.
ThreadLocal<String> favoriteFood = new ThreadLocal<>();
//이 URL로 GET 요청시 ThreadLocal에 데이터를 저장한다.
@GetMapping("/user")
public String request() {
favoriteFood.set("apple"); //ThreadLocal에 데이터를 저장한다.
return Thread.currentThread().getName() + " "+ favoriteFood.get();//ThreadLocal에 저장된 데이터를 가지고 온다.
}
// ThreadLocal에 데이터가 저장되어 있는 지 확인한다.
@GetMapping
public String response() {
if (favoriteFood.get() == null) {
return Thread.currentThread().getName() + " is Null";
}
return Thread.currentThread().getName() + favoriteFood.get();
}
}
http-nio-8080-exec-1
)를 사용한 유저들은 처음에 ThreadLocal에 저장됐던 apple을 그대로 조회할 수 있었다.데이터를 공유하지 않게 하기 위해 마지막에 remove() 메서드들 통해 ThreadLocal을 제거해야 한다.
Reference