박준 · PARK JOON
프로젝트 / 웹앱·대시보드
웹앱·대시보드Cloudflare Workers오프라인 동기화반응형 레이아웃Jetpack Compose디자인 토큰

학원 미완료 과제 자동 배정 앱

수업 뒤 남은 과제를 학생별 다음 일정에 자동 배정하고, 웹·안드로이드·서버가 같은 데이터를 쓰는 학원 운영 도구

기간
2026.10
형태
의뢰 프로젝트
상태
동작 확인
역할
요구 해석·업무 모델 설계·웹/안드로이드/서버 개발·QA 1인 수행
재구성 목업 · 실제 화면이 아니라 흐름을 보여 주는 애니메이션입니다클릭하면 멈춤·재생
117/117건화면 9개 × 기기 10종 레이아웃 감사 통과
19.5초웹→앱 최악 동기화 지연 (목표 20초)
52/52개서버 단위 테스트 통과
7개웹↔앱 교차 동기화 시나리오 통과 (검사 20항목 실패 0)

문제

한 학원은 수업이 끝난 뒤 학생마다 남은 유인물·과제·재시험을 직원이 개별 일정으로 옮겨 적고, 요일·시간순으로 다시 정리해 관리하고 있었습니다. 핵심 요구는 네 가지였습니다. 개별 일정의 날짜·시간 자동 정렬, 당일 클리닉 대상 자동 생성, 완료 여부와 경고카드를 한 화면에서 보기, 과거 일정과 관리 이력 조회입니다.

여러 직원이 PC·태블릿·폰에서 동시에 써야 했기 때문에 기기 한 대에 저장하는 앱으로는 부족했습니다. «이 범위가 실제로 돌아가는가»를 도입 전에 보여 줄 근거도 필요했습니다.

접근

  • 요청서만 받은 단계에서 단일 HTML PWA 시연판을 먼저 만들었습니다. 학생별 정규 등원 시간표를 두고, 미완료 항목을 등록하면 그 학생의 다음 수업 시간에 자동 배정하는 규칙을 세웠습니다.
  • 고객 기획서를 받은 뒤 업무 모델을 «통과해야 할 시험지 + 개별 일정 + 경고카드»로 다시 설계했습니다. 통과 체크가 모두 끝나면 자동으로 완료 처리하고, 지각·노쇼는 경고카드를 자동으로 만드는 규칙을 서버에서 판정합니다.
  • 서버는 Cloudflare Workers와 D1로 구성했습니다. 전역 단조 증가 커서로 변경분만 가져오고, mutation ID로 멱등성을 보장하며, 행 단위 버전으로 충돌을 감지합니다. 완료 체크처럼 한 칸만 바꾸는 변경은 필드 단위로 병합합니다.
  • 공통 디자인 토큰 파일 하나에서 웹 CSS와 안드로이드 Compose 테마를 자동 생성해 두 클라이언트의 색·글꼴·간격·폭 구간을 맞췄습니다. 앱 코드 안에 직접 적은 색은 0개입니다.
  • 판정기(API 계약 스모크, 토큰 일치 검사, 기기 10종 레이아웃 감사, 교차 동기화 E2E)를 먼저 고정해 두고, 무인 작업 세션이 단계마다 이 판정기를 통과해야 다음 단계로 넘어가게 했습니다.

구조

등록직원이 학생·날짜·시간을 고르면 중복을 경고하고 기본 시간을 제안합니다.
자동 배정미완료 항목이 그 학생의 다음 일정에 붙고 요일·시간순으로 정렬됩니다.
당일 처리당일 클리닉 대상이 자동으로 만들어지고, 시험지 통과를 체크하면 서버가 완료를 판정합니다.
경고 기록지각·노쇼를 입력하면 경고카드가 자동으로 생성되어 현황 표에 합산됩니다.
동기화앱은 15초마다 변경분을 가져오고, 오프라인 중 변경은 대기열에 쌓았다가 복구 후 보냅니다.
백업·알림매일 자동 백업을 저장하고, 시간대별 일정 알림을 웹 푸시와 기기 알림으로 보냅니다.

주요 기능

다음 일정 자동 배정학생별 정규 시간표를 기준으로 미완료 항목을 다음 수업에 붙이고, 밀린 항목은 이월 횟수와 함께 다음 수업으로 넘깁니다.
충돌을 드러내는 동기화두 직원이 같은 행을 동시에 고치면 한쪽에 «다른 선생님이 먼저 바꿨어요»를 알리고 데이터는 1행으로 유지합니다.
오프라인 대기열인터넷이 끊긴 동안의 체크를 쌓아 두었다가 복구 후 서버에 반영합니다. 강제 종료 후에도 로그인과 데이터가 유지됩니다.
폭 4구간 레이아웃폰은 하단 탭, 폴더블·태블릿은 레일 메뉴, PC는 사이드바로 바뀌고 주간 일정표는 넓은 화면에서 7열로 펼쳐집니다.
관리 기능PIN 로그인과 연속 실패 잠금, 관리자 권한, 당일 관리표 A4 인쇄, 엑셀 4시트 내보내기를 제공합니다.

결과

  • 웹 전 기능, 안드로이드 서버 연동판, 공용 서버, 웹 푸시, 매일 백업을 포함한 표준 범위가 무료 등급 인프라에서 동작함을 확인했습니다.
  • API 계약 25항목, 서버 테스트 52개, 디자인 토큰 23항목, 레이아웃 117건, 교차 동기화 시나리오 7개(검사 20항목)를 모두 실패 0으로 통과했습니다.
  • 만든 세션과 분리된 리뷰어 2명이 캡처 163장을 검토해 찾은 블로커 7건을 모두 고쳤습니다.
  • 사용 설명서·사용 가이드 PDF와 85초 소개 영상까지 만들어 시연판으로 정리했습니다.

포인트

도입 전 검증의 핵심은 «만들었다»가 아니라 «판정기가 통과시켰다»였습니다. 기준을 먼저 고정하고 작업 세션이 그 기준을 느슨하게 고치지 못하게 막아 두니, 무인으로 단계를 이어 가도 결과를 숫자로 설명할 수 있었습니다.

동기화 목표를 «실시간»이 아니라 «20초 안»으로 정의한 덕분에 WebSocket 없이 폴링과 커서만으로 무료 한도 안에서 해결했습니다. 최악 지연이 19.5초로 여유가 작다는 사실도 함께 기록해, 폴링 간격을 10초로 줄이는 다음 조치와 그때의 요청량까지 미리 계산해 두었습니다.

기술

Cloudflare WorkersCloudflare D1Cloudflare R2Cloudflare PagesHonoTypeScriptReactKotlinJetpack ComposePlaywright

상단 영상은 실제 화면이 아니라 구조를 보여 주는 재구성 목업입니다. 고객 정보는 익명화했습니다.