FrameWork/Spring&Spring-boot

Spring Core - 쓰레드 로컬 동기화(적용, 주의사항)

Surge100 2024. 3. 6. 09:12

쓰레드 로컬 동기화(적용)

package com.spring.core;

import com.spring.core.logTrace.LogTrace;
import com.spring.core.logTrace.ThreadLocalLogTrace;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Configration {

    @Bean
    public LogTrace logTrace(){
        // return new FieldLogTrace();
        return new ThreadLocalLogTrace();
    }
}

 

동시성 문제가 있는 FieldLogTrace 대신에 문제를 해결한 ThreadLocalLogtrace를 스프링 빈으로 등록하자

 

동시 요청

동시성 문제 확인

다음 로직을 1초 안에 2번 실행해 보자.

  • http://localhost:7000/v3/order?itemId=hello
  • http://localhost:7000/v3/order?itemId=hello

 

정상 실행 로그

로그를 확인해보면 각각의 쓰레드 nio-7000-exec-5, nio-7000별도 로그가 정확하게 나누어진 것을 확인할 수 있다. 


쓰레드 로컬 - 주의사항

쓰레드 로컬의 값을 사용 후 제거하지 않고 그냥 두면 WAS(톰캣)처럼 쓰레드 풀을 사용하는 경우에는 심각한 문제가 발생할 수 있다. 다음 예시를 통해 알아보자.

 

사용자A 저장 요청

 

  1. 사용자A가 저장 HTTP를 요청했다.
  2. WAS는 쓰레드 풀에서 쓰레드를 하나 조회한다.
  3. 쓰레드 thread-A가 할당되었다.
  4. thread-A는 사용자A의 데이터를 쓰레드 로컬에 저장한다.
  5. 쓰레드 로컬의 thread-A전용 보관소에 사용자A데이터를 보관한다.

 

사용자A 저장 요청 종료 

  1. 사용자A의 HTTP 응답이 끝난다.
  2. WAS는 사용이 끝난 thread-A를 쓰레드 풀에 반환한다. 쓰레드를 생성하는 비용은 비싸기 때문에 쓰레드를 제거하지 않고, 보통 쓰레드 풀을 통해서 쓰레드를 재사용한다.
  3. thread-A는 쓰레드풀에 아직 살아있다 따라서 쓰레드 로컬의 thread-A전용 보관소에 사용자A 데이터도 함께 살아있게 된다. 

 

사용자B 조회 요청

  1. 사용자B가 조회를 위한 새로운 HTTP 요청을 한다.
  2. WAS는 쓰레드 풀에서 쓰레드를 하나 조회한다.
  3. 쓰레드 thread-A가 할당되었다.(물론 다른 쓰레드가 할당될 수 도 있다.)
  4. 이번에는 조회하는 요청이다. thread-A는 쓰레드 로컬에서 데이터를 조회한다.
  5. 쓰레드 로컬은 thread-A전용 보관소에 있는 사용자A값을 반환한다.
  6. 결과적으로 사용자A 값이 반환된다.
  7. 사용자B는 사용자A의 정보를 조회하게 된다.

 

결과적으로 사용자B는 사용자A의 데이터를 확인하게 되는 심가간 문제가 발생하게된다.

이런 문제를 예방하려면 사용자A의 요청이 끝날 때 쓰레드 로컬의 값을 ThreadLocal.remove()를 통해서 꼭 제거해야 한다.

 

 

[출처 - 스프링 핵심원리-고급편, 저 김영한]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8

 

스프링 핵심 원리 - 고급편 강의 - 인프런

스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., 핵심 디자인 패턴, 쓰레드 로컬, 스프링 AOP스프링의 3가지 핵심 고급 개념 이해하기 📢 수강

www.inflearn.com