LabHub

되돌릴 수 없는 변경 · 멈출 자리를 미리 정하기 · 실습

멈출 자리를 코드에 박아 두기

LabHub 에서 이어서 보기

목표

운영 데이터를 바꾸기 전에 멈출 자리를 정하고, 그 기준을 코드가 실제로
집행하게 만듭니다. 기준이 걸렸을 때 절반 상태가 남지 않는 것까지 확인합니다.

요청서

> 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개

  1. 바꾸기 전에 세어 본다
  2. 멈출 자리를 종이에 적는다
  3. 되돌릴 수단을 먼저 만든다
  4. 범위 기준이 실행을 막는다
  5. 도중에 걸리면 되돌린다
  6. 좁히면 통과해야 한다
  7. 되돌릴 수 없는 것을 쪼갠다
  8. 멈췄다는 사실도 보고 대상이다