21주차 미리보기
W21 미리보기 · 웹소설 본편

STARRY PASS 17 — 두 개의 작업장과 마지막 퇴장표

켜져 있다는 것과 손님을 받을 준비가 됐다는 것은 전혀 다른 문제였다

범위개요 + D1–D6 · 월–토p690 W21 제목–p714 — W21 개요 + D1–D6
정본 상태SOURCE AUDIT PASSPDF·package·display byte 폐쇄
실행 상태W21 D1–D6 RUNTIME NOT_RUNruntimeRunsByPreview=0

이 이야기는 p690 W21 제목–p714 — W21 개요 + D1–D6만 다룹니다. strict D1–D6 초회 예상시간은 8시간 20분–15시간 50분입니다. 공통 코어 · 트랙 선택 시 증권 기본이지만 W21 본문은 트랙 분기 없는 공통 코어입니다. 현재 상태는 W21 D1–D6 RUNTIME NOT_RUN이고 runtimeRunsByPreview=0입니다. source audit PASS는 Docker daemon·Gradle·PostgreSQL·host JVM을 실행했다는 뜻이 아닙니다. modern 코드 표찰은 canonical 2개와 illustrative 8개, aggregate 10/223/217/0/217/217/34/0이며 Q33·Q34는 정본 답안이 아닙니다.

월요일 저녁, STARRY의 간판은 켜졌는데 문 앞의 작은 상태등은 아직 노란색이었다. 히토리가 “불이 켜졌으니 영업 중 아닌가요?”라고 묻자 니지카는 네 장의 점검표를 꺼냈다. 첫 장에는 process의 PID, 둘째에는 8080 LISTEN, 셋째에는 health UP, 마지막에는 SIGTERM 뒤 process와 port가 사라진 시간이 적혀 있었다. 실행 중이라는 사실과 손님을 받을 준비가 됐다는 사실은 서로 대신할 수 없었다.

니지카가 화면을 확인하는 공식 장면컷 — 학습 서사는 비공식 구성
공식 장면컷은 분위기용이며, STARRY의 학습 사건·대사·기술 수치는 원문 감사에 따른 비공식 구성입니다.
실행 중과 준비 완료는 다르다 — D1 · 한 번의 JVM을 PID부터 종료 뒤 부재까지 추적
그림 한눈에: 같은 JVM을 PID→port→health→SIGTERM→부재까지 한 실행으로 추적합니다.

료는 점검표 끝에 굵은 글씨로 덧붙였다. “kill -9는 퇴장 요청이 아니라 강제 퇴장. D3의 Stop-Process -Force도 정리 증거일 뿐 D1의 graceful SIGTERM 증거가 아니야.” 히토리는 같은 마지막 상태라도 과정의 의미가 다르다는 것을 처음 알았다. 파일이 40 byte보다 크고 placeholder가 없다는 validator 도장도 실제 PID와 종료 시간을 읽어 주지는 못했다.

화요일에는 공연용 장비를 싣는 작업장이 둘로 나뉘었다. 넓은 builder 작업장에는 Java 21 JDK와 Gradle이 있었고, 작은 runtime 매장에는 완성된 /app/app.jar와 Java 21 JRE만 들어갔다. 키타는 제한 출입증 10001을 목에 걸었다. EXPOSE 8080 표찰은 문 위치를 알려 줄 뿐 실제 문을 열거나 health를 보장하지 않았다.

공사장과 완성 매장을 분리한다 — D2 · build 도구는 builder에, 실행 JAR만 runtime에
그림 한눈에: builder에서 만든 JAR만 runtime으로 옮기고 최종 process는 UID 10001로 실행합니다.

상자를 닫기 전에 니지카는 .git, .gradle, build, evidence, env, log를 build context에서 제외했다. 그러나 료는 “ignore는 금고가 아니야. 이미 새어 나온 secret은 revoke·rotate가 먼저야”라고 잘랐다. image runner는 absolute learner path를 확인한 뒤에만 build하고, 성공 뒤 user·금지 경로·builder tool·hash를 검사해 temporary 영수증을 atomic replace했다.

