止まる場所をコードに埋め込む
한국어 원문으로 표시합니다.
목표
운영 데이터를 바꾸기 전에 멈출 자리를 정하고, 그 기준을 코드가 실제로 집행하게 만듭니다. 기준이 걸렸을 때 절반 상태가 남지 않는 것까지 확인합니다.
요청서
EAST 지역의 PENDING 주문을 CANCELLED 로 바꿔 주세요. 약 120건입니다.
환경
/root/change 아래에서 작업합니다. 현장은 직접 만듭니다 — 준비이지 과제가
아닙니다.
mkdir -p /root/change && cd /root/change
python3 - <<'PY'
import sqlite3, random, datetime
random.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 = 1
for 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 += 1
for 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 += 1
cur.executemany("insert into orders values (?,?,?,?,?)", rows); con.commit(); con.close()
PY
sqlite3 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=EAST
expected=120
limit=0 0 이면 전부, 숫자면 그만큼만
채점 방식
채점기가 매번 현장을 원래대로 되돌린 뒤 여러분의 apply.sh 를 세 가지
요청으로 직접 돌리고, 실행 전후의 DB 를 대조합니다.
region=WEST expected=150 limit=150 통과해야 한다 — 정확히 150건만 바뀐다
세 번째가 중요합니다. 막기만 하고 일이 안 되면 그것도 실패입니다.
단계
- 바꾸기 전에 세어 봅니다. 실제 대상과 요청서 예상을 나란히 적으세요.
abort.md에 중단 기준을 둘 이상 적습니다. 각각 관측할 지표 · 넘으면 안 되는 값 · 그때 할 행동 셋이 다 있어야 합니다.restore.sh— 스냅숏 경로를 받아 되돌립니다. 채점기가 일부러 망가뜨린 뒤 이 스크립트로 복구되는지 확인합니다.apply.sh의 범위 기준 — 실제 대상이 예상의 2배를 넘으면 아무것도 바꾸지 않고 0 이 아닌 코드로 끝냅니다.apply.sh의 불변식 기준 — 어떤 지역의 PENDING 이 20건 미만이 되면 중단하고 이미 적용한 것까지 되돌립니다.- 좁힌 조건에서는 정확히 그만큼만 적용되어야 합니다.
split.md— 되돌릴 수 없는 변경을 되돌릴 수 있는 두 단계로 쪼갭니다.stopped.md— 멈춘 사실 · 이유 · 되돌린 범위 · 다시 시도할 조건.
참고
5단계가 이 실습에서 가장 어려운 자리입니다. 배치마다 확인하되, 걸렸을 때 그 자리에 서면 안 됩니다. 절반만 바뀐 상태는 아무 문서에도 없는 상태라, 멈춘다는 것은 대개 되돌린다는 뜻입니다. 3단계에서 만든 스냅숏이 여기서 쓰입니다 — 되돌릴 수단을 먼저 만들지 않으면 중단 기준이 있어도 실행할 수단이 없습니다.
바꾸기 전에 세어 본다
바꾸기 전에 세어 봅니다. 실제 대상과 요청서 예상을 나란히 적으세요.
요청서는 120건이라고 했습니다. 실제로 몇 건인지 먼저 세고, 둘을 나란히 적으세요. 이 차이를 실행 중에 알게 되면 이미 늦습니다.
멈출 자리를 종이에 적는다
abort.md 에 중단 기준을 둘 이상 적습니다. 각각 관측할 지표 ·
넘으면 안 되는 값 · 그때 할 행동 셋이 다 있어야 합니다.
기준 하나에 세 가지가 다 있어야 합니다 — 관측할 지표, 넘으면 안 되는 값(부등호와 숫자), 그때 할 행동. 셋 중 하나만 빠져도 실행 중에 해석의 여지가 생기고, 해석의 여지는 언제나 계속하는 쪽으로 쓰입니다.
되돌릴 수단을 먼저 만든다
restore.sh — 스냅숏 경로를 받아 되돌립니다. 채점기가 일부러 망가뜨린
뒤 이 스크립트로 복구되는지 확인합니다.
스냅숏 경로를 인자로 받아 되돌립니다. 채점기가 DB 를 일부러 망가뜨린 뒤 이 스크립트로 복구되는지 확인합니다 — 메시지만 내고 실제로 안 되돌리면 떨어집니다.
범위 기준이 실행을 막는다
apply.sh 의 범위 기준 — 실제 대상이 예상의 2배를 넘으면 아무것도
바꾸지 않고 0 이 아닌 코드로 끝냅니다.
실제 대상이 예상의 2배를 넘으면 아무것도 바꾸지 않고 0 이 아닌 코드로 끝냅니다. 채점기가 실행 전후의 DB 를 대조하니, 한 건이라도 바뀌면 떨어집니다.
도중에 걸리면 되돌린다
apply.sh 의 불변식 기준 — 어떤 지역의 PENDING 이 20건 미만이 되면
중단하고 이미 적용한 것까지 되돌립니다.
배치마다 불변식을 확인하고, 걸리면 3단계의 스냅숏으로 되돌립니다. 그 자리에 서면 안 됩니다 — 절반만 바뀐 상태는 아무 문서에도 없는 상태입니다.
좁히면 통과해야 한다
좁힌 조건에서는 정확히 그만큼만 적용되어야 합니다.
막기만 하고 일이 안 되면 그것도 실패입니다. limit 을 지켜 정확히 그만큼만 적용하고, 하한도 넘지 않아야 합니다.
되돌릴 수 없는 것을 쪼갠다
split.md — 되돌릴 수 없는 변경을 되돌릴 수 있는 두 단계로 쪼갭니다.
가장 좋은 중단 기준은 되돌릴 수 없는 변경을 아예 만들지 않는 것입니다. 삭제 대신 삭제 표시를 남기고 유예 기간 뒤에 지우면, 되돌릴 수 없는 한 번이 되돌릴 수 있는 두 번이 됩니다.
멈췄다는 사실도 보고 대상이다
stopped.md — 멈춘 사실 · 이유 · 되돌린 범위 · 다시 시도할 조건.
되돌렸으니 아무 일도 없었다고 넘기면, 고객사는 나중에 로그에서 흔적을 발견하고 숨겼다고 읽습니다. 멈춘 사실·이유·되돌린 범위·다시 시도할 조건 넷이 한 사이클입니다.