18주차 미리보기
W18 미리보기 · 웹소설 본편

STARRY PASS 14 — 공연 전날의 다섯 장 복구 카드

새것을 늘리지 않고 핵심을 빈 종이에서 꺼내기

범위D1–D6 · 월–토p580 W18 제목 아래 + p581–601 + p602 상단 D6 최종 Gate
정본 상태SOURCE AUDIT PASSPDF·source·workbook byte 폐쇄
실행 상태W18 D1–D6 LABS NOT_RUNtestsExecutedByAudit=0

이 이야기는 p580 W18 제목 아래 + p581–601 + p602 상단 D6 최종 Gate만 다룹니다. p580 상단의 W17 잔여 문장, p602 하단 D7 시작점, p606 주간 통합·요일별 해설, p607 official reference와 그 이후는 제외합니다. 공통 코어 · 트랙 선택 시 증권 기본이며 증권 전용 기능 주차는 아닙니다. source audit은 원문과 source의 정적 폐쇄를 확인했지만 실행하지 않았으므로 현재 상태는 W18 D1–D6 LABS NOT_RUN, testsExecutedByAudit=0입니다.

공연을 엿새 앞둔 월요일, STARRY의 예약 단말기가 갑자기 모든 메뉴를 지웠다. 화면에는 새 기능을 설치하라는 말 대신 “이미 배운 길을 빈 종이에서 다시 찾을 것”이라는 문장만 남았다. 마지막 날의 공식 시험까지 무사히 가려면 여섯 문을 차례로 지나야 했고, 넷째 문 안에는 다섯 장의 SQL 복구 카드가 들어 있었다.

키타는 새 문제집 세 권을 안고 달려왔다. 히토리는 책 높이를 보고 기타 가방 뒤로 반쯤 숨었다. 료는 맨 위 책을 집었다가 가격표를 보고 조용히 내려놓았다. 니지카는 태블릿을 켜고 네 사람 앞에 빈 종이 한 장씩만 놓았다.

“이번 주의 규칙은 늘리는 게 아니라 되찾는 거야.” 니지카가 말했다. “확신하며 틀린 것, 작은 표 없이 외운 것, 시간 안에 놓치던 것만 꺼내자.”

니지카가 태블릿으로 시험 전 복구 카드와 시간표를 확인하는 공식 장면
그림 한눈에: 공식 장면컷은 태블릿으로 회수 순서를 점검하는 분위기용이며, 학습 사건·SQL·수치는 원문 감사에 따른 비공식 구성입니다.

첫 문에는 W15부터 W17까지 남은 오답표가 걸려 있었다. 단순히 틀린 문제보다 높은 확신으로 틀린 high-wrong이 위로 떠올랐다. 맞다고 굳게 믿었던 설명일수록 같은 실수를 다시 만들 가능성이 컸기 때문이다. 니지카는 점수 영향이 큰 열 장만 남기고 나머지 종이를 서랍에 넣었다.

high-wrong 열 문제를 최소 반례와 변형 문제로 압축해 resolved 여덟 개 이상을 만드는 깔때기 도식
그림 한눈에: 흩어진 오답 가운데 high-wrong 10개만 깔때기 아래로 모으고, 각 항목을 최소 반례 한 개와 연결합니다.

빈 종이의 왼쪽에는 entity와 candidate key, 가운데에는 cardinality와 정규형, 오른쪽에는 프로젝트 table 예시를 썼다. NULL = NULL이 참이라고 믿었던 카드에는 UNKNOWN이 되는 한 행 반례를, detail 두 묶음을 바로 JOIN해도 행 수가 그대로라고 믿었던 카드에는 2×3으로 여섯 행이 되는 작은 표를 붙였다. 한 문제마다 틀린 믿음과 그 믿음을 깨는 최소 반례가 하나씩 생겼다.

키타가 “열 장을 다 맞혀야 다음 문이 열리나요?”라고 묻자 니지카는 고개를 저었다. 원문의 Gate는 원오답 열 개 중 resolved=true가 8개 이상인지를 보고, 아직 풀리지 않은 것은 다음날 목록에 최대 5개만 남긴다. 불안하다고 새 문제 40개를 여는 행동은 복구 범위를 늘리는 실패였다.

화면에는 LOCAL_ARTIFACT_VALIDATED W18D1 bytes=<actual> sha256=<64-hex actual hash>가 예상 형식으로 적혀 있었다. 그러나 그 문자열은 high-wrong.csv의 존재·최소 크기·placeholder 부재·hash를 확인하는 좁은 표지일 뿐, 열 개 반례가 의미상 옳다는 판정은 아니었다. 파일조차 지금 실행해 검사하지 않았으므로 네 사람은 초록 도장을 찍지 않았다.

화요일의 둘째 문은 열두 개의 함정 발판이었다. 첫 네 칸에는 NULL 비교, NULL이 든 NOT IN, COUNT(*)COUNT(column), LEFT JOIN 뒤 우측 조건을 WHERE에 둬 unmatched 행을 지우는 함정이 놓였다. 다음 세 칸은 window의 기본 frame, 동률 순위, pagination tie였다. 마지막 다섯 칸은 DML rollback, commit, SAVEPOINT, CHECK, FK constraint였다.