이미지 영수증은 입력과 결과를 함께 묶는다 — D2 · build 성공 뒤에만 inspect·hash·atomic evidence
그림 한눈에: learner 입력과 image/JAR/source hash, UID·격리 probe를 한 JSON 영수증에 묶습니다.
카운터에 멤버들이 모인 공식 장면컷 — 학습 서사는 비공식 구성
공식 장면컷은 분위기용이며, STARRY의 학습 사건·대사·기술 수치는 원문 감사에 따른 비공식 구성입니다.

수요일, 무대 뒤 창고에는 PostgreSQL 상자 하나만 놓였다. Compose 명부의 service는 exact db 하나였고 application은 container 안이 아니라 host JVM 배우로 무대에 올랐다. D3 runner가 db readiness를 기다리고 host bootRun을 시작해 PID·port·health·API를 관찰한 뒤, 마지막에는 process와 container와 volume이 모두 남지 않았는지 확인했다.

Compose는 DB 하나, 앱은 host JVM — D3 · 실행 위치와 lifecycle owner를 섞지 않는다
그림 한눈에: Compose는 db만, application은 host JVM에서 실행하며 D3가 전체 lifecycle을 소유합니다.

그때 히토리는 두 표에서 서로 다른 port를 발견했다. PDF와 Docker 표찰은 8080을 말했지만 packaged runner의 기본값은 28021이었다. 니지카는 어느 쪽도 지우지 않고 실제 invocation의 -Port와 manifest에 기록된 actual port를 최종 연결고리로 삼았다. 짧은 p701 command에 mandatory ProjectRoot가 빠진 것도 같은 방식으로 완전한 script 계약과 대조했다.

8080과 28021을 같은 값으로 읽지 않는다 — 문서 계약과 packaged runner 기본값은 실제 invocation이 연결
그림 한눈에: 8080 계약과 runner default 28021은 실제 invocation·manifest가 묶을 때만 한 실행의 값이 됩니다.

목요일에는 배경막 뒤에 설정표를 걸었다. URL과 username은 환경 변수로 들어왔고 password는 trusted terminal에서만 공급됐다. profile은 손님이 고르는 메뉴가 아니라 배포 시스템이 local·test·prod 설정 묶음을 선택하는 장치였다. 문서 모양이 안전해 보여도 actuator, startup log, shell history까지 보지 않으면 secret 비노출 Green은 아니었다.

설정은 밖에서, 비밀은 기록 밖에서 — D4 · externalized config와 secret non-exposure는 별도 검토
그림 한눈에: 설정값의 주입 경로와 비밀값의 기록 금지, 실제 노출 검토를 세 층으로 나눕니다.
멤버들이 함께 의논하는 공식 장면컷 — 학습 서사는 비공식 구성
공식 장면컷은 분위기용이며, STARRY의 학습 사건·대사·기술 수치는 원문 감사에 따른 비공식 구성입니다.

금요일, 료가 DB 스위치를 잠시 내렸다. JVM은 살아 있어 liveness는 UP을 유지했지만 새 주문을 받을 준비가 없어서 readiness는 DOWN이 됐다. DB가 돌아온 뒤 readiness가 다시 UP이 되어야 traffic을 열었다. DB를 liveness에 넣으면 dependency 장애가 process 재시작 loop로 번질 수 있었다.

살아 있음과 요청 받을 준비를 분리한다 — D5 · DB 정상→중단→복구에서 liveness와 readiness 전이
그림 한눈에: 정상·DB 중단·복구에서 liveness는 process, readiness는 traffic 결정을 담당합니다.

대기 시간에는 두 장의 비정본 SQL 연습표를 풀었다. Q33은 account별 직전 amount를 LAG로 붙여 첫 행 NULL과 21행 oracle을 확인했다. Q34는 customer별 최신순 ROW_NUMBER를 매겨 3+3+1+1, 총 8행을 남겼다. 둘 다 workbook 제공 정답이 아니라 table·status·tie-breaker 가정을 공개한 학습 예시였다.

Q33 · 바로 전 거래를 옆 칸에 붙인다 — 비정본 예시 · account별 occurred_at, tx_id 순서
그림 한눈에: Q33은 account partition과 안정 정렬 뒤 previous amount를 붙이며 첫 행은 NULL입니다.
Q34 · 고객마다 최신 세 건만 남긴다 — 비정본 예시 · customer별 최신순 ROW_NUMBER
그림 한눈에: Q34는 customer마다 최신 세 건만 남기고 동시각은 tx_id DESC로 끊습니다.

