#421 · bluetape4k-projects · tenant context

tenant를 전달하고, 경계를 지킵니다.

네 가지 tenant carrier를 읽을 수 있는 값, 소유하는 scope, 경계를 넘어 남는 범위로 비교합니다.

Carrier

carrier 경계 탐색

carrier를 고르고 여섯 가지 상황을 재생합니다. 무엇이 보이는지, 누가 소유하는지, 경계 뒤에 무엇이 남는지 확인합니다.

Carrier
ThreadLocal

현재 thread와 이 carrier instance 범위에 binding을 보관합니다.

    현재 단계 · 01

    진행 중

    진행률1 / 3

    키보드: 단계에 Tab으로 이동하고 Enter를 눌러 살펴보세요.

    소유 계약 비교

    소유 계약 비교

    네 가지 tenant carrier를 읽을 수 있는 값, 소유하는 scope, 경계를 넘어 남는 범위로 비교합니다.

    ThreadLocal

    현재 thread와 이 carrier instance 범위에 binding을 보관합니다.

    Binding
    withTenant(tenantId)가 block 앞에서 값을 설정합니다.
    조회
    같은 thread에서 currentOrNull 또는 requireCurrent로 읽습니다.
    경계 이후
    finally에서 이전 값을 복원하거나 remove합니다.

    ScopedValue

    lexical ScopedValue carrier가 binding을 소유합니다.

    Binding
    ScopedValue.where(...).run이 lexical binding을 엽니다.
    조회
    lexical carrier가 bound된 동안에만 읽습니다.
    경계 이후
    run을 벗어나면 이전 lexical 상태로 복원합니다.

    Reactor Context

    각 subscriber가 immutable Context chain을 소유합니다.

    Binding
    contextWrite가 이 subscription을 위한 Context를 파생합니다.
    조회
    deferContextual이 subscriber Context를 명시적으로 읽습니다.
    경계 이후
    cancel은 subscription을 끝내며 outer Context는 바뀌지 않습니다.

    Ktor Call

    ApplicationCall attributes가 binding을 소유합니다.

    Binding
    bindTenant가 private write-once call attribute를 기록합니다.
    조회
    dispatcher hop 뒤에도 같은 ApplicationCall에서 읽습니다.
    경계 이후
    call이 해제될 때까지 tenant를 유지합니다.

    Caller 책임

    Caller 책임

    어떤 carrier도 tenant를 임의로 만들지 않습니다.

    ThreadLocal

    dispatcher 또는 suspend hop으로 자동 전파되지 않습니다.

    ScopedValue

    StructuredTaskScope.fork는 상속하지만 독립 virtual thread와 coroutine bridge는 전파하지 않습니다.

    Reactor Context

    scheduler 작업은 chain 안에 있지만 hook과 coroutine bridge는 자동으로 생기지 않습니다.

    Ktor Call

    새 call은 unbound이며 dispatcher 경계에서는 call을 명시적으로 전달합니다.

    경계 이후: 인증, 인가, tenant 해석과 업무 효과의 안전성은 caller가 소유합니다.

    고정한 원본

    고정한 원본

    5954b6329a3e11c70ef12b6d4bd8480e7b38be1b