Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ThreadLocal(윤석호) #182

Open
inferior3x opened this issue Jul 10, 2024 · 0 comments
Open

ThreadLocal(윤석호) #182

inferior3x opened this issue Jul 10, 2024 · 0 comments

Comments

@inferior3x
Copy link
Collaborator

inferior3x commented Jul 10, 2024

문제가 무엇인가?

ThreadLocal이란 무엇인가?

왜 이런 문제를 선정하였는가?

이번에 Thread를 찾아보면서 ThreadLocal을 접하게 되었는데, 이전부터 공부하고 싶었기에 선정하였다.

자신이 생각한 답변은 무엇인가?

ThreadLocal이란?

ThreadLocal은 자바 1.2부터 제공되는 기능으로, 스레드에 변수를 할당하는 기능이다.
image

특정 스레드에서 값을 저장하고 따로 삭제하지 않는다면 추후에 그 스레드에서 실행되는 모든 로직은 그 값에 접근할 수 있게 된다.

톰캣은 요청마다 스레드를 만들기 때문에 ThreadLocal을 한 요청에서 사용하기에 적합하지만, 웹플럭스의 네티는 하나의 스레드가 여러 요청을 처리하기 때문에 사용하기 적합하지 않다.

사용법

// 현재 쓰레드와 관련된 로컬 변수를 하나 생성한다.
public class ThreadLocalTest{
    private static final ThreadLocal<Long> userThreadLocal = new ThreadLocal<Long>();
    ...
}
//스레드 로컬 변수에 값 할당
userThreadLocal.set(user.getId());
// 이후 실행되는 코드는 쓰레드 로컬 변수 값을 사용
Long userId = userThreadLocal.get();
//다음 요청을 받을 때 자동으로 없어지지 않으므로 직접 로컬 변수를 제거
userThreadLocal.remove();

할당과 동시에 요청이 끝날 때 삭제도 보장하기 위해 필터, 인터셉터, AOP를 사용할 수 있을 것이다.

활용법

  • 요청을 보낸 사용자의 정보를 스레드에 저장함으로써 요청의 어느 부분에서든 활용할 수 있도록 할 수 있다. (컨트롤러든, 서비스든)
    스프링 시큐리티에서도 SecurityContextHolder를 통해 이러한 기능을 제공하는데, 기본적으로 ThreadLocal 방식임

    public interface RequesterInfo {
        Long getUserId();
    }
    

    따라서 common과 같은 패키지에서 위 인터페이스를 정의한 뒤,
    SecurityContextHolder로 구현체를 만들거나 ThreadLocal을 통해 직접 구현체를 만듦으로써 인프라와의 의존성을 줄일 수 있을 것이다.

  • 요청이 들어왔을 때 그 시각의 시간 데이터를 만들고 그 시간으로만 데이터를 처리

  • 트랜잭션 전파?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant