← All projects

Robotics Room Reservation

SYSTEM DESIGN & PRIVACY

기다림을 관람 시간으로 바꾼 체험실 현장 대기열 시스템

Period
2026.04 ~ 진행중
Role
기획 · 1인 풀스택 (Claude 기반 바이브 코딩)
Cycle
발견 → 기획 → 개발 → 적용·운영

Why

수기 대기 명단은 호출 누락, 개인정보 노출 문제도 있었습니다.

하지만 진짜 문제는 자리가 났을 때 현장에 없으면 차례가 다음 사람에게 넘어가는 구조였습니다.

관람객은 과학관을 둘러보지 못한 채, 언제 올지 모르는 차례를 체험실 앞에 앉아 기다려야만 했습니다.

대기 중엔 자유롭게 전시를 관람하다가, 차례가 오면 SMS로 호출받아 돌아오는 구조로 바꾸기 위해 만들었습니다.

2026년 4월부터 운영하며 현장 요구에 맞춰 계속 개선하고 있습니다.

My Role in the Architecture

React 프론트엔드부터 Django REST 백엔드, APScheduler 스케줄러, SMS 연동, 내부망 배포까지 시스템 전체를 혼자 설계·구현했습니다.

대기열 상태(FIFO 계산)와 SMS 발송 트리거를 대시보드에서 실시간으로 동기화해 보여주는 게 프론트엔드에서 가장 신경 쓴 부분입니다.

관람객 전화번호를 다루는 공공기관 서비스라, 외부 인터넷과 분리된 내부망 전용 배포 구조도 직접 설계했습니다.

Stack

Frontend
ReactTailwind CSS
Backend
Django REST FrameworkAPSchedulerSQLite
API
Solapi SMSopenpyxl

Highlights

개인정보 최소 보관 설계

전화번호 수집 동의 절차를 두었습니다.

운영 마감 후 APScheduler가 일일 통계만 이관한 뒤, 개인정보 전체를 자동 파기하도록 설계했습니다.

통계는 성별·연령 8분류로만 집계해 개인 식별 없이 방문 데이터를 축적합니다.

슬롯 기반 대기열 · 선호출 알고리즘

상시 게시되는 태블릿 화면이 꺼지지 않도록 Wake Lock API를 적용했습니다.

정원(테이블 10석)은 '입장 인원 + 이미 호출 중인 인원'의 합으로 관리합니다.

자리가 나면 등록 순서(FIFO)대로 다음 팀을 바로 호출해, 자리가 빌 때까지 기다리지 않고 이동 시간을 벌어줍니다.

호출 문자에는 11분 입장 기한을 명시합니다.

신규 등록·입장 처리·대기자 삭제, 세 이벤트 모두에서 같은 재호출 로직이 실행되도록 설계해 빈 자리가 방치되지 않게 했습니다.

태블릿 등록 — 대기열이 시작되는 지점

배포 없는 내부망 아키텍처

관람객 전화번호를 다루는 공공기관 서비스라, 클라우드 공개 배포 대신 내부망(관내 IP) 전용으로 설계했습니다.

공인 URL이 없어 외부에서는 접근이 불가능하고, 태블릿과 직원 대시보드는 같은 내부망 안에서만 통신합니다.

테이블 배정 & 통계 자동화

Solapi API로 호출 문자를 발송하고, 중복 발송 방지 플래그로 같은 팀에게 문자가 두 번 가지 않도록 관리합니다.

배정된 테이블(T1~T10)과 일일 방문 통계는 서식이 적용된 엑셀로 바로 내려받을 수 있습니다.

직원 대시보드 — 테이블 배정과 SMS 호출 현황

Friction & Resolution

실제 운영 중 CORS 에러가 발견돼 바로 조치했습니다.

직원 요청으로 엑셀 통계 양식도 현장에 맞게 다시 만들었습니다.

SQLite 단일 파일 DB로 충분했지만, 다기관으로 확장한다면 DB·인증 구조 개선이 필요합니다.

Result

  • 2026년 4월부터 실제 체험관 현장에서 운영 중

Next project