토요일, 네 사람은 새 공연을 시작하지 않았다. D3가 남긴 host-app-manifest.json을 열어 teardown=1, container_absent=true, volume_absent=true를 읽었을 뿐이었다. 같은 hash의 영수증을 다시 읽었다고 새 lifecycle을 실행한 것은 아니다. D6의 역할은 producer를 가로채는 것이 아니라 증거 연결을 확인하고 새 stdout·resource-limit ownership claim을 만들지 않는 것이었다.

한 번 만든 퇴장표를 다시 읽는다 — D3 producer → D6 read-only consumer · 새 실행 주장 금지
그림 한눈에: D3가 만든 한 번의 퇴장표를 D6이 읽기 전용으로 검토하며 새 실행으로 부풀리지 않습니다.

히토리는 마지막 표지에 적었다. “W21 D1–D6 RUNTIME NOT_RUN. source가 기대하는 Green marker와 우리가 실제로 실행한 Green은 다르다.” 그리고 p715의 D7, p719의 주간 통합, p720의 W22 표지는 다음 장으로 넘겼다. 켜진 간판, 열린 port, 준비된 dependency, 정리된 resource를 서로 다른 증거로 읽을 때에만 STARRY의 문이 안전하게 열렸다.

W21 미리보기 · 히토리 질문 노트

히토리의 질문 노트 — STARRY PASS 17

본편의 작업장·창고·퇴장표 비유를 W21 Linux·Docker·Compose·health·evidence의 정확한 source 역할과 증거 경계로 다시 연결합니다. 모든 답은 p690 W21 제목–p714 — W21 개요 + D1–D6에 한정합니다. 현재 상태는 W21 D1–D6 RUNTIME NOT_RUN이고 runtimeRunsByPreview=0입니다. expected marker를 실제 실행 Green으로 바꾸어 읽지 않습니다.

1. 이번 미리보기의 strict PDF 범위는 어디인가요?

답: p690 중간의 W21 제목부터 p714 D6 최종 Gate까지입니다.

근거: 정확한 표기는 p690 W21 제목–p714 — W21 개요 + D1–D6입니다. p690의 W21 제목 위 W20 복구·OWASP 참고는 제외하고, p715 D7, p719 주간 통합, p720 W22는 포함하지 않습니다.

오답 함정: source audit가 W21 전체 p690–720을 닫았다는 이유로 D7이나 주간 Green Gate를 이 D1–D6 미리보기에 섞으면 안 됩니다.

범위 한계: p690은 혼합 페이지이므로 페이지 번호만이 아니라 W21 heading부터라는 의미 경계를 함께 확인해야 합니다.

실제 기술 이름mixed-page semantic PDF boundary for W21 overview and D1-D6

2. D1–D6 예상시간 합계와 기본 트랙 표지는 무엇인가요?

답: 합계는 8시간 20분–15시간 50분, 즉 500–950분이며 공통 코어 · 트랙 선택 시 증권 기본입니다.

근거: D1 55–105분, D2 80–155분, D3 100–190분, D4 65–130분, D5 105–200분, D6 95–170분을 더합니다.

오답 함정: p690의 주간 총계 9시간 20분–17시간 50분은 D7까지 포함하므로 strict D1–D6 합계로 쓰면 안 됩니다.

범위 한계: W21 본문에는 증권/카드 분기가 없습니다. 증권은 UI 기본값일 뿐 W21을 증권 전용 과제로 바꾸지 않습니다.

실제 기술 이름bounded active-time total with source-neutral default-track metadata

3. SOURCE AUDIT PASS는 현재 Docker·DB 실행 Green인가요?

답: 아닙니다. 현재 미리보기 상태는 W21 D1–D6 RUNTIME NOT_RUN이고 runtimeRunsByPreview=0입니다.

근거: source audit PASS는 PDF/package/display byte 폐쇄와 fixture oracle을 확인합니다. W21_IMAGE_GREENW21_HOST_APP_GREEN은 source가 기대하는 marker이지 이 미리보기가 실행해 얻은 결과가 아닙니다.

오답 함정: HTML에 Green 문자열이 보인다는 이유로 Docker daemon, Gradle, PostgreSQL, host JVM lifecycle이 이미 통과했다고 말하면 안 됩니다.

범위 한계: 실제 Green에는 learner root에서 새 실행, native exit, artifact hash, cleanup field가 필요합니다.

