지각 감점 3점을 반영해 달라는 요청이 와서 화면에서 재계산을 누르니 3점이 나왔다.
Table of contents
Open Table of contents
증상 — 제출 방식에 따라 갈린 점수
먼저 이상한 것이 하나 있었다.
직접 제출 1.5
자동 마감 3.0
직접 제출 과 자동 마감 사이에서 감점이 두 배로 달라졌다.
화면 관측으로는 이렇게 보였다.
직접 제출 지각 감점만 1.5
자동 마감 지각 감점 + 미제출 처리 1.5 + 1.5
이 해석은 추정이고 감점 산식을 코드로 확인하지는 않았다.
같은 값이 여러 경로로 나올 수 있으면 지금 보는 것이 어느 경로인지 모른다는 뜻이다. 그래서 눈으로 관측한 값과 내가 추정한 해석을 구분해 적어 뒀다.
검증 — 메모와 DB를 봤다
저장하기 전에 이 건의 메모를 봤다.
admin_memo: 재평가 건으로 가산점 승인 완료
admin_memo 에 가산점이 이미 있다고 적혀 있어서 그 점수를 확인해 봤다.
SELECT bonus_score FROM local_dlp_grade_revisions
WHERE submission_id = ? AND type = 'bonus';
3
bonus_score 로 이미 3점이 승인돼 있었다.
그런데 재계산 화면에는 3 하나만 보이고 이미 승인된 bonus_score 는 그 화면 어디에도 안 나오고 있었다.
원인 — 별도 행의 가산점
bonus_score 가 사는 자리가 달랐다.
[재계산 대상] 이번 과제의 지각 감점
[가산점] type = 'bonus' 행 — 집계에 안 잡힘
미리보기의 집계가 type = 'penalty' 이번 건에 한정돼 있었다.
미리보기라는 이름 때문에 최종 결과로 읽었던 것이 문제였다. 그 화면이 무엇을 더하고 무엇을 안 넣는지는 코드를 봐야 나왔다.
결과 — 이중 계상이 된다
그대로 저장했으면 이렇게 된다.
가산점 +3 (이미 승인)
감점 -3 (새로 얹음)
────────────────────
성적부 반영 0 ← 의도한 -3 이 아니다
화면에는 -3 인데 성적부에는 0 이 들어간다.
저장 시점에는 오류가 안 나므로 성적부가 나가고 나서야 드러난다. 되돌리려면 성적부 쪽까지 손대야 해서 저장 전에 확인하는 것이 훨씬 싸다.
조치 — 닫고 나서 재계산
닫지 않고 그대로 저장하는 것과 기존 것을 먼저 닫고 재계산하는 것 두 가지 길 중 뒤쪽을 골랐다. 이유는 앞쪽은 이중 계상이 성적부에 나간 뒤에야 드러나서다. 순서를 정했다.
① 기존 가산점 보류를 미승인으로 먼저 닫는다
(성적은 손 안 대고 가산점만 0으로)
② 그다음 재계산
③ 미리보기가 단일 점수로 나오는지 확인
④ 저장
가산점 을 먼저 닫고 나서 재계산하니 미리보기 점수가 실제 반영값과 같아졌다.
다만 닫지 않고 그대로 저장하는 경로가 화면에서 막혀 있지는 않았다. 사람이 순서를 지켜야 하는 자리는 적어 두지 않으면 언젠가 어긋난다.
대응 — 저장 후 검증
저장하고 끝내지 않고 둘을 더 봤다.
SELECT COUNT(*) FROM local_dlp_grade_revisions
WHERE submission_id = ? AND type IN ('penalty', 'bonus') AND deleted_at IS NULL;
submission_id 로 세어 같은 성격의 보정 중복이 0건인지 본다.
SELECT * FROM portal_sync_jobs WHERE course_id = ? AND created_at > '<저장 시각>';
자동 마감으로 두면 이미 마감된 건에 재통지가 나갈 수 있어 portal_sync_jobs 도 0건인지 본다.
저장이 성공했다는 것과 의도한 상태가 됐다는 것은 다른 말이다. 같은 대상에 점수가 붙는 행이 여럿이면 화면 하나가 그 전부를 보여 주지 못한다.
정리
- 미리보기의 집계가 어디까지인지 확인한다
- 이번 건만 세고 있을 수 있다
- 같은 값이 여러 경로로 나오면 경로를 확정한다
- 같은 대상에 붙는 점수가 별도 행이면 합계가 아니다
- 그대로 저장하면 이중 계상된다
- 저장 시점에는 오류가 안 나고 성적부에서 드러난다
- 기존 것을 먼저 닫고 재계산한다
- 미리보기가 단일 점수로 나오는지 확인하고 저장한다
- 저장 후 중복 0건과 부수 작업 미발화를 검증한다
- 관측한 값과 추정한 해석을 구분해 적는다