시스템 구성 문서 — 필라테스 공정 대기 예약
1. 시스템 목표
정원 5~15명 규모의 기구 필라테스 스튜디오에서 원장이 예약·취소·대기 신청을 직접 관리할 수 있는 웹서비스입니다.
회원은 휴대폰 웹페이지에서 수업을 예약하거나 대기 신청합니다. 취소로 빈자리가 생기면 대기 순번에 따라 한 명씩 문자 수락 링크를 받고, 수락한 회원은 승인 대기 상태가 됩니다. 원장이 최종 승인하면 예약이 확정됩니다.
핵심 목표는 다음과 같습니다.
- 단톡방에 빈자리를 공지하고 개별 답변하는 일을 줄인다.
- 대기 신청 시각과 변경 불가능한 등록 순번을 기준으로 공정한 대기 순번을 운영한다.
- 무료 취소 마감 시각, 12시간 이내 취소, 예외 복구를 일관되게 기록한다.
- 회원권 이력, 취소 사유, 노쇼, 오류 수정 이력을 남겨 원장이 처리 근거를 확인할 수 있게 한다.
2. 사용자와 권한
| 역할 | 할 수 있는 일 |
|---|---|
| 회원 | 휴대폰 본인 확인, 수업 조회, 예약, 대기 신청, 내 대기 순번 확인, 예약 취소, 취소 사유 제출, 빈자리 수락 또는 거절 |
| 원장 | 회원·회원권 초기 등록, 수업 등록·수정, 예약·대기 현황 확인, 빈자리 수락 승인·반려, 회원권 횟수 처리, 예외 복구, 출석 상태·노쇼 기록, 오류 수정 이력 확인 |
첫 개발 범위에서는 강사·프런트 직원용 별도 권한을 만들지 않습니다.
3. 시스템 구성
3-1. 구성 원칙
- 회원과 원장은 같은 웹서비스를 사용하되, 역할에 따라 접근 가능한 화면과 기능을 나눕니다.
- 회원은 앱 설치 없이 카카오톡 등에 공유된 링크를 열어 모바일 웹에서 이용합니다.
- 서버는 예약 확정, 취소, 대기 순번, 회원권 횟수 차감처럼 데이터가 어긋나면 안 되는 처리를 담당합니다.
- 문자 발송과 휴대폰 본인 확인은 외부 문자 서비스와 연동합니다.
- 응답 만료, 다음 대기 회원 안내는 예약된 시간에 자동 실행되는 작업으로 처리합니다.
- 회원권 결제와 충전은 서비스 밖에서 처리하며, 서비스에는 원장이 등록한 회원권 정보와 회원권 이력만 저장합니다.
3-2. 시스템 구성도
그림을 그리는 중…
회원과 원장은 각자 필요한 웹 화면을 통해 서버에 요청합니다. 서버는 예약·대기·회원권 처리 결과를 데이터 저장소에 기록하고, 휴대폰 인증번호와 빈자리 수락 링크는 문자 서비스로 보냅니다.
응답 만료와 다음 대기 회원 안내는 사용자가 화면을 열지 않아도 서버 작업이 정해진 시각에 실행해야 합니다.
4. 구성 요소별 책임
| 구성 요소 | 책임 | 구현 기준 |
|---|---|---|
| 회원용 모바일 웹 | 수업 조회, 예약, 대기 신청, 대기 순번 확인, 취소 사유 제출, 빈자리 수락 | 모바일 화면을 우선으로 구성한다. 다른 회원의 이름과 휴대폰 번호는 보여주지 않는다. |
| 원장용 웹 | 수업 관리, 대기 현황 확인, 승인·반려, 회원권 이력과 예외 복구, 노쇼, 오류 수정 | 원장만 회원 전체 정보와 처리 이력을 볼 수 있다. 휴대폰 번호는 기본적으로 마스킹한다. |
| 예약·취소·대기 서버 기능 | 정원 확인, 중복 예약 방지, 대기 순번 부여, 취소 처리, 빈자리 생성 | 마지막 좌석 처리와 대기 순번 변경은 한 번에 저장한다. |
| 원장 승인·회원권 이력 서버 기능 | 승인 대기 좌석 보류, 예약 확정, 회원권 횟수 차감, 예외 복구, 노쇼·오류 조정 기록 | 기존 회원권 이력을 덮어쓰거나 삭제하지 않고 새 이력을 추가한다. |
| 응답 만료·순차 문자 작업 | 대기 제안 발송, 수락 마감 확인, 대기 수락 만료 처리, 다음 대기 회원 안내, 문자 실패 재확인 | 서버 재시작 뒤에도 미처리 작업을 다시 찾을 수 있어야 한다. |
| 인증·권한 확인 | 휴대폰 번호 인증, 인증 세션 유지, 회원·원장 접근 구분 | 인증번호 만료, 재전송 제한, 입력 실패 제한을 둔다. |
| 관계형 데이터 저장소 | 회원, 수업, 예약, 대기 신청, 대기 제안, 회원권 이력, 출석 상태, 오류 수정 기록 저장 | 서로 연결되는 기록은 ID로 연결하고, 처리 시각과 처리자를 남긴다. |
| 문자 발송·인증번호 서비스 | 인증번호 문자, 빈자리 수락 링크 문자 발송 및 결과 제공 | 발송 요청과 실제 전달 상태를 구분해 저장한다. |
5. 핵심 업무 규칙
5-1. 예약과 정원
- 수업마다 정원은 5~15명으로 등록합니다.
- 예약 확정 인원이 정원보다 많아질 수 없습니다.
- 같은 회원은 같은 수업에 중복 예약할 수 없습니다.
- 수업에 자리가 있으면 회원은 예약을 요청할 수 있습니다.
- 예약 확정 시 회원권 사용 가능 여부와 잔여 횟수를 확인합니다.
- 예약 확정과 회원권 횟수 차감은 하나의 처리로 저장합니다.
5-2. 대기 신청과 대기 순번
- 수업이 마감된 경우 회원은 대기 신청을 할 수 있습니다.
- 대기 순번은 다음 두 값으로 결정합니다.
- 대기 신청 시각
- 같은 시각에도 순서를 구분할 수 있는 변경 불가능한 등록 순번
- 회원 화면에는 본인의 대기 순번과 전체 대기 인원을 보여줍니다.
- 회원 화면에는 다른 회원의 개인정보를 보여주지 않습니다.
- 대기 신청 중에는 회원권 횟수를 차감하지 않습니다.
5-3. 빈자리와 순차 문자 안내
취소 등으로 빈자리가 생기면 다음 흐름으로 처리합니다.
- 해당 수업의 대기 순번 1번 회원을 찾습니다.
- 대기 제안을 만들고 상태를 수락 대기로 변경합니다.
- 수락 링크와 응답 마감 시각이 담긴 문자 메시지를 발송합니다.
- 수업 시작 2시간 전까지는 응답 시간을 1시간으로 계산합니다.
- 수업 시작 2시간 이내에는 응답 시간을 10분으로 계산합니다.
- 회원이 응답하지 않으면 상태를 대기 수락 만료로 변경합니다.
- 다음 대기 순번 회원에게 같은 방식으로 안내합니다.
- 회원이 거절한 경우에도 다음 대기 순번 회원에게 안내합니다.
문자에는 수업 날짜, 시작 시각, 수업명, 수락 마감의 절대 시각을 포함합니다.
5-4. 빈자리 수락과 원장 최종 예약 승인
회원이 문자 링크에서 빈자리를 수락해도 즉시 예약 확정하지 않습니다.
- 회원이 수락하면 해당 좌석은 임시 보류됩니다.
- 대기 제안은 수락 상태가 되고 예약은 승인 대기가 됩니다.
- 원장은 빈자리 수락 승인 화면에서 회원권 잔여 횟수, 만료 여부, 예외 대상 여부, 응답 시각을 확인합니다.
- 원장이 승인하면 예약이 확정되고 회원권 횟수 차감 이력이 생성됩니다.
- 원장이 반려하면 좌석 보류를 해제하고 다음 대기 회원 안내를 진행합니다.
- 승인 대기 좌석의 보류 만료 시간과 만료 후 처리 기준은 확인 필요입니다.
회원권 횟수가 부족하거나 회원권이 만료된 회원도 수락할 수 있습니다. 이 경우에도 원장이 예약 여부를 직접 결정합니다.
5-5. 취소와 회원권 횟수 처리
| 취소 시점 | 예약 처리 | 회원권 횟수 처리 |
|---|---|---|
| 무료 취소 마감 시각 전 | 무료 취소 | 예약 확정 때 차감된 횟수가 있으면 복구 |
| 12시간 이내 취소 | 취소 기록 생성 | 원장이 차감 또는 미차감을 선택하고 이유 기록 |
| 휴강 | 수업 취소 처리 | 기존 차감이 있으면 복구 |
| 노쇼 | 출석 상태를 노쇼로 기록 | 기존 예약 차감이 있는지 확인하며 중복 차감 방지 |
모든 취소에서 회원은 지각, 건강, 개인 사정 등의 취소 사유를 선택하고 필요하면 추가 내용을 입력합니다.
12시간 이내 취소에서 원장이 미차감 처리하는 경우에는 기본 횟수 차감 기록을 지우지 않고, 연결된 예외 복구 이력을 추가합니다.
5-6. 출결 관리와 노쇼
- 수업 종료 후 원장은 예약 확정 회원의 출석 상태를
출석,지각 출석,노쇼,보류중 하나로 처리합니다. - 노쇼는 예약 취소와 별도로 기록합니다.
- 노쇼 확정 시 처리자와 처리 시각을 남깁니다.
- 회원별 노쇼 이력은 원장이 이후 예약 승인, 대기 운영, 회원권 횟수 판단에 참고할 수 있습니다.
- 노쇼에 대한 횟수 차감 또는 예외 복구도 회원권 이력으로 남깁니다.
6. 핵심 기능 흐름도: 취소 후 대기 제안부터 원장 승인까지
그림을 그리는 중…
기존 예약 회원의 취소로 빈자리가 생기면, 서버는 대기 순번상 다음 회원에게만 수락 링크를 보냅니다. 대기 회원이 수락하면 좌석은 승인 대기 상태로 보류되며, 원장이 승인해야 예약 확정과 회원권 횟수 차감이 함께 완료됩니다.
무응답인 경우에는 만료 작업이 대기 수락 만료 처리 후 다음 회원에게 순차 문자 안내를 실행합니다.
7. 화면과 서버 기능 연결
| 화면 | 주요 사용자 행동 | 서버 처리 | 완료 조건 |
|---|---|---|---|
| 회원용 휴대폰 인증 화면 | 휴대폰 번호 입력, 인증번호 입력 | 인증번호 발송·검증, 인증 세션 생성 | 인증 완료 후 원래 진입한 수업 또는 수락 화면으로 돌아간다. |
| 회원용 수업 목록·예약·대기 신청 화면 | 수업 선택, 예약 또는 대기 신청 | 정원·중복 예약·회원권 상태 확인, 예약 또는 대기 신청 생성 | 예약 확정 또는 대기 순번이 화면에 표시된다. |
| 회원용 내 예약·대기 순번·취소 화면 | 내 예약 확인, 취소 사유 입력, 취소 | 무료 취소 마감 시각 판정, 취소·회원권 처리 기록, 빈자리 생성 | 취소 결과와 횟수 처리 상태가 표시된다. |
| 문자 링크에서 여는 빈자리 수락 화면 | 수락 또는 거절 | 대기 제안 유효성 확인, 수락 시 좌석 보류·승인 대기 생성 | 처리 결과 또는 만료된 제안 상태가 표시된다. |
| 원장용 날짜별 수업·예약 인원·대기 현황 화면 | 수업별 예약·대기·수락 대기 확인 | 날짜별 수업, 정원, 예약 수, 대기 현황 조회 | 원장이 당일 처리할 수업과 대기 제안을 확인한다. |
| 원장용 수업 등록·수정 화면 | 수업 일정·정원·상태 등록 또는 변경 | 수업 생성·수정, 예약 가능 상태 변경 | 수업 날짜·시간·정원·상태가 저장된다. |
| 원장용 빈자리 수락 승인 화면 | 수락 건 승인 또는 반려 | 좌석 보류 확인, 예약 확정 또는 반려, 회원권 이력 생성 | 승인 시 예약 확정, 반려 시 다음 대기 회원 안내 준비 상태가 된다. |
| 원장용 회원별 회원권 횟수·취소 예외·노쇼 기록 화면 | 회원권 확인, 예외 복구, 노쇼 처리 | 회원권 이력·예외 승인·출석 상태 저장 | 변경 전후 값, 사유, 처리자, 처리 시각이 남는다. |
| 원장용 오류 수정·조정 이력 화면 | 잘못된 처리 수정 | 원본 이력 연결, 새 조정 이력 생성 | 원본 이력은 보존되고 수정 사유가 남는다. |
| 원장용 회원·회원권 초기 등록 화면 | 기존 회원·회원권 등록 | 회원, 휴대폰 번호, 회원권 생성 | 인증된 휴대폰 번호를 해당 회원 기록과 연결할 수 있다. |
8. 데이터 저장 구조
관계형 데이터 저장소를 사용합니다. 예약, 대기 순번, 회원권 횟수처럼 여러 기록이 함께 바뀌는 업무에 적합하기 때문입니다.
| 데이터 | 주요 저장 항목 | 연결 대상 |
|---|---|---|
| 기구 필라테스 스튜디오 | 스튜디오명, 운영 상태 | 회원, 수업 |
| 회원 | 이름, 휴대폰 번호, 인증 상태, 활성 상태, 내부 메모 | 회원권, 예약, 대기 신청 |
| 회원권 | 회원권명, 총 횟수, 잔여 횟수, 시작일, 만료일, 상태 | 회원, 회원권 이력, 예약 |
| 수업 | 날짜, 시작·종료 시각, 수업명, 정원, 예약·대기 가능 상태, 휴강 여부 | 예약, 대기 신청 |
| 예약 | 회원, 수업, 예약 상태, 확정·취소 시각, 무료 취소 마감 시각, 출석 상태 | 회원권, 취소, 회원권 이력 |
| 취소 | 취소 사유, 추가 내용, 취소 시각, 무료 취소 또는 12시간 이내 취소 여부 | 예약, 예외 승인 |
| 대기 신청 | 회원, 수업, 신청 시각, 등록 순번, 현재 상태 | 대기 제안 |
| 대기 제안 | 대상 대기 신청, 수락 링크, 발송 시각, 응답 마감 시각, 수락·거절 시각, 상태 | 문자 발송 기록, 빈자리 수락 |
| 빈자리 수락 | 수락 시각, 좌석 보류 상태 | 대기 제안, 원장 최종 예약 승인 |
| 원장 최종 예약 승인 | 승인 또는 반려 상태, 사유, 처리자, 처리 시각 | 빈자리 수락, 예약 |
| 회원권 이력 | 증감 횟수, 처리 전후 잔여 횟수, 유형, 사유, 처리자, 처리 시각 | 회원권, 예약, 원본 이력 |
| 출결 관리 기록 | 출석 상태, 노쇼 여부, 처리자, 처리 시각, 메모 | 예약, 회원권 이력 |
| 오류 수정 기록 | 수정 대상, 수정 전후 값, 사유, 처리자, 처리 시각 | 예약, 대기 신청, 회원권 이력 |
| 문자 발송 기록 | 메시지 ID, 발송 요청 시각, 발송 상태, 전달 상태, 실패 코드, 재시도 횟수 | 휴대폰 본인 확인, 대기 제안 |
회원권 이력 저장 원칙
회원권 잔여 횟수는 단순 숫자 하나만 수정하지 않습니다.
예를 들어 12시간 이내 취소를 원장이 예외 처리할 때는 다음처럼 기록합니다.
- 기존
12시간 이내 취소 차감이력은 유지합니다. - 원장이
예외 복구이력을 새로 만듭니다. - 예외 복구 이력은 어떤 기존 차감 기록을 복구했는지 원본 이력으로 연결합니다.
이 방식이면 원장은 나중에 차감·복구 이유를 확인할 수 있습니다.
9. 데이터 처리 안전 기준
9-1. 동시에 요청이 들어오는 경우
다음 처리는 하나의 처리 단위로 묶어 일부만 저장되는 상황을 막아야 합니다.
- 마지막 좌석 예약 확정
- 빈자리 수락
- 원장 최종 예약 승인
- 회원권 횟수 차감 또는 예외 복구
- 대기 수락 만료 후 다음 대기 회원 안내
예를 들어 마지막 좌석을 두 회원이 동시에 예약 요청해도 한 명만 예약 확정되어야 합니다.
9-2. 중복 요청 방지
통신 문제로 같은 요청이 여러 번 전송될 수 있으므로 다음 요청에는 요청별 고유값을 둡니다.
- 예약 요청
- 취소 요청
- 대기 신청 요청
- 빈자리 수락 요청
- 원장 승인·반려 요청
- 회원권 조정 요청
같은 고유값의 요청은 한 번만 처리하고, 이후 요청에는 이미 처리된 결과를 돌려줍니다.
9-3. 수락 링크 보호
빈자리 수락 링크는 다음 조건을 만족해야 합니다.
- 특정 회원과 특정 대기 제안에만 연결된다.
- 응답 마감 시각이 지나면 사용할 수 없다.
- 수락 또는 거절이 끝난 링크는 다시 처리할 수 없다.
- 다른 회원이 링크 주소를 알아도 수락할 수 없도록 휴대폰 본인 확인 또는 인증 세션을 확인한다.
- 만료되거나 처리 완료된 링크를 열면 현재 상태와 처리 시각을 보여준다.
10. 시간 계산 기준
모든 시간은 스튜디오가 운영되는 동일한 시간대 기준으로 계산합니다.
서버가 계산하고 화면에는 날짜가 포함된 절대 시각으로 표시합니다.
| 기준 | 계산 방식 |
|---|---|
| 무료 취소 마감 시각 | 수업 시작 시각에서 12시간 전 |
| 12시간 이내 취소 | 무료 취소 마감 시각 이후의 취소 |
| 대기 제안 응답 시간 | 수업 시작 2시간 전까지는 1시간 |
| 임박 수업 응답 시간 | 수업 시작 2시간 이내에는 10분 |
| 대기 수락 만료 | 대기 제안의 응답 마감 시각이 지나도록 수락·거절하지 않은 상태 |
회원에게는 “1시간 내 응답”처럼 상대 시간만 보여주지 않고, 예를 들어 2026년 8월 31일 18:20까지처럼 정확한 시각을 함께 보여줍니다.
11. 기술 구성 제안
| 구분 | 초기 선택 | 선택 이유 | 운영 시 주의점 |
|---|---|---|---|
| 웹 화면·서버 | Next.js | 회원용 모바일 웹과 원장용 웹, 서버 요청 처리를 한 프로젝트에서 관리할 수 있다. | 회원·원장 화면의 권한 검사를 서버에서도 다시 수행해야 한다. |
| 데이터 저장소 | PostgreSQL 등 관계형 데이터 저장소 | 예약, 정원, 대기 순번, 회원권 이력의 일관된 저장에 적합하다. | 예약 확정과 회원권 이력을 같은 처리 단위로 저장해야 한다. |
| 예약 작업 | 예약된 작업 실행 서비스 또는 작업 큐 | 응답 만료와 다음 대기 회원 안내를 정해진 시각에 실행할 수 있다. | 서버가 재시작되어도 미처리 대기 제안을 다시 확인해야 한다. |
| 문자 연동 | 인증번호·안내 문자 발송 서비스 | 휴대폰 본인 확인과 빈자리 수락 링크 전송에 필요하다. | 발송 요청 성공과 실제 전달 성공을 구분해 기록해야 한다. |
| 접속 관리 | 인증 세션 또는 서명된 접속 정보 | 별도 회원가입을 줄이면서 회원별 예약 정보 접근을 보호한다. | 인증 세션 만료, 휴대폰 번호 변경 재인증 기준을 정해야 한다. |
| 파일 저장 | 필요 시 별도 파일 저장소 | 예외 승인에 증빙 첨부를 허용하는 경우 사용한다. | 첫 개발에서 증빙 첨부를 넣을지는 확인 필요하다. |
12. 운영상 확인 필요 항목
다음 내용은 구현 전에 원장이 운영 기준을 확정해야 합니다.
| 항목 | 확인할 내용 |
|---|---|
| 승인 대기 좌석 보류 만료 | 회원이 수락한 뒤 원장이 일정 시간 승인하지 않으면 좌석 보류를 언제 해제할지 |
| 원장 반려 후 처리 | 승인 반려 즉시 다음 대기 회원에게 문자 안내할지, 원장이 확인 후 진행할지 |
| 문자 발송 실패 처리 | 문자 실패 시 같은 회원에게 재발송할지, 몇 회 재시도할지, 언제 다음 대기 회원에게 넘길지 |
| 회원권 부족·만료 회원 승인 기준 | 원장이 어떤 경우에 승인하고 어떤 경우에 반려할지 |
| 예약 시 회원권 횟수 차감 기준 | 일반 예약 확정 시 즉시 1회 차감하는 방식으로 구현할지 최종 확인 필요 |
| 휴대폰 본인 확인 수준 | 휴대폰 번호 소유 확인용 인증번호로 운영할지, 별도 법정 본인확인이 필요한지 |
| 문자 발신번호와 비용 | 사용할 문자 업체, 발신번호 등록, 인증번호 문자와 안내 문자 비용 |
| 개인정보 보관 | 휴대폰 번호, 취소 사유, 노쇼 기록, 문자 발송 기록의 보관 기간과 회원 안내 문구 |
| 원장 월 구독료 결제 | 스튜디오용 월 구독료 결제 기능은 이어서 만들 기능으로 분류되어 있어, 결제수단과 과금 시점을 별도로 확정해야 함 |
13. 첫 개발 완료 조건
첫 버전은 아래 조건을 모두 만족하면 실제 스튜디오 시험 운영이 가능한 상태로 봅니다.
회원 기능
- 회원이 공유된 예약 링크에서 휴대폰 본인 확인을 완료할 수 있다.
- 회원이 수업 목록에서 예약 가능한 수업을 예약할 수 있다.
- 회원이 마감 수업에 대기 신청하고 본인의 대기 순번을 확인할 수 있다.
- 회원이 모든 취소에서 취소 사유를 선택하고 추가 내용을 입력할 수 있다.
- 회원이 무료 취소 마감 시각과 12시간 이내 취소 여부를 확인할 수 있다.
- 회원이 문자 링크에서 빈자리를 수락 또는 거절할 수 있다.
- 회원이 만료되거나 이미 처리된 수락 링크를 열었을 때 현재 상태를 확인할 수 있다.
원장 기능
- 원장이 수업 날짜, 시간, 수업명, 정원, 예약·대기 가능 상태를 등록·수정할 수 있다.
- 원장이 날짜별 수업의 예약 인원, 대기 순번, 수락 대기, 승인 대기 상태를 확인할 수 있다.
- 원장이 대기 회원 수락 건을 승인 또는 반려할 수 있다.
- 원장이 회원권 잔여 횟수와 회원권 이력을 확인할 수 있다.
- 원장이 12시간 이내 취소의 차감 또는 미차감을 처리하고 이유를 남길 수 있다.
- 원장이 예외 복구를 원본 이력과 연결해 기록할 수 있다.
- 원장이 출석 상태와 노쇼를 기록할 수 있다.
- 원장이 중복 예약, 대기 순서 누락, 잘못된 회원권 처리 등의 오류를 원본 이력을 보존한 채 조정할 수 있다.
자동 처리
- 취소로 빈자리가 생기면 대기 순번상 다음 회원에게 문자 수락 링크가 발송된다.
- 수업 시작 2시간 전까지는 1시간, 이후에는 10분의 응답 시간이 적용된다.
- 회원이 응답하지 않으면 대기 수락 만료로 처리되고 다음 대기 회원에게 안내된다.
- 정원이 초과되지 않고 동일 회원의 동일 수업 중복 예약이 막힌다.
- 예약 확정, 원장 승인, 회원권 횟수 차감이 서로 어긋나지 않게 함께 저장된다.