Files
document-haness/docs/clean-architecture-backend-template/tech-log-studio/capability-and-disclosure-models/concept/concept-adapter-outbound-objectstorage-c01.md
T
DongHyeonkaandClaude Fable 5.1 b25357c48a docs(clean-architecture-backend-template): fold analysis into final and re-select one topic
- analysis/·source-index·state.json 을 final/document.md 제2부·제3부로 접었다. SSOT 는 하나다
- 파일럿 — commit-ambiguity-as-a-result 를 새 기준으로 재선별. 후보 14 → 글감 5
  (PROMOTE 5 · MERGE_INTO 3 · KEEP_IN_SSOT 4 · 보류 2). 기록 5건을 다시 썼고 그림 1개를
  techviz 로 만들었다
- 재선별이 잡은 것: 제1부 §6.2·§11.1 이 자기 §13.2 와 어긋나 있었다(레인을 안 돌렸다 vs
  돌렸다) — 정정. 이미 답이 나와 있던 Question 을 HEAD 재실행 질문으로 다시 세웠다.
  Concept 이 인용한 코드가 SSOT 에 없어 뺐다
- candidateScope·sourceRepository 기록. 나머지 43개 주제는 재선별 대기(PENDING 905)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 12:39:20 +09:00

3.6 KiB
Raw Blame History

kind, slug, title, topic, project, status, sourceRevision, rootTreeNode, evidenceCapturedOn, assets, evidence, source, module
kind slug title topic project status sourceRevision rootTreeNode evidenceCapturedOn assets evidence source module
CONCEPT adapter-outbound-objectstorage-c01 컴파일이 전부 끝난 뒤에야 생성이 시작된다 capability-and-disclosure-models clean-architecture-backend-template 게시 전 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 concept:adapter-outbound-objectstorage-c01 2026-09-01
key file
adapter-outbound-objectstorage-c01 ../../../final/evidence/rendered/adapter-outbound-objectstorage-c01.svg
key file
adapter-outbound-objectstorage-c01-diagram ../../../final/assets/diagrams/adapter-outbound-objectstorage-c01.svg
../../../final/evidence/raw/adapter-outbound-objectstorage-c01.txt
원본 분석 절은 final/document.md#a09#L63 이다.
adapter-outbound-objectstorage

컴파일이 전부 끝난 뒤에야 생성이 시작된다

ObjectStorageProviderContributiondescribecreate의 계약을 나누고, ObjectStorageCapabilityAssembler.assemble이 그 순서를 코드 구조로 지킨다. 컴파일러 자체가 fail-closed다.

본문

ObjectStorageProviderContribution이 두 메서드의 계약을 나눈다.

describe must not resolve credentials, create files, clients, threads, or schedulers. create owns cleanup of every partial allocation before it throws; after a successful return the assembler owns the returned lifecycle exactly once.

컴파일과 생성의 순서

:::evidence key="adapter-outbound-objectstorage-c01-diagram" alt="설정 컴파일에서 provider 생성으로, 다시 조립된 능력으로 이어지는 왼쪽에서 오른쪽 흐름. 화살표에 검증된 바인딩과 수명주기 소유권이 붙어 있다" caption="컴파일과 생성의 순서" zoom="false" :::

ObjectStorageCapabilityAssembler.assemble이 그 순서를 지킨다 — compiler.compile(settings)전부 끝난 뒤(:25)에야 선택된 destination을 돌며 contribution.create(provider)를 부른다(:48). 그리고 도중에 실패하면 이미 만든 것을 역순으로 닫는다(:5356). AssembledCapability.close()도 역순이고 AtomicBoolean으로 정확히 한 번만 실행된다. README의 "Settings compile fully before any selected provider creates a directory, client, thread, scheduler, or credential lookup"이 코드 구조로 성립한다.

ObjectStorageProviderContribution 참조 위치

:::evidence key="adapter-outbound-objectstorage-c01" alt="코드베이스에서 ObjectStorageProviderContribution 를 검색한 출력 39줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="ObjectStorageProviderContribution 코드베이스 검색 — 39줄 · exit 0" zoom="true" :::

컴파일러가 거부하는 것

컴파일러 자체가 fail-closed다. 비활성이면 빈 바인딩을 돌려주고, 활성인데 provider·destination·default destination 중 하나라도 비면 거부한다. provider마다 describe가 돌려준 서술자와 설정을 대조한다 — providerType 일치, version 일치, maximumObjectBytes가 서술자 상한 이하, chunkBytes가 서술자 상한 이하. chunk는 추가로 1 ≤ chunk ≤ min(maxObject, 16 MiB)이고 Integer.MAX_VALUE를 넘지 못한다.

destination은 route token 중복을 거부하고, 요구한 capability를 provider가 SUPPORTED로 신고하지 않으면 거부하며, SCAN_CLEAN을 요구하는데 scanner seam이 없으면 이름을 대며 거부한다.

식별자 검증의 범위

canonicalId는 64자 이내, [a-z0-9][a-z0-9_-]*, 소문자, 그리고 0x20–0x7e 밖 문자를 전부 거부한다.