85 lines
5.3 KiB
Markdown
85 lines
5.3 KiB
Markdown
---
|
|
title: "company-tech-blog / SoftwareMill — Structured Concurrency and Scoped Values in Java (2025)"
|
|
source_type: company-tech-blog
|
|
url: https://softwaremill.com/structured-concurrency-and-scoped-values-in-java/
|
|
archive_url:
|
|
related_branches: [feature-runtime-context-propagation-contract]
|
|
related_projects: [ca-skeleton, ca-tmpl]
|
|
tags: [company-tech-blog, java-25, scoped-value, structured-concurrency, virtual-threads, context-propagation, softwaremill]
|
|
created: 2026-06-09
|
|
last_reviewed: 2026-06-09
|
|
status: raw
|
|
confidence: medium
|
|
---
|
|
|
|
# SoftwareMill — Structured Concurrency and Scoped Values in Java
|
|
|
|
> Layer: `raw/company-tech-blogs/` — SoftwareMill 기술 블로그 발췌.
|
|
> **출처 주의**: company-tech-blog 이므로 본 자료의 권장 사항을 "공식 best practice" 로 일반화 금지. ScopedValue + StructuredTaskScope 조합의 production 사용 패턴 사례 reference 로만 사용.
|
|
> WebFetch 성공. Author: Robert Pudlik, Published/Updated: September 2025.
|
|
|
|
## Parent / 활용 branch
|
|
|
|
| Branch | 이 자료가 정당화하는 결정 |
|
|
|---|---|
|
|
| [[raw/branch-notes/feature-runtime-context-propagation-contract]] | Alt-1 (ScopedValue) 의 StructuredTaskScope 통합 패턴 사례 — "scoped values are easier to reason about than ThreadLocal, and have lower cost" 실무 관점 근거 |
|
|
|
|
## 출처 / Source
|
|
|
|
- 원본 URL: https://softwaremill.com/structured-concurrency-and-scoped-values-in-java/
|
|
- 저자: Robert Pudlik (SoftwareMill)
|
|
- 발행일: September 2025 (updated)
|
|
- 마지막 확인일: 2026-06-09
|
|
- 접근 상태: WebFetch 성공
|
|
|
|
## 핵심 인용 / Key quotes (verbatim, WebFetch)
|
|
|
|
> "scoped values are a mechanism to share immutable data between methods and child threads in a simple and safe way. They are easier to reason about than ThreadLocal, and have lower cost."
|
|
|
|
> "Structured concurrency means that all subtasks are bound to the scope of their parent task and cannot outlive it, just like a method call cannot last longer than the method that invoked it."
|
|
|
|
> "Structured concurrency (JEP 505)" and "Scoped values (JEP 506)" are described as "a great addition to the Java standard API."
|
|
|
|
> Code example (ScopedValue with StructuredTaskScope fork):
|
|
> ```java
|
|
> private static final ScopedValue<String> REQUEST_ID = ScopedValue.newInstance();
|
|
> scope.fork(() -> where(REQUEST_ID, "abc-123").run(Main::handleRequest));
|
|
> ```
|
|
> "Subtasks automatically inherit the bound REQUEST_ID value, allowing logging without parameter passing."
|
|
|
|
## Self-Grep 검증
|
|
|
|
```
|
|
Fragment: "scoped values are a mechanism to share immutable data between methods and child threads in a simple and safe way"
|
|
→ WebFetch output 에서 확인 PASS
|
|
|
|
Fragment: "Structured concurrency means that all subtasks are bound to the scope of their parent task and cannot outlive it"
|
|
→ WebFetch output 에서 확인 PASS
|
|
```
|
|
|
|
검증한 인용 V: 3 / PASS P: 3 / 폐기 D: 0
|
|
|
|
## Claims Extracted
|
|
|
|
| Claim ID | Claim | Evidence quote | Strength | Applies to | Does not prove |
|
|
|---|---|---|---|---|---|
|
|
| SM-SV-C1 | ScopedValue 는 "immutable data" 공유 메커니즘으로 ThreadLocal 보다 "easier to reason about" 하고 "lower cost" 를 가진다 | "scoped values are a mechanism to share immutable data between methods and child threads in a simple and safe way. They are easier to reason about than ThreadLocal, and have lower cost." | `company-case-study` | Java 25 기준 ScopedValue 를 사용하는 production 코드 (2025 업데이트 기준) | "lower cost" 의 정량적 수치 없음. benchmark 없음. ThreadLocal 대비 상대적 표현만 있음 |
|
|
| SM-SV-C2 | StructuredTaskScope.fork() 안에서 ScopedValue binding 을 설정하면 child task 가 자동 상속 | scope.fork() 안에서 `where(REQUEST_ID, "abc-123").run(Main::handleRequest)` 사용 시 "Subtasks automatically inherit the bound REQUEST_ID value" | `company-case-study` | StructuredTaskScope 를 사용하는 Java 25 (finalized) 코드 | Java 21 preview 상태에서의 동작 — API shape 는 동일하나 `--enable-preview` 필요 |
|
|
| SM-SV-C3 | JEP 506 (ScopedValues) + JEP 505 (Structured Concurrency) 모두 Java 25 에서 finalized | "Structured concurrency (JEP 505)" and "Scoped values (JEP 506)" are "a great addition to the Java standard API" (September 2025 업데이트) | `company-case-study` (corroborates official JEP 506 announcement) | Java 25 GA 이후 코드베이스 | Java 21 LTS 에서의 preview 상태를 직접 언급하지 않음 |
|
|
|
|
## Usage Boundaries
|
|
|
|
- 이 자료가 지지하는 것:
|
|
- ScopedValue + StructuredTaskScope 조합이 request-scoped context propagation 에 실용적으로 사용 가능함 (SoftwareMill 엔지니어 관점)
|
|
- Java 25 기준으로 두 feature 모두 안정화됨
|
|
- 이 자료가 증명하지 않는 것:
|
|
- Spring Boot 3.5.x (Java 21 preview) 환경에서의 production 안전성
|
|
- 대규모 서비스 (high RPS, multi-tenant) 에서의 운영 검증
|
|
- ThreadLocal 기반 legacy 코드에서 ScopedValue 로의 마이그레이션 비용
|
|
|
|
## 메모 / Notes
|
|
|
|
- SoftwareMill 은 Java/Scala 전문 기술 컨설팅 회사 (폴란드). 저자 Robert Pudlik 은 블로그에 credited.
|
|
- company-tech-blog 이므로 공식 best practice 로 취급 금지. JEP 506 공식 문서와 corroboration 시 신뢰도 상승.
|
|
- 이 블로그는 Java 25 기준으로 작성. ca-tmpl 의 Java 21 LTS 환경에서는 `--enable-preview` 플래그 필요 — 이 블로그는 그 제약을 명시하지 않음.
|