되돌릴 수 없는 변경 · 멈출 자리를 미리 정하기 · 실습
멈출 자리를 코드에 박아 두기
목표
운영 데이터를 바꾸기 전에 멈출 자리를 정하고, 그 기준을 코드가 실제로
집행하게 만듭니다. 기준이 걸렸을 때 절반 상태가 남지 않는 것까지 확인합니다.
요청서
> EAST 지역의 PENDING 주문을 CANCELLED 로 바꿔 주세요. 약 120건입니다.
환경
/root/change 아래에서 작업합니다. 현장은 직접 만듭니다 — 준비이지 과제가
아닙니다.
mkdir -p /root/change && cd /root/changepython3 - <<'PY'import sqlite3, random, datetimerandom.seed(23)con = sqlite3.connect('app.db'); cur = con.cursor()cur.execute("create table orders(id integer primary key, status text, region text, amount int, created_at text)")base = datetime.datetime(2026, 8, 1); rows = []; oid = 1for region, n in (('EAST', 480), ('WEST', 210), ('NORTH', 60), ('SOUTH', 35)): for _ in range(n): rows.append((oid, 'PENDING', region, random.randint(1000, 90000), (base + datetime.timedelta(days=random.randint(0, 30))).isoformat())); oid += 1for region in ('EAST', 'WEST', 'NORTH', 'SOUTH'): for _ in range(random.randint(200, 400)): rows.append((oid, random.choice(['PAID', 'SHIPPED']), region, random.randint(1000, 90000), (base + datetime.timedelta(days=random.randint(0, 30))).isoformat())); oid += 1cur.executemany("insert into orders values (?,?,?,?,?)", rows); con.commit(); con.close()PYsqlite3 app.db "select region, count(*) from orders where status='PENDING' group by 1"만들 것
scope.txt 요청서 예상과 실제 대상의 차이abort.md 중단 기준 (지표 · 임계값 · 행동)restore.sh 스냅숏에서 되돌리는 스크립트apply.sh 배치로 적용하되 기준에 걸리면 되돌리는 스크립트split.md 되돌릴 수 없는 변경을 두 단계로 쪼개는 방법stopped.md 멈췄다는 사실을 알리는 보고apply.sh 는 요청 파일 하나를 인자로 받습니다.
region=EASTexpected=120limit=0 0 이면 전부, 숫자면 그만큼만채점 방식
채점기가 매번 현장을 원래대로 되돌린 뒤 여러분의 apply.sh 를 세 가지
요청으로 직접 돌리고, 실행 전후의 DB 를 대조합니다.
region=WEST expected=150 limit=150 통과해야 한다 — 정확히 150건만 바뀐다세 번째가 중요합니다. 막기만 하고 일이 안 되면 그것도 실패입니다.
단계
1. 바꾸기 전에 세어 봅니다. 실제 대상과 요청서 예상을 나란히 적으세요.
2. abort.md 에 중단 기준을 둘 이상 적습니다. 각각 관측할 지표 ·
넘으면 안 되는 값 · 그때 할 행동 셋이 다 있어야 합니다.
3. restore.sh — 스냅숏 경로를 받아 되돌립니다. 채점기가 일부러 망가뜨린
뒤 이 스크립트로 복구되는지 확인합니다.
4. apply.sh 의 범위 기준 — 실제 대상이 예상의 2배를 넘으면 아무것도
바꾸지 않고 0 이 아닌 코드로 끝냅니다.
5. apply.sh 의 불변식 기준 — 어떤 지역의 PENDING 이 20건 미만이 되면
중단하고 이미 적용한 것까지 되돌립니다.
6. 좁힌 조건에서는 정확히 그만큼만 적용되어야 합니다.
7. split.md — 되돌릴 수 없는 변경을 되돌릴 수 있는 두 단계로 쪼갭니다.
8. stopped.md — 멈춘 사실 · 이유 · 되돌린 범위 · 다시 시도할 조건.
참고
5단계가 이 실습에서 가장 어려운 자리입니다. 배치마다 확인하되, 걸렸을 때
그 자리에 서면 안 됩니다. 절반만 바뀐 상태는 아무 문서에도 없는 상태라,
멈춘다는 것은 대개 되돌린다는 뜻입니다. 3단계에서 만든 스냅숏이 여기서
쓰입니다 — 되돌릴 수단을 먼저 만들지 않으면 중단 기준이 있어도 실행할
수단이 없습니다.
단계 8개
- 바꾸기 전에 세어 본다
- 멈출 자리를 종이에 적는다
- 되돌릴 수단을 먼저 만든다
- 범위 기준이 실행을 막는다
- 도중에 걸리면 되돌린다
- 좁히면 통과해야 한다
- 되돌릴 수 없는 것을 쪼갠다
- 멈췄다는 사실도 보고 대상이다