NULL 네 개, window 세 개, transaction 다섯 개로 나눈 SQL 함정 열두 개 도식
그림 한눈에: SQL 함정 12개를 NULL·JOIN 4칸, window·순서 3칸, transaction·constraint 5칸으로 나눠 봅니다.

히토리가 문장을 외워 발판을 뛰려 하자 료가 2~3행짜리 카드를 발밑에 밀어 넣었다. NOT IN (1, NULL)은 원하는 값이 아니라고 곧장 TRUE가 되지 않았고, LEFT JOIN으로 남겨 둔 빈 우편함도 WHERE right.status='OK'를 통과하지 못하면 사라졌다. COUNT(column)은 NULL을 세지 않지만 COUNT(*)는 행을 셌다.

동률 timestamp 두 건에는 ID를 두 번째 정렬 기준으로 붙였다. 순서가 완성되지 않으면 window 중간값과 다음 페이지 경계는 반복 실행마다 흔들릴 수 있었다. PostgreSQL transaction에서 constraint 오류가 난 뒤에는 오류 메시지만 무시한다고 정상으로 돌아오지 않았다. 준비한 SAVEPOINT로 되돌리거나 transaction 전체를 ROLLBACK해야 했다.

“정답 문장 한 줄이면 빨리 끝나는데요.” 키타가 말했다.

“빨리 외운 문장은 빨리 뒤집혀.” 료가 답했다. “열두 칸마다 입력 2~3행, 예상 truth value나 결과 행, 실제와 다른 이유가 있어야 해.”

D2의 LOCAL_ARTIFACT_VALIDATED도 파일 bytes와 hash를 대신 계산할 뿐, SQL parser도 아니고 열두 반례의 사람 검토도 아니었다. 그래서 HUMAN_SEMANTIC_REVIEW_REQUIRED 표찰은 문 옆에 그대로 남았다.

수요일에는 객석 시계를 실제 시험처럼 맞췄다. 이번에는 줄인 세트가 아니었다. 단말기에 question_count=50, full_exam=true, timer_target_min=90 세 값이 모두 켜져야 했다. 45분짜리 연습이나 문항 수가 비어 있는 기록을 full mock이라고 부를 수 없었다.

네 사람이 SQL 함정과 다섯 project SQL 결과를 토론하는 공식 장면
그림 한눈에: 공식 장면컷은 1차·2차 풀이와 표시 전략을 상의하는 분위기용이며, 실제 시험 문항이나 성적을 보여 주지 않습니다.
50문항 90분 응시와 별도 채점 30분, 오답 최대 다섯 개 복구를 분리한 시계 도식
그림 한눈에: 50문항을 푸는 90분과 타이머 종료 뒤의 채점·복구 30분을 서로 다른 시계로 분리합니다.

확실한 문제를 먼저 확보하고, 3분 넘게 막힌 문제에는 표시를 남겨 두 번째 pass로 넘겼다. first_pass_min, second_pass_min, elapsed_min을 실제 값으로 기록하고 마지막 10분 review 규칙도 미리 정했다. 답을 바꾼 문항은 첫 답을 지우지 않아 판단 경로를 나중에 확인할 수 있게 했다.

90분 타이머가 울린 뒤에야 별도의 30분 채점이 시작됐다. correct·wrong·blank의 합은 각 section 문항 수와 같아야 했고 total은 정확히 50이어야 했다. 복구 목록은 오답 전부가 아니라 최대 5개였다. 점수가 불안하다고 새 교재를 여는 대신 가장 큰 오해 다섯 개만 다음 카드로 옮겼다.

같은 날의 Q27 문에는 여섯 고객의 첫 거래일과 마지막 거래일을 구하는 문제가 있었다. 키타는 transaction에서 시작하려 했지만, 니지카는 거래가 없는 고객도 결과에 남길 정책이라면 customer에서 시작해 LEFT JOIN해야 한다고 말했다. 각 고객 한 행에서 MIN(business_date)MAX(business_date)를 계산하고, 거래가 없는 고객의 두 날짜는 NULL로 남겼다.

고객별 MIN MAX 날짜선과 무거래 고객의 NULL NULL 정책을 보여 주는 Q27 도식
그림 한눈에: 거래가 있는 고객의 첫날·마지막날과 거래가 없는 고객의 NULL·NULL 정책을 한 날짜선에서 비교합니다.

이 Q27 SQL은 prompt가 status나 tx_type의 포함 범위를 전부 고정하지 않았기 때문에 “모든 행 포함”이라는 가정을 주석으로 공개한 학습용 예시다. W18-SQL-Q27.sql은 shipped 정본 답안이 아니며, 실제 workbook schema와 정책에 맞춰 검토해야 했다.

목요일, 넷째 문이 열리자 제목의 다섯 복구 카드가 나타났다. 자료는 account 세 행과 ledger 세 행뿐이었다. account는 (1,70), (2,0), (3,5)였고, ledger는 1번 account에 +100-30, 3번 account에 +5가 있었다. 2번 account에는 ledger가 없었다. 시각과 ID는 1번의 +100이 먼저, -30이 다음이 되도록 고정돼 있었다.

세 account 잔액과 세 ledger 행을 account id로 연결한 고정 fixture 지도
그림 한눈에: account 1·2·3과 ledger +100·-30·+5의 연결, 그리고 ledger가 없는 account 2를 봅니다.

첫 카드는 저장 잔액과 원장 합을 대사했다. 1번은 100-30=70, 2번은 ledger 없음의 합을 0으로 읽어 0=0, 3번은 5=5라 mismatch는 0건이었다. marker는 W18_Q1 rows=0이었다. 둘째 카드는 NOT EXISTS로 ledger 없는 account를 찾아 W18_Q2 rows=1 id=2를 기대했다.

셋째 카드는 account 1의 양수를 credit, 음수의 크기를 debit으로 모아 W18_Q3 rows=1 credits=100 debits=30을 썼다. 넷째 카드는 created_at,id 순서 window sum으로 100에서 70으로 내려가 W18_Q4 rows=2 final=70을 기대했다. 다섯째 카드는 cursor (2026-01-03Z,99)보다 작은 행을 최신순 두 건 골라 W18_Q5 rows=2 ids=2|1을 표시했다.

reconcile, anti join, aggregation, running balance, keyset의 정확한 다섯 결과 카드
그림 한눈에: reconciliation 0건, anti join id 2, credit/debit 100·30, running final 70, keyset 2|1의 다섯 좁은 oracle을 비교합니다.

“다섯 marker가 출력되면 모든 게 증명된 거죠?” 키타가 물었다.

니지카는 runner가 W18_Q1 부터 W18_Q5 까지의 substring과 native exit를 확인하지만, marker 뒤 숫자를 실제 query 결과에서 다시 계산하거나 행 수·순서·유일성을 전부 인증하지는 않는다고 설명했다. SQL 안의 marker는 hardcoded literal이었다. 특히 anti join의 array_agg, running의 x, keyset의 ids가 NULL일 때 IF value <> expected 자체가 UNKNOWN이 되어 fail-open할 수 있는 경계도 남았다.

runner의 최종 문구는 정확히 W18_PROJECT_SQL5_GREEN files=5 native_exits=0 rows=5 hashes=6 cleanup=1이었다. 하지만 지금 화면에 적힌 것은 기대 문자열이지 이 미리보기 감사가 새로 실행한 결과가 아니었다. cleanup=1도 manifest의 literal이며, supplied Container mode의 외부 container까지 제거했다는 뜻이 아니었다.

fixture부터 SQL 다섯 개, marker, hash, manifest, cleanup으로 이어지는 증거 사슬
그림 한눈에: fixture → SQL 5개 → native exit·marker → hash 6개 → manifest의 증거 사슬과 그 사이의 미보장 경계를 봅니다.

canonical teaching unit은 shared Compose 1개, W18 runner 1개, fixture 1개, invariant SQL 5개로 모두 8개였다. 여기에 Q27·Q28 illustrative SQL 2개가 따로 붙어 코드 뒤풀이의 열 장을 이뤘다. “project SQL 5개”는 다섯 query의 수이고 “canonical 8개”는 runtime과 지원 source를 포함한 teaching unit 수라 서로 다른 셈이었다.

금요일의 문에는 커다란 종료 버튼이 있었다. 시험 전날 준비는 장소·시간·신분증·이동·알람을 확인하고, admission and ID, route and arrival buffer, alarm and sleep time, one-page notes only, stop after 60 minutes의 다섯 체크를 채우는 일이었다.

카운터에 모인 네 사람이 공식 응시와 복기 경계를 정리하는 공식 장면
그림 한눈에: 공식 장면컷은 카운터에서 전날 체크리스트를 함께 닫는 분위기용이며, 실제 시험장 운영 화면이 아닙니다.
시험 전날 점검과 기존 오답 복습만 하고 60분에 멈추는 stop rule 도식
그림 한눈에: 틀린 항목만 30분 회수하고 다섯 준비를 확인한 뒤 총 60분에서 닫는 stop rule을 봅니다.

복습 대상은 D1부터 D4까지 아직 unresolved인 항목 최대 5개뿐이었다. 완료 기록은 actual_minutes<=60, 새 문제 0, 새 project 작업 0이어야 했다. 료가 밤늦게 project SQL을 한 번 더 돌리자고 하자 니지카는 project 작업은 전날 이미 종료됐으며 수면이 우선이라고 선을 그었다.

Q28은 actor별로 연속 실패가 3회 이상인 후보를 찾는 문제였다. 학습용 예시는 occurred_at,tx_id로 안정 순서를 만들고, FAILED가 아닌 행의 누적 개수를 reset group으로 삼아 실패 island를 묶었다. 고정 fixture의 후보는 USER-FAIL, streak 3, 10:00부터 10:02까지였다.

발생 시각과 tx id 안정 순서에서 성공이 끊고 실패 세 번이 island를 이루는 Q28 도식
그림 한눈에: 성공 행이 경계를 만드는 reset group과 그 사이 FAILED 세 행의 하나의 island를 봅니다.

