스코프 값
ThreadLocal의 함정 없이 호출 스택 전반에 걸쳐 데이터를 안전하게 공유합니다.
코드 비교
✕ Java 8
static final ThreadLocal<User> CURRENT =
new ThreadLocal<>();
void handle(Request req) {
CURRENT.set(authenticate(req));
try { process(); }
finally { CURRENT.remove(); }
}
✓ Java 25
static final ScopedValue<User> CURRENT =
ScopedValue.newInstance();
void handle(Request req) {
ScopedValue.where(CURRENT,
authenticate(req)
).run(this::process);
}
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
불변
호출자는 읽을 수 있지만 스코프 값을 수정할 수 없습니다.
자동 정리
수동 remove() 불필요 — 값은 블록 범위로 제한됩니다.
가상 스레드 안전
수백만 개의 가상 스레드에서 효율적으로 작동합니다.
이전 방식
ThreadLocal
모던 방식
ScopedValue
JDK 버전
25
난이도
고급
JDK 지원
스코프 값
사용 가능
JDK 25 LTS에서 확정 (JEP 506, 2025년 9월).
동작 원리
ScopedValue는 불변이고 상속 가능하며 스코프가 제한된 컨텍스트를 제공합니다. ThreadLocal과 달리 스코프 값은 자동으로 정리되고, 가상 스레드와 함께 작동하며, 호출자가 변경할 수 없습니다.
관련 문서