1-03 · 검토 결과 저장하기

1. 실습 목표

유효 모집단 29건과 규칙별 결과를 지정 실행 ID로 SQLite에 저장하고 같은 실행을 반복해도 중복되지 않게 합니다.

2. 시작 지점

student/02-controls-ready에서 30 / 29 / 21 / 8 / 1 판정 결과와 사례별 규칙 상태·근거 ID를 확인했습니다. 이번 단계에서는 같은 결과를 SQLite에 저장하고 실행 결과를 화면에서 확인합니다.

3. 구현 범위 및 요구사항

  • 실행, 사례, 규칙 결과의 소유 관계를 분명히 합니다.
  • 같은 실행 ID로 다시 실행하면 한 트랜잭션에서 해당 결과를 교체합니다.
  • 입력 오류는 별도 저장하고 유효 사례 테이블에는 넣지 않습니다.
  • 원본 CSV는 쓰지 않고 SQLite·WAL·journal은 Git에 넣지 않습니다.

화면에서 저장 상태 확인

  • 기존 앱 셸의 통제 실행 버튼으로 POST 실행을 시작합니다.
  • 실행 중·성공·실패를 텍스트로 구분하고, 성공하면 실행 ID와 저장 건수를 표시합니다.
  • 같은 실행을 다시 하면 기존 결과를 교체했다는 피드백을 표시하고 중복 저장으로 보이지 않게 합니다.

4. 실습 프롬프트

Claude Code에 붙여 넣을 프롬프트
판정 결과를 SQLite에 저장하고 같은 실행을 반복해도 중복되지 않게 해 주세요.
 
현재 판정 API는 입력 오류와 규칙 결과를 계산하지만 실행 결과를 영구 저장하지 않습니다. 기존 결과 모델과 화면을 유지하면서 한 번의 실행 결과가 함께 저장되도록 구현해 주세요.
 
구현이 끝나면 사용자가 통제 테스트를 실행해 저장 상태를 확인할 수 있어야 하며, 같은 실행을 다시 요청해도 결과 행이 중복되어서는 안 됩니다.
 
- 실행 정보, 유효 사례, 규칙별 결과와 입력 오류를 위한 SQLite 테이블 구성
- `sqlite3`와 하나의 트랜잭션을 이용한 전체 실행 결과 저장
- 같은 실행 ID 재실행 시 기존 결과 교체와 중복 행 방지
- `POST /api/control-test/run`의 실행 중·성공·실패 상태와 실행 ID·저장 건수 표시
- 입력 CSV와 기존 판정 결과 유지
- DB, WAL과 journal 파일의 Git 제외
 
같은 실행 ID로 API를 두 번 호출하고 기존 검사 명령을 실행해 주세요. 구현 후에는 변경 파일과 테이블, 실제 재실행 결과, 검사 통과 여부와 Git 상태만 간단히 알려 주세요.

5. 예상 결과

Success

  • 체크포인트: student/03-controls-persisted
  • DB: backend/data/day1_control_test.sqlite3
  • 유효 사례 29, CHG-2608-030은 유효 사례 테이블에 없음
  • 재실행 전후 30 / 29 / 21 / 8 / 1 동일
  • SQLite와 임시 저널이 Git 상태에 없음
  • 화면에 실행 ID·저장 건수·재실행 결과가 보이고 집계가 유지됨

6. 대표 실패 사례 및 복구

Failure

  • 재실행할 때 같은 사례가 누적됨
  • 사례와 규칙 저장 사이에 부분 데이터가 남음
  • 실행 중 생성되는 DB를 Git에 추가함

처음부터 다시 확인하는 방법

practice/workspace에서 실행 중인 백엔드를 Ctrl+C로 끈 뒤 첫 번째 터미널에서 DB를 지우고 백엔드를 다시 시작합니다.

Remove-Item backend/data/day1_control_test.sqlite3 -ErrorAction SilentlyContinue
npm run start:backend

두 번째 PowerShell 터미널은 ai-coding-class-pwc-practice 저장소의 최상위 폴더에서 엽니다. 아래처럼 practice/workspace로 이동한 뒤 같은 API를 두 번 호출합니다. 이 API 호출이 판정 결과를 DB에 저장합니다.

cd practice/workspace
(Invoke-RestMethod -Method Post -Uri http://127.0.0.1:8000/api/control-test/run).summary
(Invoke-RestMethod -Method Post -Uri http://127.0.0.1:8000/api/control-test/run).summary
python -c "import sqlite3; db=sqlite3.connect('backend/data/day1_control_test.sqlite3'); print(db.execute('SELECT COUNT(*) FROM population_results').fetchone()[0])"

두 API 결과가 모두 30 / 29 / 21 / 8 / 1이고 마지막 명령이 29를 출력하면 중복 저장되지 않은 것입니다. 입력 CSV는 삭제하지 않습니다.

직접 확인할 결과

  1. 통제 실행을 눌러 실행 중 상태를 확인합니다.
  2. 성공 뒤 실행 ID와 SQLite 저장 결과가 표시되는지 확인합니다.
  3. 같은 실행을 다시 해도 사례 수와 지표가 늘지 않는지 확인합니다.
  4. 백엔드를 중지한 상태에서 실행해 오류 피드백을 확인한 뒤 다시 시도합니다.

7. 다음 실습

같은 API 결과를 검토 현황과 사례 근거 연결하기에 연결합니다.