그러나 연속의 순서 기준은 prompt를 보강한 가정이고, +09 출력 문자열은 session TimeZone에 따라 달라질 수 있었다. fixture contract는 실패가 세 건 이상임을 확인할 뿐 연속성을 직접 판정하는 정본 답안이 아니었다. W18-SQL-Q28.sql 역시 shipped 정본 답안이 아닌 illustrative 학습용 예시였다.

토요일에는 마지막 문 앞에 두 개의 시계가 놓였다. 첫 시계는 공식 응시 90분, 둘째 시계는 시험 종료 후 30분 이내에 시작해 정확히 30분만 쓰는 기억 기반 복기였다. 두 블록은 섞거나 하나로 줄이면 안 됐다.

공식 응시 90분과 복기 30분을 분리하고 문항 원문 복제를 막는 보안 경계 도식
그림 한눈에: 공식 응시 90분과 종료 후 복기 30분을 분리하고, 문항 원문은 보안선 밖에 두는 계약을 봅니다.

복기 CSV에는 modeling·normalization·join-cardinality·null-logic·window-function·transaction 같은 영역, 시간 배분, confidence, 바꾼 답, 기억난 조건, 불확실한 이유, 다음 drill만 남겼다. 공식 정답 공개 전 correct를 추측해 쓰지 않았고 문항 원문이나 선택지를 상세히 복원하지 않았다. 이동과 대기시간도 학습 합계에 새로 더하지 않았다.

여기에는 시간 표기의 충돌이 있었다. D6 제목과 수행 절차는 응시 90분 뒤 복기 30분을 분명히 요구하지만, 같은 모듈의 표시 예상시간은 전체 1h 30m로 적혀 복기 30분을 포함하지 않는다. 원문의 일별 표시값만 더한 strict D1–D6 합계는 305–390분, 즉 5시간 05분–6시간 30분이고, 개요의 310–400분은 D7 5–10분까지 포함한 값이다. 하지만 두 합계 모두 D6의 필수 복기 30분을 담지 못한다. 그래서 네 사람은 원문 표기 합계를 고쳐 쓴 척하지 않고, 실제 계획에서는 필수 블록을 D3 90+30, D6 90+30으로 각각 분리했다. 모든 필수 블록을 단순 합산한 335–420분은 충돌을 드러내기 위한 파생 계획값이지 원문의 인쇄 합계가 아니다.

D6의 최종 Gate는 p602 상단까지 이어졌다. exam-retro.csv 존재, 90분과 30분 분리, 문항 원문 미복제, 이동·대기시간 미가산을 확인한 바로 뒤에서 D7 제목이 시작됐다. 니지카는 그 아래 결과 분기 문을 닫았다. p606 통합 해설과 p607 official reference도 오늘 미리보기에는 들이지 않았다.

예약 단말기의 여섯 불이 모두 켜졌지만 니지카는 실행 Green 스티커 대신 경계표를 붙였다. LOCAL_ARTIFACT_VALIDATED는 파일의 좁은 구조와 hash를 확인하는 marker이고, HUMAN_SEMANTIC_REVIEW_REQUIRED는 반례·grain·업무 가정과 실제 결과를 사람이 봐야 한다는 뜻이었다. source audit PASS와 current runtime Green은 같지 않았다.

“그러면 오늘 얻은 건 초록불이 아닌가요?” 히토리가 물었다.

“정확히 말할 수 있는 경계가 생겼지.” 니지카가 답했다. “무엇을 다시 실행해야 하는지, 무엇이 예시이고 무엇이 정본인지, 어느 페이지에서 멈춰야 하는지.”

료는 다섯 복구 카드를 뒤집어 순서 없이 놓았다. 히토리는 작은 fixture부터 다시 그려 reconciliation 0건, ledger 없는 2번, 100과 30, 누적 70, 2와 1을 차례로 꺼냈다. 키타는 full mock 시계와 전날 종료 버튼을 함께 챙겼다. 새것은 하나도 늘지 않았지만 손에 남은 길은 전보다 또렷했다.

이미지 출처와 이용 안내: 공식 장면컷은 TV 애니메이션 《봇치 더 록!》 공식 사이트 자료입니다. ©はまじあき/芳文社・アニプレックス. 이 문서는 개인 학습용 비공식 구성으로, 원작의 공식 설정과 별개의 학습 비유입니다. 개념도는 원문 감사 내용에 맞춰 새로 만든 교육용 SVG입니다.

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

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

본편의 쉬운 비유를 W18 SQLD 마무리·PostgreSQL 기술 이름과 증거 경계로 다시 연결합니다. 답은 p580 W18 제목 아래 + p581–601 + p602 상단 D6 최종 Gate에만 한정하며, W18 D1–D6 LABS NOT_RUNtestsExecutedByAudit=0을 현재 실행 Green으로 바꾸어 말하지 않습니다.

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

포함 범위는 p580의 W18 제목 아래부터 p581–601 전체, p602 상단의 D6 최종 Gate까지입니다. p580 상단 W17 잔여 문장과 p602 하단 D7 시작점은 포함하지 않습니다.

p606 주간 통합·요일별 해설과 p607 official reference 및 그 이후도 제외합니다. 한 페이지에 두 범위가 섞였을 때는 페이지 번호가 아니라 실제 heading 경계로 자릅니다.

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

