[출결 앱 개발 로그 03] 날짜 출석을 수업 기록으로 확장하기 #DB설계 #세션모델
초기 출석 데이터는 “누가 오늘 왔는가”만 기록했다. MVP에는 충분했지만 실제 주짓수 수련을 담기에는 부족했다. 한 회원이 같은 날 17:30과 19:30 수업을 연달아 들을 수 있기 때문이다.
하루 한 번만 허용하면 두 번째 수업이 사라지고, 중복을 모두 허용하면 같은 QR이 여러 번 기록될 수 있었다.
날짜와 수업 참여를 분리했다
정규 수업은 17:30, 19:30, 21:00 세 타임이다. 이를 attendance_1730, attendance_1930, attendance_2100 같은 열 세 개로 만들지는 않았다. 수업이 추가되거나 시간이 바뀔 때마다 테이블을 고쳐야 하기 때문이다.
대신 수업 자체를 하나의 데이터로 만들고 출석이 그 수업을 가리키게 했다.
class_session
날짜 / 시작 시각 / 수업 종류 / 개최 상태
attendance
회원 / 수업 / 실제 체크인 시각 / 처리 방식
이 구조에서는 같은 날 세 수업을 들으면 출석 레코드가 세 건이다. 반면 주간 스트릭처럼 “수련한 날”이 필요한 계산에서는 날짜를 중복 제거해 하루로 센다.
수업 시각과 실제 처리 시각은 다르다
관리자가 밤 10시에 빠진 기록을 보고 17:30 수업을 수동으로 추가할 수 있다. 이때 실제 체크인 시각을 17:30으로 만들어 버리면 기록의 의미가 흐려진다.
그래서 다음 두 값을 분리했다.
- 어느 수업에 참여했는가: 17:30 세션
- 기록이 실제로 만들어진 시각: 밤 10시
QR이나 PIN으로 현장에서 처리한 출석도 실제 인식 시각을 그대로 남긴다. 덕분에 수업 시작 시간과 데이터 수정 시간을 혼동하지 않고 나중에 기록을 해석할 수 있다.
관리자 화면도 세 버튼으로 바꿨다
기존의 단일 출석 처리 버튼은 수업별 버튼으로 바뀌었다.
강민규
출석 · 17:30 · 19:30
[✓ 17:30] [✓ 19:30] [21:00]
비어 있는 버튼을 누르면 바로 추가한다. 이미 선택된 버튼을 다시 누르면 삭제 확인을 보여준다. 여러 회원을 빠르게 처리해야 하는 추가 작업에는 확인창을 두지 않고, 기록을 없애는 행동에만 확인을 둔 것이다.
상단의 오늘 출석 18명은 레코드 개수가 아니라 고유 회원 수다. 한 사람이 세 타임을 모두 들어도 출석 인원은 한 명이고, 수업 참여 횟수는 세 번이다.
수업 일정은 한곳에서 관리했다
시간을 여러 컴포넌트에 직접 적으면 19:00을 19:30으로 바꿀 때 일부 화면만 남는 문제가 생긴다. 실제로 개발 중 수업 시간이 정정되면서 이 위험을 확인했다.
현재 기준은 한 설정 영역에서 관리한다.
- 월~목: 17:30, 19:30, 21:00 정규 수업
- 금요일: 20:00 Open Mat
- 토요일: 10:00~15:00 Open Mat
- 일요일: 자동 연결 수업 없음
- 2026년 10월 2일 20:00: 이정필의 버터플라이 세미나
특별 세미나는 같은 시간의 일반 규칙보다 먼저 판정한다. 향후 일정이 늘어나도 출석 화면과 보상 코드를 각각 고칠 필요가 없도록 한 것이다.
과거 데이터는 억지로 추정하지 않았다
기존 기록 중에는 날짜만 있고 어느 수업이었는지 알 수 없는 데이터가 있었다. 이를 가장 가까운 수업으로 임의 배정하면 데이터가 풍부해 보일 수는 있지만 사실이 아니다.
회차를 알 수 없는 과거 기록은 날짜를 보존하고 “알 수 없음”으로 남겼다. 데이터 이전에서 가장 중요한 것은 빈칸을 없애는 일이 아니라, 아는 것과 모르는 것을 구분하는 일이었다.
현재 결론
출석 앱의 데이터 단위는 단순한 날짜도, 버튼 상태도 아니었다. 실제로 개최된 수업과 그 수업에 참여한 사건이었다. 이 기준을 세우고 나서 다중 수련 칭호, 시간대 통계, Open Mat 기록도 같은 데이터 위에서 자연스럽게 계산할 수 있게 됐다.