실제 기술 이름static source-closure audit versus runtime execution evidence

4. process·port·health는 왜 세 칸으로 봐야 하나요?

답: PID 존재, 8080 LISTEN, health UP은 서로 다른 질문에 답하기 때문입니다.

근거: D1 순서는 ps로 process, ss로 socket, curl로 health를 확인합니다. process가 있어도 port가 닫힐 수 있고, port가 열려도 요청 준비가 끝나지 않을 수 있습니다.

오답 함정: ps 한 줄이나 8080 LISTEN 하나만 보고 서비스 정상이라고 결론 내리면 안 됩니다.

범위 한계: health UP 한 번은 D5의 DB 중단·복구 readiness 전이를 증명하지 않습니다.

실제 기술 이름orthogonal process-listener-health diagnostics

실행 중과 준비 완료는 다르다 — D1 · 한 번의 JVM을 PID부터 종료 뒤 부재까지 추적
그림 한눈에: D1 · 한 번의 JVM을 PID부터 종료 뒤 부재까지 추적.

5. D1의 한 실행 추적 순서와 관찰값은 무엇인가요?

답: JAR 실행 → PID → 8080 LISTEN → health UP → SIGTERM → process·port absent 순서입니다.

근거: runbook에는 PID>0, PORT_8080_LISTEN=1, HEALTH_STATUS=UP, 실제 종료 초, PROCESS_ABSENT=1, PORT_8080_LISTEN_AFTER=0를 같은 실행의 명령·시각과 함께 적습니다.

오답 함정: 서로 다른 실행의 PID·port·health 출력을 한 영수증으로 합치거나 placeholder PID를 남기면 안 됩니다.

범위 한계: D1 shell 블록은 학습 골격이라 실제 PID와 환경을 채워야 하며 완성 script가 아닙니다.

실제 기술 이름single-run Linux JVM diagnostic chain with post-stop absence

6. SIGTERM과 D3의 Stop-Process -Force를 같은 증거로 볼 수 있나요?

답: 아닙니다. D1은 graceful 종료 요청을, D3는 finally cleanup의 강제 process 제거를 다룹니다.

근거: kill -TERM은 JVM shutdown hook에 정상 종료 기회를 줍니다. canonical host runner의 Stop-Process -Force는 실패 path에서도 process를 남기지 않기 위한 cleanup입니다.

오답 함정: process가 사라졌다는 최종 상태가 같아도 종료 signal·hook·timeout 의미까지 같다고 보면 안 됩니다.

범위 한계: graceful proof에는 SIGTERM 수신부터 bounded exit까지의 직접 관찰이 필요합니다.

실제 기술 이름graceful-signal proof versus forced-cleanup invariant

7. D1 LOCAL_ARTIFACT_VALIDATED marker는 무엇을 확인하나요?

답: runbook 파일 존재, 최소 bytes·비어 있지 않은 줄, placeholder 부재, SHA-256만 확인합니다.

근거: marker는 LOCAL_ARTIFACT_VALIDATED W21D1 bytes=<actual> sha256=<64-hex>입니다. 실제 여섯 관찰값의 의미가 맞는지는 사람이 대조해야 합니다.

오답 함정: generic validator exit 0을 process·port·health·SIGTERM 의미 Green으로 바꾸면 안 됩니다.

범위 한계: 사람 검토 전 상태는 HUMAN_SEMANTIC_REVIEW_REQUIRED입니다.

실제 기술 이름artifact-integrity precheck with human semantic review gate

8. multi-stage Dockerfile은 무엇을 분리하나요?

답: JDK·Gradle이 필요한 builder와 JRE·app.jar만 필요한 runtime을 분리합니다.

근거: 첫 stage는 eclipse-temurin:21-jdk, 둘째는 eclipse-temurin:21-jre이며 COPY --from=builder/app/app.jar만 옮깁니다.

오답 함정: stage가 두 개라는 사실만으로 secret·source·builder tool이 완전히 사라졌다고 추정하면 안 됩니다.

범위 한계: 실제 격리는 image 내부 경로와 gradle·javac 부재 probe까지 확인해야 합니다.

실제 기술 이름multi-stage Java image with builder-runtime separation

공사장과 완성 매장을 분리한다 — D2 · build 도구는 builder에, 실행 JAR만 runtime에
그림 한눈에: D2 · build 도구는 builder에, 실행 JAR만 runtime에.