2. W18 D1–D6은 어떤 순서로 이어지나요?

D1 high-wrong·모델링 압축, D2 SQL 함정 12개, D3 50문항 90분 full mock과 Q27, D4 project SQL 5개, D5 60분 stop rule과 Q28, D6 공식 응시 90분과 복기 30분 순서입니다.

공통 코어 · 트랙 선택 시 증권 기본입니다. 계좌·원장 예시를 쓰지만 증권 주문·체결 전용 기능을 구현하는 주차는 아닙니다.

실제 기술 이름six-stage SQLD closeout sequence with project-SQL retrieval

3. source audit PASS와 현재 실행 Green은 왜 다른가요?

source audit PASS는 PDF 경계와 source bytes, canonical·illustrative 분류가 서로 맞는지 정적으로 확인한 상태입니다. W18 runner나 D1–D6 learner artifact를 이번 감사에서 실행했다는 뜻은 아닙니다.

따라서 현재 상태는 W18 D1–D6 LABS NOT_RUN이고 testsExecutedByAudit=0입니다. 문서에 예상 marker가 있거나 예전 evidence 파일이 존재하는 것만으로 최신 Green을 주장하지 않습니다.

실제 기술 이름byte-verified source closure versus unexecuted runtime evidence

4. D1에서 high-wrong을 먼저 고르는 이유는 무엇인가요?

high-wrong은 높은 확신으로 골랐지만 틀린 항목입니다. 단순 실수보다 잘못된 개념 모델이 굳어 있을 가능성이 커서 W15–W17 기록에서 점수 영향이 큰 10개를 우선 고릅니다.

각 항목에는 wrong belief와 그것을 깨는 최소 반례 하나를 붙입니다. 불안하다고 새 문제 40개를 푸는 것은 이번 회수 범위를 넓히는 행동입니다.

실제 기술 이름confidence-calibrated high-error prioritization

high-wrong 열 문제를 최소 반례와 변형 문제로 압축해 resolved 여덟 개 이상을 만드는 깔때기 도식
그림 한눈에: 많은 오답에서 high-wrong 10개를 골라 각각 최소 반례와 연결합니다.

5. D1의 모델링 한 장과 완료 기준은 무엇인가요?

빈 한 장에 entity, candidate key, cardinality, normalization을 쓰고 각 항목을 실제 프로젝트 table 예시와 연결합니다. 정의만 외우지 않고 idempotency 복합 key의 최소성이나 balance 비정규화 통제를 설명해야 합니다.

원오답 10개 중 resolved=true가 8개 이상이어야 하며, 미해결 항목은 다음 회수 목록에 최대 5개만 남깁니다. LOCAL_ARTIFACT_VALIDATED W18D1 bytes=<actual> sha256=<64-hex actual hash>는 파일 구조 검증이지 이 설명의 의미 정답 판정이 아닙니다.

실제 기술 이름retrieval-based modeling compression with bounded unresolved queue

6. D2의 SQL 함정 12개는 어떻게 묶이나요?

첫 4개는 NULL 비교·NOT IN·COUNT·LEFT JOIN 우측 WHERE, 다음 3개는 window frame·동률 rank·pagination tie, 마지막 5개는 DML rollback·commit·SAVEPOINT·CHECK·FK constraint입니다.

각 함정마다 입력 table 2~3행, 실행할 식이나 SQL, 예상 truth value 또는 결과 행, 이유 한 문장을 씁니다. 암기 문장만 적어서는 12개를 통과한 것이 아닙니다.

실제 기술 이름twelve-case SQL counterexample matrix

NULL 네 개, window 세 개, transaction 다섯 개로 나눈 SQL 함정 열두 개 도식
그림 한눈에: 12개 함정을 4+3+5 묶음으로 나누고 각 칸에 작은 fixture를 둡니다.

7. NULL·NOT IN·COUNT·LEFT JOIN의 대표 반례는 무엇인가요?

NULL = NULL은 TRUE가 아니라 UNKNOWN입니다. NOT IN의 비교 집합에 NULL이 있으면 원하는 행이 TRUE로 결정되지 않을 수 있고, COUNT(column)은 NULL을 세지 않지만 COUNT(*)는 행을 셉니다.

LEFT JOIN으로 남긴 unmatched 행도 우측 table 조건을 WHERE에 두면 제거될 수 있습니다. 보존이 목적이면 조건 위치와 NULL 정책을 작은 표에서 직접 계산해야 합니다.

실제 기술 이름SQL three-valued logic and outer-join null-preservation semantics

8. window와 pagination에서 unique tie-breaker가 필요한 이유는 무엇인가요?

같은 timestamp나 같은 점수만 ORDER BY에 쓰면 행 사이의 total order가 완성되지 않습니다. window frame의 중간 결과, 동률 행 번호, 다음 페이지 경계가 반복 실행에서 흔들릴 수 있습니다.

created_at, id처럼 stable하고 unique한 두 번째 key를 같은 방향으로 붙입니다. 마지막 화면의 ORDER BY는 이미 계산된 window 순서를 소급해 고치지 않습니다.

