기대 멤버 집합의 완전성 검증과 원자 upsert
묶음 결과는 행 하나가 아니라 같은 batch key에 속한 기대 멤버 전체로 판정해야 합니다. 일부 행만 존재하는 상태를 완료로 오인하지 않는 읽기·쓰기 계약을 설명합니다.
묶음 생성 결과는 행 하나가 아니라 같은 batch_key에 속한 기대 member_code 집합 전체가 제품 결과입니다. 멤버 하나가 존재한다고 묶음 전체가 준비된 것은 아닙니다.
읽기와 쓰기의 같은 판정
조회는 GROUP BY batch_key 뒤 멤버 집합을 비교하고, 기대 집합과 같을 때만 생성 단위를 skip합니다. 부분 행은 다음 생성 라운드가 복구할 수 있도록 미완료로 남깁니다. 생성기는 중복·미지원 코드·잘못된 코드 이름·개수 부족을 DB 앞에서 거절합니다.
한 묶음, 한 transaction
| 판정 | 저장 동작 | 재시도 |
|---|---|---|
| 기대 멤버 전체 | 한 transaction으로 upsert | 불필요 |
| 멤버 일부 누락·중복 | 저장하지 않음 | 전체 묶음 재생성 |
| DB 오류 | rollback | 같은 묶음 재시도 |
검증된 기대 개수의 행은 executemany와 한 번의 commit으로 저장합니다. 한 행에서 오류가 나면 rollback하고 count를 0으로 보고합니다. 이렇게 하면 UI가 일부 성공을 전체 성공으로 오인하지 않고, scheduler가 재시도할 범위를 유지합니다.
이 원칙은 LLM 출력뿐 아니라 수동 Admin 생성과 자동 scheduler에도 적용해야 한다. 충돌 정책이 마지막 쓰기 우선이어도 완전하지 않은 묶음을 성공으로 만드는 것과는 별개의 문제다.
관련 강좌: 부분 실패·복구·플랫폼 경계를 교차 서비스 계약으로 닫기
검증할 때는 저장 전후의 기대 멤버 집합이 정확히 같은지, 오류 주입 뒤 행 수가 이전 상태로 유지되는지 함께 확인합니다.