9. USER 10001과 EXPOSE 8080은 각각 무엇을 뜻하나요?

답: USER 10001은 runtime process identity이고 EXPOSE 8080은 image metadata입니다.

근거: runner는 Config.User와 container id -u가 모두 10001인지 확인합니다. EXPOSE는 port를 실제로 열거나 health를 보장하지 않습니다.

오답 함정: non-root 하나로 read-only filesystem·Linux capability·network policy까지 자동 완료됐다고 말하면 안 됩니다.

범위 한계: image hardening 전체에는 filesystem, capabilities, base image, vulnerability, runtime policy 검증이 더 필요합니다.

실제 기술 이름container runtime UID verification and non-binding EXPOSE metadata

10. .dockerignore의 exact 목록과 보안 한계는 무엇인가요?

답: .git, .gradle, build, evidence, *.env, .env, *.log를 build context에서 제외합니다.

근거: D2 runner는 최소 .git, evidence, build, *.env exact pattern을 검사하고 runtime에서 /app/.git, /app/evidence, /app/.env가 없는지도 봅니다.

오답 함정: .dockerignore를 secret manager로 보거나 이미 layer·Git에 들어간 secret을 삭제해 준다고 생각하면 안 됩니다.

범위 한계: 노출된 secret은 ignore 추가보다 revoke·rotate가 먼저입니다.

실제 기술 이름Docker build-context minimization with secret-rotation boundary

11. run-w21-image.ps1의 fail-closed 순서는 무엇인가요?

답: absolute path·필수 파일·정적 계약을 먼저 확인하고 build 성공 뒤에만 inspect·runtime probe·hash evidence로 갑니다.

근거: 실패한 build 뒤 inspect를 실행하지 않으며, UID·builder tool·금지 경로·image id·JAR/source hash를 모두 통과해야 temporary evidence를 최종 path로 교체합니다.

오답 함정: Dockerfile을 runner가 대신 생성한다고 보거나 과거 evidence만 읽고 새 image를 검사했다고 쓰면 안 됩니다.

범위 한계: 이 owner는 image 범위만 담당하고 Compose·DB lifecycle이나 app health를 실행하지 않습니다.

실제 기술 이름fail-closed Docker build-inspect-evidence pipeline

이미지 영수증은 입력과 결과를 함께 묶는다 — D2 · build 성공 뒤에만 inspect·hash·atomic evidence
그림 한눈에: D2 · build 성공 뒤에만 inspect·hash·atomic evidence.

12. docker-image.json은 어떤 값을 서로 묶어야 하나요?

답: learner source, image/JAR identity, runtime UID, isolation probe와 native exit를 한 실행에 묶어야 합니다.

근거: source=LEARNER_PROJECT, stage≥2, user/runtime_uid 10001, builder_tools_absent, forbidden_paths_absent, image/build.gradle/JAR/Dockerfile/.dockerignore hash, native_exit=0이 핵심입니다.

오답 함정: md 설명이나 predecessor 성공으로 canonical JSON을 대체하거나 빈/placeholder hash를 허용하면 안 됩니다.

범위 한계: byte binding은 learner가 직접 작성했는지나 image가 운영에 안전한지까지 증명하지 않습니다.

실제 기술 이름source-and-runtime-bound immutable Docker evidence receipt

13. W21_IMAGE_GREEN이 직접 증명하지 않는 것은 무엇인가요?

답: application health, DB readiness, cloud 배포, complete image security는 증명하지 않습니다.

근거: marker는 UID 10001, builder tool·금지 경로 부재, source/JAR hash, native exit라는 image runner 관찰에 한정됩니다.

오답 함정: 이름에 GREEN이 들어간다는 이유로 W21 전체 lifecycle Green으로 넓히면 owner와 proof 범위가 사라집니다.

범위 한계: 각 claim은 그 claim을 직접 관찰한 runner와 evidence path에 붙여야 합니다.

실제 기술 이름marker-scoped Docker image claim discipline

14. D3의 Compose가 exact db 하나만 소유한다는 뜻은 무엇인가요?

답: Compose service는 db 하나이며 application은 container가 아니라 host JVM에서 실행된다는 뜻입니다.

근거: DB는 financial_core, user는 app, image는 postgres:17.10-alpine이고 pg_isready healthcheck와 전용 volume을 사용합니다.