실제 기술 이름deterministic total ordering for windows and pagination

9. PostgreSQL transaction 오류와 SAVEPOINT 함정은 무엇인가요?

CHECK나 FK constraint 오류가 난 transaction은 aborted state가 되어 후속 statement를 거부할 수 있습니다. 오류 메시지만 무시하고 다음 SQL을 보내는 것은 복구가 아닙니다.

미리 만든 SAVEPOINT가 있으면 ROLLBACK TO SAVEPOINT로 실패 구간을 걷어낸 뒤 계속할 수 있고, 그렇지 않으면 전체 ROLLBACK이 필요합니다. 부분 rollback 뒤에도 outer transaction은 COMMIT이나 ROLLBACK으로 끝내야 합니다.

실제 기술 이름PostgreSQL aborted-transaction recovery with savepoints

10. D3 full mock의 exact 계약은 무엇인가요?

세 필드는 question_count=50, full_exam=true, timer_target_min=90입니다. 50문항을 90분 동안 풀고 first_pass_min, second_pass_min, elapsed_min을 실제 값으로 남깁니다.

45분 연습이나 문항 수를 기록하지 않은 세트를 full mock으로 올려 부르면 안 됩니다. 풀이 90분과 타이머 종료 뒤 채점·복구 30분은 서로 다른 블록입니다.

실제 기술 이름sealed full-mock contract with exact count and timer

50문항 90분 응시와 별도 채점 30분, 오답 최대 다섯 개 복구를 분리한 시계 도식
그림 한눈에: full_exam=true인 50문항·90분과 종료 뒤 별도 30분 채점을 구분합니다.

11. marking strategy와 cutoff buffer는 어떻게 사용하나요?

확실한 문제를 먼저 확보하고 한 문제에 약 3분 넘게 막히면 표시한 뒤 두 번째 pass로 넘깁니다. 마지막 10분 review 규칙도 시작 전에 정해 시간 배분을 즉흥적으로 바꾸지 않습니다.

cutoff buffer는 목표 점수를 합격선에 딱 붙이지 않고 여유를 두는 방식입니다. 다만 실제 시험 결과를 예측하는 보증이나 문제를 무한히 더 풀라는 뜻은 아닙니다.

실제 기술 이름two-pass marking strategy with a bounded cutoff buffer

12. full mock 채점 기록에서 무엇을 보존해야 하나요?

section별 correct+wrong+blank=items이고 total은 50이어야 합니다. 답을 바꾼 문항은 first answer와 confidence를 보존해 처음 판단과 수정 이유를 나중에 비교합니다.

90분이 끝난 뒤 별도 30분 동안만 채점하고, 복구 queue에는 오답 최대 5개만 넣습니다. 점수 때문에 새 교재를 여는 것은 직전 범위를 확장하는 행동입니다.

실제 기술 이름conservation-checked mock scoring with bounded error recovery

13. Q27의 첫 거래일·마지막 거래일 예시는 어떤 가정을 두나요?

거래가 없는 고객도 결과에 남기는 정책이라 customer에서 시작해 account와 transaction을 LEFT JOIN합니다. customer 한 행마다 MIN(business_date)MAX(business_date)를 계산하고 거래가 없으면 NULL·NULL로 남깁니다.

prompt는 status·tx_type 포함 범위를 완전히 고정하지 않아 예시는 모든 행 포함 가정을 주석으로 공개합니다. W18-SQL-Q27.sql은 학습용 예시이고 shipped 정본 답안이 아닙니다.

실제 기술 이름customer-grain MIN/MAX with zero-transaction preservation

고객별 MIN MAX 날짜선과 무거래 고객의 NULL NULL 정책을 보여 주는 Q27 도식
그림 한눈에: 첫날·마지막날이 있는 고객과 거래가 없어 두 날짜가 NULL인 고객을 비교합니다.

14. D4의 deterministic fixture는 어떤 여섯 행인가요?

account는 (1,70), (2,0), (3,5) 세 행입니다. ledger는 (1,1,+100,2026-01-01Z), (2,1,-30,2026-01-02Z), (3,3,+5,2026-01-01Z) 세 행입니다.

account 2에는 ledger가 없습니다. 이 작은 자료가 reconciliation·anti join·aggregation·running balance·keyset의 공통 출발점이며 production 전체 분포를 대표하지는 않습니다.

실제 기술 이름deterministic three-account three-ledger fixture

세 account 잔액과 세 ledger 행을 account id로 연결한 고정 fixture 지도
그림 한눈에: 세 account와 세 ledger의 연결, ledger가 없는 account 2를 봅니다.

15. reconciliation SQL의 결과와 증명 경계는 무엇인가요?

account 1은 100-30=70, account 2는 ledger가 없어 합을 0으로 읽어 0=0, account 3은 5=5이므로 mismatch count는 0입니다. marker는 W18_Q1 rows=0입니다.

account table 자체가 0행이어도 mismatch 0으로 vacuous pass할 수 있고, 합계 일치만으로 double-entry 완전성까지 증명하지 않습니다. marker도 실제 row를 출력한 값이 아니라 hardcoded literal입니다.

