우선순위 P2 · 출시 전 전수 QA 12/13 · 상위 이슈 #252
배경
인터페이스정의서 6장이 같은 1,200% 검증을 언제 도느냐를 5가지 모드로 나눴다.
"계산 엔진은 하나, 부르는 시점만 5가지"가 설계 원칙인데, 엔진이 정말 하나인지 확인된 적이 없다.
다섯 개의 답이 서로 다르면 이 제품의 신뢰가 무너진다.
검사 대상 — 5가지 실행 모드
| 모드 |
언제 |
결과가 남는 곳 |
| ① 즉시 재계산 |
데이터 변경 직후, 도메인 이벤트 리스너 |
cap_check(check_kind='REALTIME') |
| ② 확정 전 차단 검증 |
POST /transactions/{id}/confirm (IF-API-25) |
cap_check(check_kind='PRE_CONFIRM') · exception_case |
| ③ 수동 재검증 |
CONT-W02 [한도 재검증] (IF-API-19B) |
cap_check(check_kind='MANUAL') — V28__add_manual_cap_check_kind |
| ④ 월 통합검증 |
VRUN-W02 실행 (IF-API-48) |
validation_run 10단계 |
| ⑤ 일배치 |
변경 계약 스캔 |
batch_watermark |
볼 것
- 엔진 단일성 — 5개 모드가 정말로 같은 계산 코드를 부르는가. 같은 입력에 같은 답을 주는가
- 10단계 진행률 — 운영정책서 제43조
current_step 모델대로 도는가. 실패 시 어디서 멈추고 무엇이 남는가
- 트랜잭션 경계
- 4-3 규칙 3: 확정 검증과 예외 생성은 같은 트랜잭션 — 한도 초과로 막혔는데 예외가 안 만들어지면 그 건이 영영 묻힌다
- 4-3 규칙 5:
POST /contracts 는 같은 트랜잭션에서 예상 스케줄까지 만든다
- 배치 Step 경계와 롤백 범위 (
06_배치_Step_협업계약.md)
- 멱등성
- FUN-040 스케줄 생성 멱등성
Idempotency-Key (IF-API-51)
- ⑩ 확정 후 재실행 시 중복 0건 (시연 10컷 마지막)
- 데모 시드 재실행
- 동시성 — 같은 검증 실행에 두 요청이 동시에 오면(
FGC-VRUN-005), 대사 실행 중복(uq_reconciliation_run), V7__run_progress_and_snapshot_locks 의 잠금이 실제로 동작하는가
- 확정 후 잠금 —
V30__validation_run_finalization · V31__lock_reconciliation_results_after_validation_finalization 이 전 화면·전 API에서 지켜지는가
- 배치가 앱 기동 시 저절로 안 도는가 —
spring.batch.job.enabled: false
- 시간대 — SIR-008
Asia/Seoul. 월 경계(말일 23:59 / 1일 00:00) 처리
통과 기준
공통 규칙 (모든 QA 이슈에 적용)
- 근거 없는 수정 금지 —
00_인덱스/근거대장.md를 먼저 읽고, 모든 수정 제안에 근거 ID(REG-xx / SRC-xx)를 붙인다. 못 붙이면 "근거 없음 — 확인 필요"로 남긴다.
- 발견을 3분류한다 — ① 문서가 틀림 ② 구현이 틀림 ③ 아직 구현 안 됨(문서 유효). ③을 ①로 오인해 지우면 설계 의도가 사라진다.
- 이 이슈에서 직접 고치는 것은 "명백한 오기·1줄짜리"까지. 판단이 필요한 것은 후속 이슈로 분리하고 여기에 링크한다.
- PR 하나가 커지지 않게 — 검사 결과를 먼저 이 이슈에 표로 남기고, 수정은 그다음에 올린다.
배경
인터페이스정의서 6장이 같은 1,200% 검증을 언제 도느냐를 5가지 모드로 나눴다.
"계산 엔진은 하나, 부르는 시점만 5가지"가 설계 원칙인데, 엔진이 정말 하나인지 확인된 적이 없다.
다섯 개의 답이 서로 다르면 이 제품의 신뢰가 무너진다.
검사 대상 — 5가지 실행 모드
cap_check(check_kind='REALTIME')POST /transactions/{id}/confirm(IF-API-25)cap_check(check_kind='PRE_CONFIRM')·exception_casecap_check(check_kind='MANUAL')—V28__add_manual_cap_check_kindvalidation_run10단계batch_watermark볼 것
current_step모델대로 도는가. 실패 시 어디서 멈추고 무엇이 남는가POST /contracts는 같은 트랜잭션에서 예상 스케줄까지 만든다06_배치_Step_협업계약.md)Idempotency-Key(IF-API-51)FGC-VRUN-005), 대사 실행 중복(uq_reconciliation_run),V7__run_progress_and_snapshot_locks의 잠금이 실제로 동작하는가V30__validation_run_finalization·V31__lock_reconciliation_results_after_validation_finalization이 전 화면·전 API에서 지켜지는가spring.batch.job.enabled: falseAsia/Seoul. 월 경계(말일 23:59 / 1일 00:00) 처리통과 기준
공통 규칙 (모든 QA 이슈에 적용)
00_인덱스/근거대장.md를 먼저 읽고, 모든 수정 제안에 근거 ID(REG-xx / SRC-xx)를 붙인다. 못 붙이면 "근거 없음 — 확인 필요"로 남긴다.