오답 함정: service 이름을 postgres로 바꾸거나 app container가 있다고 설명하거나 container 안 localhost:5432를 DB 주소로 쓰면 안 됩니다.

범위 한계: 이 구성은 학습용 단일 PostgreSQL이며 production HA나 network policy가 아닙니다.

실제 기술 이름DB-only Docker Compose with host-JVM application runtime

Compose는 DB 하나, 앱은 host JVM — D3 · 실행 위치와 lifecycle owner를 섞지 않는다
그림 한눈에: D3 · 실행 위치와 lifecycle owner를 섞지 않는다.

15. D3 lifecycle owner의 정확한 실행 순서는 무엇인가요?

답: compose config → db up --wait → host bootRun → health/listen/API → process stop → down -v 순서입니다.

근거: runner는 exact service db를 확인하고, health UP, listener PID, API 200 또는 401을 manifest에 기록한 뒤 process·container·volume 부재를 확인합니다.

오답 함정: API 200/401을 authorization correctness로 보거나, health UP을 D5 전체 readiness 전이로 확대하면 안 됩니다.

범위 한계: D3의 실행 owner는 canonical run-w21-host-app.ps1 하나입니다.

실제 기술 이름ordered DB-readiness and host-JVM lifecycle orchestration

16. p701 짧은 실행 예시에서 빠진 mandatory 인자는 무엇인가요?

답: 실제 packaged script에는 ProjectRootEvidenceDir가 모두 mandatory인데 짧은 예시는 EvidenceDir만 보입니다.

근거: 완전한 호출 계약은 -ProjectRoot <LearnerRoot> -EvidenceDir <LearnerRoot>/evidence/w21입니다. runner는 ProjectRoot를 resolve해 gradlew.bat를 실행합니다.

오답 함정: 짧은 인쇄 command를 그대로 완전한 실행 명세라고 보거나 runner가 learner project를 자동 발견한다고 추정하면 안 됩니다.

범위 한계: 미리보기는 문서 내부 불일치를 표시할 뿐 어떤 invocation도 실행하지 않았습니다.

실제 기술 이름mandatory PowerShell parameter contract reconciliation

17. 8080과 runner 기본값 28021은 어떻게 함께 읽나요?

답: PDF·Docker metadata의 관찰 계약 8080과 packaged runner default 28021을 구분하고 실제 invocation 또는 manifest로 값을 고정합니다.

근거: 개요·D1·D3 기대는 8080을 말하지만 canonical host runner parameter는 $Port=28021, $DbPort=62121입니다.

오답 함정: 둘 중 하나를 오타라 가정해 지우거나 서로 다른 실행의 PID·port를 한 evidence로 합치면 안 됩니다.

범위 한계: 실제 Green에서는 marker보다 manifest의 actual port와 listener PID가 권위 있습니다.

실제 기술 이름documentation-versus-runner port binding reconciliation

8080과 28021을 같은 값으로 읽지 않는다 — 문서 계약과 packaged runner 기본값은 실제 invocation이 연결
그림 한눈에: 문서 계약과 packaged runner 기본값은 실제 invocation이 연결.

18. D3 teardown은 정상 path와 부분 실패에서 무엇을 보장하나요?

답: 어떤 path에서도 process 정리와 compose down -v를 시도하고 마지막에 container·volume·process absent를 요구합니다.

근거: manifest 핵심은 teardown=1, container_absent=true, volume_absent=true, process_absent=true입니다. ForceFailureAfterCompose는 partial-startup cleanup을 연습하게 합니다.

오답 함정: teardown field 하나만 보고 사용자 기존 volume까지 안전하게 다뤘거나 graceful shutdown까지 증명했다고 쓰면 안 됩니다.

범위 한계: 이 cleanup은 지정 Compose project 범위이며 external resource나 운영 비용 정리까지 포괄하지 않습니다.

실제 기술 이름try-finally lifecycle teardown with post-cleanup absence invariants

19. Q33 LAG 예시는 어떤 grain·order·oracle을 사용하나요?

답: transaction 한 행을 grain으로 두고 account별 occurred_at, tx_id 순서에서 직전 amount와 차이를 계산합니다.

근거: 비정본 fixture 결과는 21행, 각 account 첫 previous/difference는 NULL, account101 마지막 600→600 차이는 0입니다. 모든 status 포함은 명시한 가정입니다.

