개발자 키우기

ThreadLocal 사용하기 본문

Back-end/Springboot

ThreadLocal 사용하기

개발자 키우기 2023. 7. 19. 11:28

WAS(톰켓)는 수많은 클라이언트의 요청(HTTP Request)을 처리하기 위하여 요청이 오면 쓰레드 풀에서 쓰레드를

 

하나 할당하여 해당 요청을 수행하는 방식으로 자원을 효과적으로 사용한다.

 

아래에 로그에서  [nio-8080-exec-1] 에서 1이 쓰레드 1을 가리키며  2가 쓰레드 2를 가리킨다

 

INFO 14900 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
INFO 14900 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
INFO 14900 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

INFO 14900 --- [nio-8080-exec-2]


WAS는 기본적으로 클라이언트의 요청에 대하여 쓰레드를 지원하고 사용하기 때문에 쓰레드 사용에 주의 사항이 있다

 

바로 동시성 문제다. 동시성 문제는 지역 변수(서로 다른 메모리에 할당)에서는 발생하지 않지만 같은 인스턴스 필드의

 

싱글톤이나 static과 같은 공용 필드에 접근하여 값을 변경할 때 문제가 된다.

 

예를 들어 같은 공용 필드를 사용하면 쓰레드1에서 값을 저장하고 불러오는데 2초가 걸린다고 가정하고

 

쓰레드 2에서 값을 저장하고 불러올때 쓰레드2에서 저장한값을 쓰레드 1에서 불러오는 문제가 생긴다

 

이러한 동시성 문제를 해결하는 방식 중 ThreadLocal 사용해보자

 

private ThreadLocal<String> threadLocal = new ThreadLocal<>();  // 다른 곳에서의 접근을 막아야함
threadLocal.set("");                                                                            // 값 저장
threadLocal.get();                                                                               // 값 불러오기
threadLocal.remove();                                                                        // 값 삭제

 

쓰레드 로컬은 쓰레드풀에서 가지고 온 쓰레드마다 개별 내부 저장소를 사용하기 때문에

 

싱글톤을 많이 사용하는 스프링 환경에서 동시성 문제를 깔끔하게 해결할 수가 있다

 

하지만 사용한 쓰레드를 쓰레드풀로 반납하여 풀에 두고 다른 요청이오면 다시 쓰레드를 사용하기 때문에

 

값을 초기화해 주는 remove()를 반드시 사용해야 한다

'Back-end > Springboot' 카테고리의 다른 글

AOP - 용어 정리  (0) 2023.10.18
Spring의 주요 특징  (0) 2023.10.16
스프링 Formatter 사용  (0) 2023.07.12
오류 페이지 및 API 예외 처리  (0) 2023.07.11
메시지 및 Bean Validation 사용  (0) 2023.07.10