13단계
13단계 — 부분 실패와 복구를 교차 서비스 계약으로 닫기
1회 조회
목차
여러 서비스가 하나의 제품을 이루면 “API가 200을 반환했다”는 완료 증거가 아닙니다. 배치가 일부만 처리했는지, migration이 실제로 적용됐는지, 정적 클라이언트가 서버 기능을 호출할 수 있는지, 사용자가 다음 행동을 알 수 있는지를 함께 닫아야 합니다.
이번 변경의 상태표
| 상태 | 데이터·운영 의미 | 사용자에게 보일 행동 |
|---|---|---|
completed |
기대한 묶음과 검증이 모두 끝남 | 결과를 정상 표시 |
skipped |
이미 완전한 결과가 있어 중복 실행하지 않음 | “최신 결과”와 확인 시각 표시 |
partial |
일부 날짜·종류·외부 작업이 실패함 | 성공분과 재시도 범위를 분리 표시 |
failed |
저장·migration·필수 capability가 실패함 | 원인을 안전한 코드로 안내하고 재시도 제공 |
unsupported |
현재 플랫폼에 서버 전용 기능이 없음 | 기능이 없는 이유와 웹 사용 경로 안내 |
세 가지 경계
1. 생성 결과는 묶음 완전성을 먼저 검사한다
LLM이 기대 멤버 중 일부만 반환하면 일부를 저장하고 성공으로 세지 않습니다. 기대 멤버 집합을 비교한 뒤 정확히 맞을 때만 한 transaction으로 upsert합니다. DB 오류는 rollback하고 다음 scheduler 라운드가 부분 상태를 복구할 수 있게 합니다.
관련 읽기: 기대 멤버 집합의 완전성과 원자 upsert
2. 테스트 migration은 실패를 삼키지 않는다
통합 테스트가 migration 디렉터리 누락이나 SQL 오류를 경고만 남기고 통과하면 모든 entity 테스트가 false-green이 됩니다. 디렉터리·파일이 없거나 한 SQL이라도 실패하면 즉시 중단하고, SQL은 명시적 UTF-8로 읽습니다.
관련 읽기: 마이그레이션 replay를 fail-closed로 만들기
3. 정적 플랫폼은 없는 서버 기능을 호출하지 않는다
Tauri export에는 Next.js BFF route가 없습니다. 상대 경로 /api/batch/init를 호출해 404를 만들기보다 unsupported 상태를 반환하고, 화면은 서버 소유 기능이라는 사실을 설명해야 합니다.
관련 읽기: Tauri capability boundary
다섯 관점의 인수 증거
- 기획자는 정상·부분 실패·재시도·지원하지 않는 플랫폼의 상태와 소유자를 적습니다.
- 디자이너는 성공분과 실패 범위를 숨기지 않는 표, 키보드 포커스, 오류·재시도 문구를 확인합니다.
- 개발자는 집합 검증, transaction, unique index, 안전한 오류 코드, 계약 테스트를 남깁니다.
- 사용자는 현재 결과가 완전한지, 다시 시도하면 무엇이 바뀌는지 이해할 수 있어야 합니다.
- 운영자는 scheduler 결과, readiness, migration 로그, release SHA와 rollback 경로를 조회할 수 있어야 합니다.
완료 체크리스트
- 부분 묶음이 완전한 결과처럼 skip되지 않는다.
- 한 행의 DB 실패가 묶음 전체를 rollback한다.
- migration 누락·SQL 오류가 테스트 성공으로 남지 않는다.
-
NULL을 포함한 캐시 키의 논리적 유일성이 DB와 upsert에서 일치한다. - 정적 클라이언트의 서버 전용 기능이 명시적
unsupported상태를 사용한다. - 공개 UI와 운영 로그가 같은 상태명을 사용한다.
이 체크리스트와 실행 결과가 release 기록에 함께 있을 때 교차 서비스 변경을 완료로 판정합니다.