오답 함정: 첫 행 차이를 0으로 강제하거나 occurred_at 동률의 tx_id tie-breaker를 생략하면 계약이 달라집니다.

범위 한계: workbook에 shipped answer query가 없으므로 이 SQL과 oracle은 audit-authored illustrative example입니다.

실제 기술 이름account-partitioned deterministic LAG difference window

Q33 · 바로 전 거래를 옆 칸에 붙인다 — 비정본 예시 · account별 occurred_at, tx_id 순서
그림 한눈에: 비정본 예시 · account별 occurred_at, tx_id 순서.

20. externalized configuration과 profile은 각각 무엇을 분리하나요?

답: 설정값을 코드 밖에서 주입하고, local/test/prod별 허용 설정 묶음을 배포 시스템이 선택하게 합니다.

근거: D4는 공통·local·test·prod matrix를 만들고 DB URL/user/password를 environment placeholder로 옮기며 actuator env·startup log의 노출을 확인합니다.

오답 함정: profile 이름을 client 입력으로 받거나 local default가 운영 secret을 대신하게 두면 안 됩니다.

범위 한계: 설정 source 우선순위와 secret rotation/access control은 실제 배포 환경에서 별도 검증해야 합니다.

실제 기술 이름Spring externalized configuration and deployment-controlled profiles

21. PowerShell 환경 변수 template이 증명하는 secret 범위는 어디까지인가요?

답: $env: 문법과 password를 파일에 쓰지 않는 모양을 보여줄 뿐 실제 secret 비노출 Green은 아닙니다.

근거: 표시된 assignment는 URL과 USERNAME이며 password는 trusted terminal에서 공급한다고 설명합니다. 실제 Green owner는 D3 canonical runner입니다.

오답 함정: 인쇄 설명의 ‘네 개 $env: 행’을 그대로 믿거나 template을 실행 owner로 바꾸면 원문과 source가 충돌합니다.

범위 한계: actuator, log, process environment, shell history, CI secret masking은 별도 검토 대상입니다.

실제 기술 이름PowerShell environment-shape template with secret non-persistence boundary

설정은 밖에서, 비밀은 기록 밖에서 — D4 · externalized config와 secret non-exposure는 별도 검토
그림 한눈에: D4 · externalized config와 secret non-exposure는 별도 검토.

22. D4 config-matrix validator가 의미 Green이 아닌 이유는 무엇인가요?

답: 파일의 최소 내용과 hash는 보지만 각 profile·secret 행의 기술적 타당성은 읽지 않기 때문입니다.

근거: marker는 LOCAL_ARTIFACT_VALIDATED W21D4 bytes=<actual> sha256=<64-hex>이고 사람 검토 전 HUMAN_SEMANTIC_REVIEW_REQUIRED입니다.

오답 함정: placeholder가 없고 3줄 이상이라는 사실을 secret 비노출·fail-fast·profile 안전성 완료로 바꾸면 안 됩니다.

범위 한계: 실행하지 않은 외부 secret store와 production profile 상태는 이 Gate 밖입니다.

실제 기술 이름configuration-artifact integrity gate with semantic-review requirement

23. liveness와 readiness는 어떤 결정을 분리하나요?

답: liveness는 process 재시작 판단, readiness는 새 요청을 받을지 판단합니다.

근거: DB가 멈춰도 JVM 자체가 살아 있으면 liveness는 UP을 유지하고 readiness만 DOWN이 되어 traffic에서 빠져야 합니다.

오답 함정: 두 endpoint가 항상 같은 status여야 한다고 생각하거나 aggregate health 하나만 보고 restart와 traffic을 동시에 결정하면 안 됩니다.

범위 한계: 각 health group에 어떤 indicator를 넣을지는 실제 Spring 설정과 test로 확인해야 합니다.

실제 기술 이름Spring Actuator liveness-readiness decision separation

살아 있음과 요청 받을 준비를 분리한다 — D5 · DB 정상→중단→복구에서 liveness와 readiness 전이
그림 한눈에: D5 · DB 정상→중단→복구에서 liveness와 readiness 전이.

24. D5 DB 정상·중단·복구 matrix의 기대 전이는 무엇인가요?

답: 정상은 live/ready UP, DB 중단은 live UP·ready DOWN, 복구 뒤 ready UP입니다.

