그알것 — 그럼에도 알아야 할 것들
홈질문커뮤니티
로그인
그알것 — 그럼에도 알아야 할 것들

Service

  • 홈
  • 소개
  • 질문
  • 커뮤니티

My

  • 내 워크스페이스
  • 저장한 질문
  • 작성한 답변

Policy

  • 이용약관
  • 개인정보처리방침
  • 문의

© 2026 그알것 · What Still Matters

질문 목록Concurrency
Concurrency

ThreadLocal은 무엇이며 사용할 때 어떤 점을 주의해야 하나요?

실무4/5
설계3/5
인간4/5
기초3/5

면접관의 질문 의도

ThreadLocal의 동작을 외운 수준인지, 아니면 스레드풀 재사용과 비동기 전환이라는 실제 실행 환경 위에서 안전하게 다룰 줄 아는지를 가르려는 질문이다.

큐레이션 답변

학습 자료

ThreadLocal은 각 스레드 내부의 ThreadLocalMap에 키-값을 보관해 스레드끼리 공유 없이 값을 들고 다니게 한다. 락 없이 요청 스코프 정보를 흘릴 수 있어 트랜잭션 동기화, SecurityContext, MDC 같은 인프라가 이 위에 올라가 있다. 단 톰캣·WAS의 스레드풀은 스레드를 재사용하므로, 요청이 끝날 때 remove()로 슬롯을 비우지 않으면 다음 요청에 이전 사용자 값이 그대로 새어 나온다. 즉 '스레드 = 요청 하나'라는 가정 위에서만 안전하게 동작하는 도구다.

좋은 답변 구조

  1. 01ThreadLocalMap에 스레드별로 독립 슬롯이 생기는 동작 원리를 먼저 정리한다
  2. 02Spring에서 트랜잭션·보안·MDC가 이 위에 어떻게 올라가 있는지 입력→보관→조회→소멸 흐름으로 짚는다
  3. 03스레드풀 재사용에서 remove 누락이 다음 요청 오염으로 번지는 경로를 단계별로 설명한다
  4. 04@Async·Reactive처럼 스레드가 바뀌는 환경의 한계와 TaskDecorator·Reactor Context 같은 전파 수단을 덧붙인다

자주 실수하는 포인트

try-finally의 finally에서 remove()를 호출하지 않아 다음 요청에 이전 사용자 정보가 남는다
@Async로 띄운 작업에 부모 스레드의 SecurityContext·MDC가 자동으로 따라간다고 가정한다
InheritableThreadLocal을 쓰면 스레드풀 환경에서도 값이 안전하게 전파된다고 오해한다
요청 단위가 아닌 캐시·전역 상태 용도로 ThreadLocal에 데이터를 쌓아 메모리 누수를 만든다

실무 맥락

  • 톰캣 스레드풀로 요청을 받는 Spring MVC 서버에서 SecurityContext·트랜잭션 동기화가 동작하는 환경
  • MDC에 traceId·userId를 넣어 요청 단위로 로그를 묶어 보는 운영 환경
  • @Async·CompletableFuture로 부가 작업을 비동기로 떼어내 처리하는 백오피스/알림 파이프라인
  • WebFlux 같은 Reactive 스택으로 일부 엔드포인트를 옮기며 컨텍스트 전파 방식이 바뀌는 전환기

본인 경험에 녹이는 힌트

두 번째 요청부터 다른 사용자 정보가 보이는 버그를 잡다가 remove() 누락이 원인이었던 경험이 있다면, 스레드풀 재사용 가정이 깨지는 패턴과 묶어 풀어낼 수 있다

@Async로 옮긴 뒤 로그에서 traceId나 사용자 정보가 비기 시작한 경험이 있다면, TaskDecorator로 MDC·SecurityContext를 전파한 이야기로 이을 수 있다

ThreadLocal에 데이터를 캐시처럼 쌓다 힙 덤프에서 누수를 확인했다면, 요청 스코프와 캐시 스코프를 분리한 결정으로 연결할 수 있다

WebFlux로 옮기면서 ThreadLocal 기반 컨텍스트가 깨졌다면, Reactor Context로 갈아탄 과정과 이유를 풀어낼 수 있다

커뮤니티 인기 답변

전체 0개

아직 공개된 답변이 없어요. 첫 공개 답변을 남겨보세요.

관련 꼬리 질문

Q1ThreadLocalMap의 키가 약한 참조인데도 메모리 누수가 생기는 이유는 무엇인가요
Q2InheritableThreadLocal이 스레드풀 환경에서 오히려 위험한 이유는 무엇인가요
Q3@Async로 비동기 실행할 때 SecurityContext·MDC를 안전하게 전파하려면 어떻게 하나요
Q4WebFlux 같은 Reactive 환경에서 ThreadLocal 대신 무엇을 쓰고, 왜 그렇게 바뀌나요
아직 답을 쓰지 않았어요.
큐레이션 답변과 다른 사람 답변을 보고, 자기 언어로 답을 정리해보면 학습 효과가 가장 큽니다.
목차
  • 01면접관의 질문 의도
  • 02큐레이션 답변
  • 03좋은 답변 구조
  • 04자주 실수하는 포인트
  • 05실무 맥락
  • 06본인 경험에 녹이는 힌트
  • 07커뮤니티 인기 답변준비중
  • 08관련 꼬리 질문