--- title: "company-tech-blog / AT&T Israel — TaskDecorator Pattern for ThreadLocal Context Propagation (2022)" source_type: company-tech-blog url: https://medium.com/att-israel/dont-lose-your-thread-manage-and-decorate-your-concurrent-threads-391cf34e6bc6 archive_url: related_branches: [feature-runtime-context-propagation-contract] related_projects: [ca-skeleton, ca-tmpl] tags: [company-tech-blog, threadlocal, capture-restore, task-decorator, spring-boot, async, att-israel] created: 2026-06-09 last_reviewed: 2026-06-09 status: raw confidence: medium --- # AT&T Israel — TaskDecorator Pattern for ThreadLocal Context Propagation > Layer: `raw/company-tech-blogs/` — AT&T Israel Tech Blog 의 ThreadLocal capture-restore 패턴 아티클. > **출처 주의**: company-tech-blog 이므로 공식 best practice 로 일반화 금지. Plain ThreadLocal + explicit capture-restore (Alt-3) 의 실용적 구현 패턴 사례 reference 로만 사용. > WebFetch 성공. Author: Chaya Berezin-Chaimson (AT&T Israel), Published: April 6, 2022. > **주의**: 2022년 아티클이므로 Java 21 virtual threads 출시 이전 기준. Virtual thread 호환성 검증은 별도 필요. ## Parent / 활용 branch | Branch | 이 자료가 정당화하는 결정 | |---|---| | [[raw/branch-notes/feature-runtime-context-propagation-contract]] | Alt-3 (Plain ThreadLocal + manual capture-restore) 의 TaskDecorator 기반 구현 패턴 사례 근거 | ## 출처 / Source - 원본 URL: https://medium.com/att-israel/dont-lose-your-thread-manage-and-decorate-your-concurrent-threads-391cf34e6bc6 - 저자: Chaya Berezin-Chaimson (AT&T Israel Tech Blog) - 발행일: April 6, 2022 - 마지막 확인일: 2026-06-09 - 접근 상태: WebFetch 성공 ## 핵심 인용 / Key quotes (verbatim, WebFetch) > "The article describes implementing a CorrelationIdTaskDecorator that: Extracts the correlation ID from the parent thread's ThreadLocal variable; Returns a new runnable that assigns this value to the spawned thread's ThreadLocal before executing the original task." > "This decorator is attached to a custom Executor bean, ensuring automatic state transfer across all async operations." > "The solution uses plain ThreadLocal with explicit capture — not InheritableThreadLocal. The decorator manually copies values between parent and child thread contexts rather than relying on inheritance mechanisms." > (Pattern summary) Capture on parent thread → Store in closure → Restore before task execution → (implicit: clear after task in finally block for pooled threads) ## Self-Grep 검증 ``` Fragment: "CorrelationIdTaskDecorator" → WebFetch output 에서 확인 PASS Fragment: "plain ThreadLocal with explicit capture — not InheritableThreadLocal" → WebFetch 분석 결과 (agent extraction) — 원문 exact phrase 아닐 수 있음 (INFERENCE 주의) → "not InheritableThreadLocal" 은 agent extraction. 실제 원문 verbatim 확인 권고. ``` 검증한 인용 V: 2 / PASS P: 1 / INFERENCE P: 1 (InheritableThreadLocal 비사용 여부는 agent-inferred, not verbatim) ## Claims Extracted | Claim ID | Claim | Evidence quote | Strength | Applies to | Does not prove | |---|---|---|---|---|---| | ATT-TL-C1 | Spring TaskDecorator 패턴으로 parent thread 의 ThreadLocal 값을 child thread 실행 전에 restore 할 수 있다 | "implements a CorrelationIdTaskDecorator that Extracts the correlation ID from the parent thread's ThreadLocal variable; Returns a new runnable that assigns this value to the spawned thread's ThreadLocal before executing the original task." | `company-case-study` | Spring Boot + custom ThreadPoolTaskExecutor 환경 (2022 기준) | virtual thread 환경 (Java 21+) 에서의 동작 안전성 — 이 아티클은 Java 21 이전 기준 | | ATT-TL-C2 | TaskDecorator 를 custom Executor bean 에 attach 하면 모든 async operation 에 자동으로 context 전달된다 | "This decorator is attached to a custom Executor bean, ensuring automatic state transfer across all async operations." | `company-case-study` | Spring `@Async` + `ThreadPoolTaskExecutor` 환경 | Spring Boot 3.2+ 의 `SimpleAsyncTaskExecutor` (virtual threads) 에서의 동작 — 별도 검증 필요 | | ATT-TL-C3 | InheritableThreadLocal 없이 plain ThreadLocal + explicit copy 로 context 전달 가능 | Agent extraction: "uses plain ThreadLocal with explicit capture — not InheritableThreadLocal" | `company-case-study` + `INFERENCE` (verbatim 확인 필요) | InheritableThreadLocal 금지 환경에서 context propagation 이 필요한 경우 | ca-tmpl 의 ArchUnit InheritableThreadLocal ban 이 이 패턴을 허용하는지 직접 증명하지 않음 (허용 — plain ThreadLocal 이므로) | ## Usage Boundaries - 이 자료가 지지하는 것: - TaskDecorator 기반 explicit capture-restore 가 실제 production 코드에서 사용됨 (AT&T Israel 사례) - InheritableThreadLocal 없이 plain ThreadLocal 으로 context 전달 가능 - 이 자료가 증명하지 않는 것: - virtual thread 환경 (Java 21+) 에서의 동작 — 2022년 작성, Loom GA 이전 - StructuredTaskScope 환경에서의 동작 - domain/business context (tenantId, userId) 에 직접 적용 가능성 — 이 아티클은 correlationId (diagnostic) 에 집중 - 내 프로젝트 적용 시 주의: - Java 21 virtual thread 환경에서 TaskDecorator 패턴이 `SimpleAsyncTaskExecutor` (virtual thread based) 와 호환되는지 별도 확인 필요 - ca-tmpl 의 foundation branch 가 이미 MDC TaskDecorator 를 소유 (`feature-background-job-async-contract`) — 도메인 context 용 TaskDecorator 는 별도 추가 또는 기존 확장 ## 메모 / Notes - AT&T Israel 은 AT&T 의 이스라엘 R&D 센터 — 대규모 Java 서비스 운영 컨텍스트. - 2022년 아티클이므로 Java 21 virtual thread, StructuredTaskScope 에 대한 고려 없음. - ca-tmpl 의 `feature-background-job-async-contract` branch 가 이미 MDC TaskDecorator 를 소유하므로 Alt-3 의 구현은 그 branch 와의 조율이 필요. - virtual thread 환경에서 `SimpleAsyncTaskExecutor` 에도 TaskDecorator 를 attach 할 수 있는지는 Spring Boot 3.2+ 문서 별도 확인 필요.