--- title: blog-topic / five-stage local bootstrap contract source_type: blog-topic status: raw related_branches: [feature-developer-experience-contract] related_projects: [ca-tmpl] tags: [blog-topic, ca-tmpl, ci-cd, gradle, docker] created: 2026-06-24 status_label: ready-for-canonical target_audience: backend-engineer inspiration_url: archive_url: --- # blog-topic: five-stage-local-bootstrap-contract ## Parent / 부모 - [[raw/branch-notes/feature-developer-experience-contract]] — single-command bootstrap 구현·검증에서 파생. ## 트리거 / Trigger - 트리거 유형: `branch-work` - 트리거 날짜: 2026-06-24 - 트리거 연결 노트: [[raw/branch-notes/feature-developer-experience-contract]] ## 글감 / Topic seed - 한 문장 요지: 단일 bootstrap 명령의 가치는 명령 수가 아니라 compile, dependency, migration, contract, HTTP smoke 실패를 서로 다른 증거로 분리하는 데 있다. - 예상 제목 후보: - Spring Boot 템플릿의 첫 실행을 5단계 Gradle 계약으로 만든 이유 - docker compose up만으로는 잡지 못한 local bootstrap 실패 두 가지 ## 핵심 주장 후보 / Claim candidates - 사실 후보: - `./gradlew bootstrap`이 다섯 task를 순서대로 실행한다 — 근거: [[raw/branch-notes/feature-developer-experience-contract]] D3, §2026-06-24 구현 결과. - README 명령 drift가 `check`에서 검증된다 — 근거: 같은 branch D4. - 경험 후보: - host 5432 publish 제거와 slim JRE RNG bean 수정 뒤 실제 container health + HTTP smoke가 통과했다 — 근거: branch §마주친 문제, 두 error note. - 의견/해석 후보: - fresh-clone DX는 문서 친절도보다 실행 가능한 실패 계약으로 평가하는 편이 더 재현 가능하다. ## Outline seed 1. 왜 단일 명령인가 — 사용자가 기억할 entrypoint를 하나로 줄이되 내부 실패는 숨기지 않는다. 2. 다섯 단계의 경계 — compile, dependency, migration/start, delegated sample contract, HTTP smoke가 잡는 결함이 서로 다르다. 3. 실제로 잡힌 두 실패 — host port exposure와 slim JRE provider parity가 unit test만으로 남는 이유. 4. 문서도 빌드 입력이다 — README command drift와 link-rot를 CI 계약으로 만드는 방법. 5. 검증 등급의 경계 — local green과 CI/OS/prod 검증을 구분한다. ## Canonical 전환 후보 / Canonical extraction candidates - `wiki/projects/ca-tmpl/developer-experience-bootstrap.md` 후보: - 5단계 task graph, failure contract, local verification 결과. - `wiki/concepts/runtime-image-parity.md` 후보: - full JDK test와 slim JRE provider/module parity gap. - 필요한 추가 검증: - Linux clean clone, Apple Silicon, WSL2 실행 시간/성공률. - GitHub Actions link-check 실제 실행과 false-positive 수렴. ## Sources / 근거 후보 - [[raw/branch-notes/feature-developer-experience-contract]] D3, D4, D8, D10. - [[raw/errors/bootstrap-postgres-port-collision-2026-06-24]]. - [[raw/errors/slim-jre-random-generator-missing-2026-06-24]]. - [[raw/interviews/single-command-local-bootstrap]]. ## 미해결 / Unknown - 아직 확인해야 할 사실: 지원 OS별 first-run 시간과 GitHub link-check 결과. - 과장하면 안 되는 부분: Linux local 검증을 모든 OS/CI/prod에서의 보장으로 표현하지 않는다. - 블로그로 쓰기 전에 필요한 canonical 정제: 위 project/concept 후보에 code/test evidence를 추출한다. ## Decision / 처리 결정 - 액션: `promote-to-canonical` - 이유: `wiki/projects/ca-tmpl/devops-ci-supply-chain-dx.md` 에 five-stage local bootstrap 글감으로 반영했다. - 다음 단계: target canonical이 아직 `draft` 이므로 `blogify` 전 review/verify가 필요하다. Linux local 검증을 모든 OS/CI/prod 보장으로 표현하지 않는다. ## Related / 관련 - [[raw/branch-notes/feature-developer-experience-contract]]. - [[raw/errors/bootstrap-postgres-port-collision-2026-06-24]]. - [[raw/errors/slim-jre-random-generator-missing-2026-06-24]]. - [[raw/interviews/single-command-local-bootstrap]]. - derived blog: 생성 전. canonical 정제 후 `wiki/blog/-YYYY-MM-DD.md` 후보.