근거: 이 전이를 시각·HTTP status·dependency 상태와 함께 health-matrix.csv에 남기고 migration 중 traffic 허용 순서도 설명합니다.

오답 함정: DB를 liveness group에 넣어 outage 때 restart loop를 만들거나 recovery 전 traffic을 먼저 열면 안 됩니다.

범위 한계: health detail에 URL·username 같은 설정이 노출되지 않는지도 별도 확인해야 합니다.

실제 기술 이름dependency-outage readiness transition matrix

25. health worksheet가 하지 않는 일은 무엇인가요?

답: healthy 시점의 liveness·readiness·aggregate를 읽을 뿐 DB 중단·복구를 실행하거나 canonical CSV를 만들지 않습니다.

근거: worksheet는 세 endpoint가 모두 UP인지 guard하고 UTC checked_at JSON을 출력합니다. active lifecycle owner는 D3입니다.

오답 함정: 세 curl 결과 한 번을 정상→장애→복구 matrix로 읽거나 worksheet를 D3 producer로 부르면 안 됩니다.

범위 한계: D5 semantic Green에는 장애 주입과 상태 전이의 직접 관찰이 더 필요합니다.

실제 기술 이름read-only Actuator health worksheet versus transition test

26. Q34 ROW_NUMBER 예시는 어떤 partition·order·oracle을 사용하나요?

답: customer별로 occurred_at DESC, tx_id DESC 순번을 매기고 recent_no<=3만 남깁니다.

근거: 비정본 fixture 결과는 8행이며 customer1=3, customer2=3, customer3=1, customer6=1입니다. 거래 없는 customer4·5는 제외한다는 가정을 공개합니다.

오답 함정: 동시각 tx212·tx211의 tx_id DESC를 빼거나 모든 고객이 반드시 3행이라고 설명하면 안 됩니다.

범위 한계: 모든 account/status 포함과 no-transaction customer 제외는 shipped business rule이 아니라 학습 선택입니다.

실제 기술 이름customer-partitioned deterministic top-three ROW_NUMBER

Q34 · 고객마다 최신 세 건만 남긴다 — 비정본 예시 · customer별 최신순 ROW_NUMBER
그림 한눈에: 비정본 예시 · customer별 최신순 ROW_NUMBER.

27. D6가 D3 manifest를 읽을 때 producer와 consumer를 왜 구분하나요?

답: D3만 lifecycle을 실행·manifest를 만들고 D6은 같은 evidence의 teardown 필드를 읽는 read-only consumer이기 때문입니다.

근거: D6 예상 결과는 exact D3 evidence; no new lifecycle claim이며 teardown=1, container_absent=true, volume_absent=true를 확인합니다.

오답 함정: D6 페이지에 runner 전문이 다시 실렸다는 이유로 새 lifecycle·stdout·resource-limit 검증을 실행했다고 쓰면 안 됩니다.

범위 한계: 같은 manifest hash는 같은 bytes를 뜻할 뿐 새로운 시간의 실행을 증명하지 않습니다.

실제 기술 이름producer-consumer evidence ownership with read-only teardown review

한 번 만든 퇴장표를 다시 읽는다 — D3 producer → D6 read-only consumer · 새 실행 주장 금지
그림 한눈에: D3 producer → D6 read-only consumer · 새 실행 주장 금지.

28. modern 코드 인벤토리와 마지막 proof 표찰은 어떻게 읽나요?

답: 10개 teaching unit은 canonical runner 2개와 illustrative 8개이며 source-local test는 0개입니다.

근거: aggregate vector 10/223/217/0/217/217/34/0는 teaching units / physical lines / nonblank lines / setup lines / mapping rows / translation rows / source chunks / source-local tests입니다. Q33·Q34를 포함한 illustrative item은 정본 답안이 아닙니다.

오답 함정: learner-owned Dockerfile·compose와 template을 canonical answer로 세거나 2개 runner source를 이번 preview가 실행한 2회로 세면 안 됩니다.

범위 한계: 현재는 W21 D1–D6 RUNTIME NOT_RUN·runtimeRunsByPreview=0입니다. p715 D7, p719–720 주간 통합, p720 W22는 이 미리보기 밖입니다.

실제 기술 이름canonical-illustrative provenance and non-executed proof-boundary accounting