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. 실습 프롬프트
판정 결과를 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는 삭제하지 않습니다.
직접 확인할 결과
- 통제 실행을 눌러 실행 중 상태를 확인합니다.
- 성공 뒤 실행 ID와 SQLite 저장 결과가 표시되는지 확인합니다.
- 같은 실행을 다시 해도 사례 수와 지표가 늘지 않는지 확인합니다.
- 백엔드를 중지한 상태에서 실행해 오류 피드백을 확인한 뒤 다시 시도합니다.
7. 다음 실습
같은 API 결과를 검토 현황과 사례 근거 연결하기에 연결합니다.