실제 기술 이름balance-to-ledger reconciliation with a vacuous-pass boundary

16. anti join SQL은 왜 account 2 한 행을 기대하나요?

account에서 시작해 같은 account_id의 ledger가 존재하지 않는지를 NOT EXISTS로 묻습니다. 현재 fixture에서는 2번만 ledger가 없어 W18_Q2 rows=1 id=2가 기대값입니다.

array_agg 결과가 NULL일 때 IF ids <> expected도 UNKNOWN이 되어 예외가 나지 않을 수 있는 fail-open 경계가 있습니다. marker의 rows=1도 실제 array 길이에서 계산하지 않습니다.

실제 기술 이름NOT EXISTS anti join with NULL-sensitive oracle checking

17. conditional aggregation은 100과 30을 어떻게 만드나요?

account 1의 두 ledger를 세고, 양수만 합쳐 credits 100, 음수만 합친 뒤 부호를 뒤집어 debits 30으로 표시합니다. exact marker는 W18_Q3 rows=1 credits=100 debits=30입니다.

debit 30은 돈이 나간 크기를 양수로 보여 주는 표시 정책입니다. query는 account_id=1의 고정 fixture oracle이고 marker 자체가 계산 열을 동적으로 출력하지는 않습니다.

실제 기술 이름FILTER-based signed-amount conditional aggregation

18. running balance의 순서와 fail-open 경계는 무엇인가요?

PARTITION BY account_id ORDER BY created_at,id로 +100 다음 -30을 누적하면 두 행은 100, 70이 됩니다. exact marker는 W18_Q4 rows=2 final=70입니다.

내부 window 순서는 시간·ID인데 최종값 선택은 id DESC라 ID와 시간 순서가 어긋나는 변형에서는 잘못된 행을 고를 수 있습니다. 결과 x가 NULL이면 IF x<>70도 UNKNOWN이 되어 fail-open할 수 있습니다.

실제 기술 이름ordered running-sum window with final-row selection risk

19. keyset 결과와 다섯 SQL oracle은 어떻게 연결되나요?

account 1에서 cursor (2026-01-03Z,99)보다 작은 (created_at,id)를 최신순으로 두 건 고르면 ID는 2, 1입니다. exact marker는 W18_Q5 rows=2 ids=2|1이며 tuple 비교 방향과 ORDER BY 방향을 함께 유지해야 합니다.

다섯 oracle은 Q1 mismatch 0, Q2 id 2, Q3 credits/debits 100·30, Q4 final 70, Q5 ids 2|1입니다. 각각 fixture-bound 결과이며 합쳐도 production schema 전체를 증명하지 않습니다.

실제 기술 이름descending composite-cursor keyset retrieval with five fixture oracles

reconcile, anti join, aggregation, running balance, keyset의 정확한 다섯 결과 카드
그림 한눈에: W18_Q1부터 W18_Q5까지의 기대값과 각 결과의 좁은 범위를 비교합니다.

20. runner의 Green marker는 정확히 무엇을 보장하나요?

최종 문자열은 W18_PROJECT_SQL5_GREEN files=5 native_exits=0 rows=5 hashes=6 cleanup=1입니다. runner는 fixture 뒤 다섯 SQL을 순서대로 보내고 native exit, W18_Qn substring, fixture 포함 여섯 hash를 manifest에 기록합니다.

marker 뒤 숫자·행 순서·유일성을 전부 다시 계산하지 않고, manifest는 cleanup 전에 기록됩니다. cleanup=1은 literal이라 Container mode의 외부 container 제거를 증명하지 않으며, 지금은 runner를 실행하지도 않았습니다.

실제 기술 이름five-query evidence manifest with literal-marker and lifecycle limits

fixture부터 SQL 다섯 개, marker, hash, manifest, cleanup으로 이어지는 증거 사슬
그림 한눈에: source에서 실행·marker·hash·manifest로 이어지는 사슬과 남은 검증 공백을 봅니다.

21. D5의 60분 stop rule은 무엇을 금지하나요?

기존 한 장 모델링과 SQL 함정에서 아직 틀린 항목만 30분 보고, 준비 체크를 마친 뒤 총 60분에 닫습니다. 새로운 모의, 코드, project 작업을 시작하지 않습니다.

불안해서 밤늦게 project test를 돌리는 행동도 금지됩니다. 전날의 목적은 학습량을 늘리는 것이 아니라 수면과 시험 당일 판단을 보호하는 것입니다.

실제 기술 이름hard-stop exam-eve scope control

시험 전날 점검과 기존 오답 복습만 하고 60분에 멈추는 stop rule 도식
그림 한눈에: 30분 제한 복습과 다섯 준비를 마친 뒤 60분에서 학습을 종료합니다.

22. exam logistics 다섯 체크는 무엇인가요?

체크는 admission and ID, route and arrival buffer, alarm and sleep time, one-page notes only, stop after 60 minutes입니다. 공식 안내에서 장소·시간·준비물·금지 물품을 다시 확인하고 시험 시작 20분 전 도착 계획을 씁니다.

온라인 기억이나 예전 일정 대신 현재 공식 안내가 우선입니다. 체크가 끝났다고 시험 성적이나 SQL 실력이 자동으로 검증되는 것은 아닙니다.

실제 기술 이름five-item exam logistics readiness checklist

23. D5 재회수 queue와 완료 Gate의 상한은 무엇인가요?

snapshot에는 정확히 W18 D1–D4에서 unresolved인 항목을 최대 5개만 둡니다. 각 항목에는 source_ref, 자기 말 prompt, 작은 fixture, 필요한 답 형식, constraints, public case를 남기고 정답은 닫습니다.

완료 기준은 logistics 다섯 체크, actual_minutes<=60, 새 문제 0, 새 project 작업 0입니다. 파일이 존재하거나 process exit가 0인 것만으로 장기 Green이 되지는 않습니다.

실제 기술 이름bounded unresolved retrieval queue with zero-new-work gate

24. Q28의 연속 실패 island 예시는 어떻게 작동하나요?

actor별 occurred_at,tx_id 안정 순서에서 FAILED가 아닌 행의 누적 개수를 reset group으로 삼고, 같은 group의 FAILED만 모아 3개 이상인 island를 남깁니다. 예시 후보는 USER-FAIL, streak 3, 10:00–10:02입니다.

연속의 순서 기준은 prompt 보강 가정이고 +09 stdout은 session TimeZone에 따라 달라질 수 있습니다. W18-SQL-Q28.sql은 학습용 예시이며 shipped 정본 답안이 아니고, 후보가 곧 장애 원인이나 사기 판정인 것도 아닙니다.

실제 기술 이름stable-order gaps-and-islands failure-streak detection

발생 시각과 tx id 안정 순서에서 성공이 끊고 실패 세 번이 island를 이루는 Q28 도식
그림 한눈에: non-FAILED가 새 경계를 만들고 FAILED 세 행이 하나의 후보 island가 됩니다.

25. D6의 공식 응시와 복기는 어떻게 분리하나요?

공식 응시 블록은 90분으로 기록합니다. 시험 종료 후 30분 이내에 기억 기반 복기를 시작하고, 복기 자체는 30분만 사용합니다.

두 시간은 하나로 합치거나 복기를 응시 90분 안에 넣어 기록하지 않습니다. 이동·대기시간도 학습 합계에 새로 더하지 않습니다.

실제 기술 이름separated 90-minute exam and 30-minute post-exam recall blocks

공식 응시 90분과 복기 30분을 분리하고 문항 원문 복제를 막는 보안 경계 도식
그림 한눈에: 응시 90분, 시작 유예 30분 이내, 복기 30분과 보안 경계를 나눕니다.

26. exam-retro.csv에는 무엇을 남기고 무엇을 남기지 않나요?

시간 배분, modeling·normalization·join-cardinality·null-logic·window·transaction 같은 영역, confidence, 바꾼 답 수, 기억난 조건, 불확실한 이유, 다음 drill을 자기 말로 기록합니다.

문항 원문·선택지·금지된 내용을 상세 복원하지 않고 공식 정답 공개 전 correct를 추측해 쓰지 않습니다. 30분이 지나면 가채점을 계속하지 않고 프로젝트·학교 일정으로 복귀합니다.

실제 기술 이름confidentiality-preserving post-exam metacognitive recall

27. W18 시간 표기의 불일치는 어떻게 안전하게 읽나요?

D3 제목과 절차는 90분 full mock 뒤 별도 채점 30분을 요구하고, D6 제목과 절차도 응시 90분 뒤 복기 30분을 요구합니다. 그런데 D6 표시 예상시간은 전체 1h 30m라 복기 30분을 포함하지 않습니다.

일별 표시값만 더한 strict D1–D6 합계는 305–390분, 즉 5시간 05분–6시간 30분입니다. 개요의 310–400분은 D7 5–10분까지 포함하지만 D6 필수 복기 30분은 담지 못합니다. 따라서 원문 합계는 그대로 출처 표기로 보존하고 D3 90+30, D6 90+30을 각각 분리합니다. 모든 필수 블록을 단순 합산한 335–420분은 파생 계획값이며 원문의 인쇄 합계가 아닙니다.

실제 기술 이름conflict-preserving schedule interpretation without fabricated totals

28. canonical 8개·illustrative 2개와 두 검토 marker는 어떻게 읽나요?

canonical 8개는 shared Compose 1, W18 runner 1, fixture 1, invariant SQL 5입니다. illustrative 2개는 Q27·Q28 SQL이며 둘 다 학습용 예시이고 shipped 정본 답안이 아닙니다. “project SQL 5개”는 query 수, “canonical 8개”는 지원 source까지 포함한 teaching unit 수입니다.

LOCAL_ARTIFACT_VALIDATED는 파일 존재·최소 내용·placeholder·hash 같은 좁은 구조를 확인합니다. HUMAN_SEMANTIC_REVIEW_REQUIRED는 grain·가정·반례·실제 결과를 사람이 봐야 한다는 뜻이며, 코드 문서가 W18 전체를 다뤄도 이 미리보기는 p602 상단 D6 최종 Gate에서 멈춥니다.

실제 기술 이름canonical-versus-illustrative provenance with structural and semantic review separation