필라테스 공정 대기 예약 기능 요구사항 문서
1. 제품 목표
정원 5~15명 규모의 기구 필라테스 스튜디오 원장이 회원 약 31~60명의 예약·취소·대기를 관리하는 웹서비스를 만든다.
회원은 카카오톡 등에 공유된 링크를 휴대폰에서 열어 다음 업무를 완료한다.
- 휴대폰 본인 확인
- 수업 예약과 취소
- 대기 신청과 대기 순번 확인
- 문자 수락 링크를 통한 빈자리 수락
원장은 다음 업무를 완료한다.
- 수업과 정원 관리
- 예약자와 대기 순번 확인
- 대기 제안과 응답 상태 확인
- 빈자리 수락에 대한 원장 최종 예약 승인
- 회원권 횟수 차감과 예외 승인
- 출결 관리와 노쇼 기록
- 오류 수정 기록 확인
2. 사용자 역할
| 역할 | 할 수 있는 일 |
|---|---|
| 회원 | 휴대폰 본인 확인, 수업 예약, 취소, 대기 신청, 대기 순번 확인, 빈자리 수락 |
| 원장 | 회원·회원권 등록, 수업·정원 관리, 예약·대기 현황 확인, 원장 최종 예약 승인, 회원권 이력 관리, 예외 승인, 출결 관리, 노쇼 기록, 오류 수정 |
강사와 프런트 직원의 별도 역할은 첫 개발 범위에서 확인되지 않았다.
3. 개발 범위
첫 개발 범위
- 원장과 회원의 접근 권한 구분
- 회원·회원권 초기 등록
- 휴대폰 본인 확인
- 수업 등록과 정원 관리
- 수업 예약·취소·대기 신청
- 대기 순번 표시
- 취소 자리 순차 문자 안내
- 빈자리 수락과 원장 최종 예약 승인
- 12시간 이내 취소의 횟수 차감·미차감 처리
- 예외 승인과 예외 복구
- 출결 관리와 노쇼 기록
- 처리 과정 시간순 확인
- 오류 수정 기록
이어서 만들 범위
- 스튜디오별 운영 정책 설정
- 노쇼 기록을 이용한 예약 승인 또는 운영 판단 지원
- 스튜디오용 월 구독료 결제
첫 개발 범위에 포함하지 않는 항목
사용자가 직접 제외한 범위다.
- 일반적인 스튜디오 관리 기능 전체
- 여러 업종으로의 확장
- 회원의 회원권 결제·충전
- 강사별 세부 운영 기능
- 모바일 앱 스토어용 앱
4. 확정된 운영 규칙
- 대기 순번은 대기 신청 시각과 변경 불가능한 등록 순번으로 정한다.
- 빈자리는 대기 순번이 빠른 회원부터 한 명씩 제안한다.
- 대기 제안 시점이 수업 시작 2시간 전까지라면 응답 시간을 1시간 제공한다.
- 대기 제안 시점이 수업 시작 2시간 이내라면 응답 시간을 10분 제공한다.
- 응답하지 않으면 대기 수락 만료로 처리하고 다음 대기 회원에게 제안한다.
- 회원이 빈자리를 수락하면 승인 대기로 전환한다.
- 원장이 승인해야 예약이 최종 확정된다.
- 회원권 횟수가 부족하거나 사용할 수 없는 상태여도 회원의 빈자리 수락은 받을 수 있다. 이후 원장이 예약 여부를 결정한다.
- 무료 취소 마감 시각은 수업 시작 12시간 전이다.
- 무료 취소 마감 시각까지 취소하면 회원권 횟수 미차감이 기본이다.
- 12시간 이내 취소는 원장이 차감 또는 미차감을 선택하고 이유를 기록한다.
- 모든 취소에서 회원은 취소 사유를 선택하고 필요하면 내용을 추가한다.
- 회원 화면에는 다른 회원의 개인정보를 표시하지 않고 현재 내 대기 순번과 전체 대기 인원만 표시한다.
- 회원의 회원권 결제는 서비스 밖에서 처리한다.
5. 구현 전 확인이 필요한 결정
| 항목 | 현재 내용 | 확인해야 할 결정 |
|---|---|---|
| 회원권 차감 시점 | 조사 노트에서는 예약 확정 시 1회 차감 후 무료 취소 시 복구하는 방식을 제안했다. | 예약 확정 시 차감할지, 출석 또는 12시간 이내 취소 시 차감할지 확정 필요 |
| 승인 대기 좌석의 보류 시간 | 회원 수락 후 원장 승인까지 좌석을 보류해야 한다. | 보류 만료 시간과 원장 미응답 시 다음 대기 회원에게 넘길지 확인 필요 |
| 수업 직전 응답 마감 | 수업 시작 5분 전에 제안하면 10분 응답 시간이 수업 시작 이후까지 이어질 수 있다. | 응답 마감을 수업 시작 시각으로 제한할지 확인 필요 |
| 문자 발송 실패 | 실패 상태와 재시도 기록은 필요하다. | 같은 회원에게 재발송할지, 원장이 처리할지, 다음 대기 회원에게 넘길지 확인 필요 |
| 일반 예약 시 회원권 부족 | 빈자리 수락의 처리 기준만 확정됐다. | 자리가 있는 수업을 직접 예약할 때 회원권이 부족한 경우의 처리 방식 확인 필요 |
| 부족한 회원권으로 승인 | 원장이 예약 여부를 결정할 수 있다. | 승인 시 잔여 횟수를 음수로 허용할지, 회원권 정보를 먼저 조정하게 할지 확인 필요 |
| 노쇼와 대기 우선순위 | 대기 신청 순서를 지켜야 하지만 노쇼를 대기 우선순위 판단에 반영한다는 내용도 있다. | 대기 순번은 항상 유지할지, 노쇼 회원에게 별도 제한을 둘지 확인 필요 |
| 원장 로그인 | 원장 역할과 접근 제한은 필요하다. | 원장의 로그인 방식과 계정 복구 방식 확인 필요 |
| 월 구독료 | 원장이 월 구독료를 결제한다. | 가격, 결제 주기, 결제 업체, 실패 시 이용 제한 기준 확인 필요 |
6. 기능 요구사항
계정·회원·수업
FR-001 원장 접근과 스튜디오 구분
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 원장이 원장용 웹페이지에 접근한다.
- 정상 흐름:
- 원장의 접근 권한을 확인한다.
- 원장이 관리할 기구 필라테스 스튜디오를 식별한다.
- 해당 스튜디오의 회원, 수업, 예약, 대기 신청, 회원권 이력만 표시한다.
- 예외 흐름:
- 인증되지 않았거나 권한이 없으면 원장용 데이터를 표시하지 않는다.
- 원장 로그인 방식은 확인 필요다.
- 완료 조건: 원장이 다른 스튜디오의 데이터에 접근하지 않고 자신의 운영 화면에 들어간다.
FR-002 회원·회원권 초기 등록
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 기존 회원을 서비스에 등록해야 한다.
- 정상 흐름:
- 원장이 회원 이름과 휴대폰 번호를 입력한다.
- 서비스 밖에서 결제한 회원권의 상품명, 총 횟수, 잔여 횟수, 시작일, 만료일을 입력한다.
- 회원과 회원권을 연결한다.
- 등록 처리자와 등록 시각을 기록한다.
- 예외 흐름:
- 같은 스튜디오에 같은 휴대폰 번호가 있으면 중복 후보를 보여주고 저장을 막는다.
- 잔여 횟수가 총 횟수보다 크거나 날짜가 잘못되면 저장하지 않는다.
- 기존 회원권 정보를 수정하면 변경 전후 값과 수정 이유를 남긴다.
- 완료 조건: 등록된 휴대폰 번호로 휴대폰 본인 확인을 한 회원이 자신의 회원권과 예약 정보에 연결된다.
FR-003 회원 휴대폰 본인 확인
- 단계: 첫 개발
- 주체: 회원
- 시작 조건: 회원이 카카오톡 등에 공유된 예약 링크 또는 문자 수락 링크를 연다.
- 정상 흐름:
- 회원이 휴대폰 번호를 입력한다.
- 시스템이 인증번호를 문자로 발송한다.
- 회원이 유효 시간 안에 인증번호를 입력한다.
- 등록된 회원의 휴대폰 번호와 연결한다.
- 인증 전 열었던 수업 목록, 내 예약 또는 빈자리 수락 화면으로 돌아간다.
- 예외 흐름:
- 등록되지 않은 번호라면 원장에게 등록을 요청하라는 안내를 표시한다.
- 인증번호가 틀렸거나 만료됐다면 실패 이유와 재전송 가능 여부를 표시한다.
- 반복 입력 실패와 과도한 재전송을 제한한다.
- 휴대폰 번호가 변경되면 다시 인증한다.
- 완료 조건: 인증된 회원만 자신의 예약·대기 정보와 빈자리 수락 기능을 사용할 수 있다.
FR-004 수업 등록과 정원 관리
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 원장이 새로운 수업을 만들거나 기존 수업을 수정한다.
- 정상 흐름:
- 수업명, 날짜, 시작·종료 시각을 입력한다.
- 정원을 5~15명 범위에서 입력한다.
- 예약 가능 여부와 대기 신청 가능 여부를 설정한다.
- 무료 취소 마감 시각을 수업 시작 12시간 전으로 계산한다.
- 수업을 저장하고 회원용 수업 목록에 반영한다.
- 예외 흐름:
- 종료 시각이 시작 시각보다 빠르면 저장하지 않는다.
- 정원을 현재 예약 확정 인원보다 작게 줄이려 하면 저장을 막고 이유를 표시한다.
- 이미 대기 제안이 진행 중이면 시간·정원 변경이 대기 제안에 미치는 영향을 원장에게 보여준다.
- 완료 조건: 회원과 원장 화면에 동일한 수업 날짜·시각·정원·신청 상태가 표시된다.
FR-005 회원용 수업 목록 조회
- 단계: 첫 개발
- 주체: 회원
- 시작 조건: 회원이 휴대폰 본인 확인을 완료하고 수업 목록에 들어간다.
- 정상 흐름:
- 날짜별 수업을 표시한다.
- 수업명, 시작·종료 시각, 정원, 예약 가능 여부, 대기 신청 가능 여부를 표시한다.
- 자리가 있으면 예약 행동을 제공한다.
- 만석이고 대기 신청이 가능하면 예상 대기 순번과 대기 신청 행동을 제공한다.
- 예외 흐름:
- 마감되거나 시작한 수업은 새로운 예약 행동을 제공하지 않는다.
- 예약과 대기 신청이 모두 중지된 수업은 그 상태와 이유를 표시한다.
- 완료 조건: 회원이 원하는 수업의 예약 가능 여부를 확인하고 예약 또는 대기 신청 단계로 이동한다.
FR-006 자리가 있는 수업 예약
- 단계: 첫 개발
- 주체: 회원
- 시작 조건: 회원이 자리가 있는 수업에서 예약을 선택한다.
- 정상 흐름:
- 회원의 동일 수업 예약 여부를 확인한다.
- 현재 예약 확정 인원이 정원보다 적은지 다시 확인한다.
- 회원권의 상태와 잔여 횟수를 확인한다.
- 예약을 확정하고 예약 시각을 기록한다.
- 회원권 차감 시점이 확정되면 해당 기준에 따라 회원권 이력을 생성한다.
- 예약 결과와 무료 취소 마감 시각을 회원에게 표시한다.
- 예외 흐름:
- 마지막 좌석이 다른 회원에게 먼저 확정됐다면 예약하지 않고 대기 신청을 안내한다.
- 같은 회원의 동일 수업 중복 예약을 막는다.
- 회원권이 부족하거나 만료된 일반 예약의 처리 방식은 확인 필요다.
- 완료 조건: 정원을 초과하지 않는 예약 한 건이 생성되고 회원과 원장 화면에 같은 상태가 표시된다.
대기 신청·취소
FR-007 대기 신청과 대기 순번 부여
- 단계: 첫 개발
- 주체: 회원
- 시작 조건: 수업이 만석이고 대기 신청이 가능하다.
- 정상 흐름:
- 회원이 대기 신청을 선택한다.
- 같은 수업에 기존 예약이나 대기 신청이 없는지 확인한다.
- 대기 신청 시각과 변경 불가능한 등록 순번을 저장한다.
- 두 값을 기준으로 대기 순번을 계산한다.
- 신청 후 현재 내 대기 순번과 전체 대기 인원을 표시한다.
- 예외 흐름:
- 이미 예약한 수업에는 대기 신청을 허용하지 않는다.
- 동일 회원의 같은 수업 중복 대기 신청을 막는다.
- 저장 직전에 자리가 생긴 경우 예약 전환 여부를 임의로 결정하지 않고 현재 수업 상태를 다시 표시한다.
- 완료 조건: 대기 신청이 한 번만 저장되고 회원과 원장 화면에 같은 대기 순번이 표시된다.
FR-008 내 예약·대기 현황 확인
- 단계: 첫 개발
- 주체: 회원
- 시작 조건: 회원이 내 예약·대기 화면을 연다.
- 정상 흐름:
- 예약 확정, 승인 대기, 취소된 예약을 구분해 표시한다.
- 대기 신청별 현재 내 대기 순번과 전체 대기 인원을 표시한다.
- 수락 대기 중이면 응답 마감의 날짜와 시각을 표시한다.
- 대기 수락 만료, 반려 등 처리가 끝난 상태와 처리 시각을 표시한다.
- 예외 흐름:
- 다른 회원의 이름, 휴대폰 번호, 신청 시각은 표시하지 않는다.
- 삭제되거나 찾을 수 없는 수업은 기록을 숨기지 않고 변경된 상태를 안내한다.
- 완료 조건: 회원이 자신의 예약 확정 여부와 대기 순번을 별도 문의 없이 확인한다.
FR-009 예약 취소와 취소 사유 제출
- 단계: 첫 개발
- 주체: 회원
- 시작 조건: 취소할 수 있는 예약이 존재한다.
- 정상 흐름:
- 무료 취소 마감 시각과 예상 회원권 처리 결과를 표시한다.
- 회원이 지각·건강·개인 사정 등의 취소 사유를 선택한다.
- 필요한 경우 상세 내용을 추가한다.
- 회원이 취소를 최종 확인한다.
- 취소 시각, 사유, 상세 내용, 무료 취소 또는 12시간 이내 취소 여부를 저장한다.
- 예약 좌석을 해제하고 빈자리 처리를 시작한다.
- 예외 흐름:
- 취소 사유를 선택하지 않으면 완료하지 않는다.
- 이미 취소됐거나 다른 요청에서 처리된 예약은 다시 취소하지 않는다.
- 승인 대기 예약의 취소 방식은 현재 상태에 맞춰 좌석 보류를 해제한다.
- 완료 조건: 예약이 한 번만 취소되고 회원권 처리 대상과 빈자리 발생이 기록된다.
FR-010 취소 횟수 차감과 예외 승인
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 회원의 예약 취소가 접수된다.
- 정상 흐름:
- 취소 시각과 무료 취소 마감 시각을 비교한다.
- 무료 취소 마감 시각까지의 취소는 미차감 결과를 적용한다.
- 12시간 이내 취소는 원장 처리 대상으로 표시한다.
- 원장이 차감 또는 미차감을 선택하고 이유를 입력한다.
- 기존 차감이 있다면 미차감 결정 시 원본 이력과 연결된 예외 복구를 생성한다.
- 처리자, 처리 시각, 사유, 변경 전후 잔여 횟수를 기록한다.
- 예외 흐름:
- 원본 이력이 필요한 예외 복구에 원본 연결이 없으면 저장하지 않는다.
- 같은 취소에 예외 복구가 중복 생성되지 않게 한다.
- 회원권 차감 시점이 확정되기 전까지 예약 확정 차감 방식은 가정으로 두지 않는다.
- 완료 조건: 취소 기록과 회원권 이력이 연결되고 잔여 횟수가 이력 합계와 일치한다.
빈자리 제안·문자·승인
FR-011 빈자리 발생과 대기 제안 생성
- 단계: 첫 개발
- 주체: 시스템
- 시작 조건: 예약 취소 등으로 수업의 예약 확정 인원이 정원보다 적어진다.
- 정상 흐름:
- 해당 수업의 유효한 대기 신청을 조회한다.
- 대기 신청 시각과 등록 순번이 가장 빠른 회원을 선택한다.
- 하나의 빈자리에 하나의 대기 제안만 생성한다.
- 대기 제안을 수락 대기로 설정한다.
- 응답 마감 시각을 계산한다.
- 순차 문자 안내를 요청한다.
- 예외 흐름:
- 대기 회원이 없으면 빈자리 상태만 원장 화면에 표시한다.
- 같은 회원에게 같은 수업의 대기 제안이 중복 생성되지 않게 한다.
- 승인 대기 좌석이 있으면 같은 좌석에 다음 대기 제안을 만들지 않는다.
- 완료 조건: 대기 순번을 건너뛰지 않은 대기 제안 한 건이 생성된다.
FR-012 순차 문자 안내와 발송 결과 관리
- 단계: 첫 개발
- 주체: 시스템
- 시작 조건: 수락 대기 상태의 대기 제안이 생성된다.
- 정상 흐름:
- 수업 날짜·시각, 수업명, 응답 마감 시각을 포함한 문자를 만든다.
- 해당 회원만 사용할 수 있는 만료 시간이 있는 수락 링크를 포함한다.
- 문자 발송 업체에 발송을 요청한다.
- 메시지 ID, 요청 시각, 발송 결과, 전달 상태를 저장한다.
- 회원과 원장 화면에 발송 상태를 반영한다.
- 예외 흐름:
- 발송 실패 시 실패 코드와 재시도 횟수를 저장한다.
- 같은 회원에게 재발송할지 다음 대기 회원에게 넘길지는 확인 필요다.
- 재시도 후에도 실패하면 최종 실패 상태로 표시하고 원장이 확인할 수 있게 한다.
- 완료 조건: 문자 발송 성공 여부를 대기 제안과 연결해 추적할 수 있다.
FR-013 응답 마감과 다음 대기 회원 안내
- 단계: 첫 개발
- 주체: 시스템
- 시작 조건: 대기 제안이 수락 대기 상태다.
- 정상 흐름:
- 제안 시점에 수업 시작까지 2시간 이상 남았다면 응답 마감을 1시간 후로 설정한다.
- 2시간 미만 남았다면 응답 마감을 10분 후로 설정한다.
- 응답 마감을 날짜가 포함된 절대 시각으로 저장하고 표시한다.
- 회원이 마감까지 응답하지 않으면 대기 수락 만료로 바꾼다.
- 다음 대기 순번 회원에게 새로운 대기 제안을 생성한다.
- 예외 흐름:
- 만료 처리와 회원의 수락 요청이 동시에 들어오면 먼저 확정된 한 처리만 적용한다.
- 서버 재시작 후에도 만료되지 않은 작업을 다시 찾아 실행한다.
- 계산된 마감이 수업 시작 이후가 되는 경우의 기준은 확인 필요다.
- 완료 조건: 무응답 회원의 제안이 종료되고 다음 회원에게 순서대로 안내된다.
FR-014 빈자리 수락과 거절
- 단계: 첫 개발
- 주체: 회원
- 시작 조건: 회원이 문자 수락 링크를 연다.
- 정상 흐름:
- 링크의 회원, 대기 제안, 만료 시각을 확인한다.
- 수업 정보와 응답 마감 시각을 표시한다.
- 회원이 빈자리 수락 또는 이번 제안 거절을 선택한다.
- 수락하면 빈자리 수락 기록을 만들고 승인 대기로 전환한다.
- 거절하면 해당 대기 제안을 종료하고 다음 대기 회원에게 제안한다.
- 예외 흐름:
- 만료된 링크는 수락할 수 없으며 대기 수락 만료 시각을 보여준다.
- 이미 처리된 링크는 현재 결과만 표시하고 다시 처리하지 않는다.
- 다른 회원이 링크를 열면 수락할 수 없다.
- 회원권 횟수가 부족하거나 만료돼도 수락 자체는 허용하고 원장 확인 대상으로 표시한다.
- 완료 조건: 회원의 응답이 한 번만 저장되고 수락은 승인 대기, 거절은 다음 안내로 연결된다.
FR-015 원장 최종 예약 승인과 좌석 보류
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 회원이 빈자리를 수락해 승인 대기 상태가 된다.
- 정상 흐름:
- 해당 좌석을 임시 보류한다.
- 다음 대기 회원 안내를 멈춘다.
- 원장에게 승인 대기 건이 있음을 표시한다.
- 회원 정보, 회원권 잔여 횟수, 만료일, 최근 취소 예외와 노쇼, 응답 시각을 보여준다.
- 원장이 승인 또는 반려를 선택한다.
- 승인하면 정원을 다시 확인하고 예약을 확정한다.
- 반려하면 사유를 기록하고 좌석 보류를 해제한 뒤 다음 대기 회원에게 제안한다.
- 예외 흐름:
- 승인 직전에 정원이 찼다면 승인을 완료하지 않고 오류 상태로 표시한다.
- 회원권 횟수가 부족하거나 사용할 수 없으면 원장이 예약 여부를 결정하고 이유를 기록한다.
- 부족한 회원권으로 승인할 때의 회원권 처리 방식은 확인 필요다.
- 원장이 응답하지 않을 때의 좌석 보류 만료 기준은 확인 필요다.
- 완료 조건: 하나의 빈자리에 예약 한 건만 확정되고 대기 제안, 원장 승인, 예약, 회원권 이력이 서로 연결된다.
원장 운영·회원권·출결
FR-016 수업별 예약·대기 처리 과정 확인
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 원장이 날짜별 수업 또는 특정 수업을 선택한다.
- 정상 흐름:
- 수업의 정원, 예약 확정 인원, 빈자리, 대기 인원을 표시한다.
- 예약자와 대기 순번을 표시한다.
- 취소 사유, 빈자리 발생, 대기 제안 생성, 문자 발송, 회원 응답, 승인·반려를 시간순으로 표시한다.
- 수락 대기와 승인 대기의 마감 또는 경과 시간을 표시한다.
- 관련 회원과 회원권 기록으로 이동할 수 있게 한다.
- 예외 흐름:
- 문자 발송 실패, 순번 누락, 중복 예약 등 이상 상태를 숨기지 않고 표시한다.
- 삭제된 원본 기록이 있으면 오류로 표시한다.
- 완료 조건: 원장이 단톡방이나 수첩을 확인하지 않고 수업별 처리 경과를 설명할 수 있다.
FR-017 회원권과 회원권 이력 관리
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 예약, 취소, 예외 승인, 노쇼 또는 수동 조정으로 회원권 횟수가 바뀐다.
- 정상 흐름:
- 변동 유형과 증감 횟수를 기록한다.
- 변경 전후 잔여 횟수를 계산한다.
- 관련 회원, 회원권, 수업, 예약, 취소 또는 출석 상태를 연결한다.
- 자동 처리인지 원장 처리인지 기록한다.
- 복구나 수정은 원본 이력을 연결한 새로운 회원권 이력으로 추가한다.
- 예외 흐름:
- 기존 회원권 이력을 직접 수정하거나 삭제하지 않는다.
- 현재 잔여 횟수와 회원권 이력 합계가 다르면 오류로 표시한다.
- 동일한 요청으로 회원권 이력이 두 번 생성되지 않게 한다.
- 완료 조건: 모든 횟수 변경의 원인, 처리자, 처리 시각, 변경 전후 값을 확인할 수 있다.
FR-018 출결 관리와 노쇼 기록
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 수업이 시작됐거나 종료돼 실제 참여 결과를 기록할 수 있다.
- 정상 흐름:
- 예약 확정 회원 목록을 표시한다.
- 회원별 출석 상태를 출석, 지각 출석, 노쇼, 보류 중 하나로 기록한다.
- 노쇼에는 확인 시각, 처리자, 내부 메모를 기록한다.
- 회원별 노쇼 횟수와 최근 기록에 반영한다.
- 예약 확정 시 이미 차감됐다면 노쇼로 인한 중복 횟수 차감을 만들지 않는다.
- 노쇼 예외를 승인하면 원본 이력에 연결된 예외 복구를 추가한다.
- 예외 흐름:
- 수업 전에는 노쇼를 확정하지 않는다.
- 판단이 어려우면 보류로 저장한다.
- 노쇼를 다른 출석 상태로 수정하면 오류 수정 기록과 변경 이유를 남긴다.
- 완료 조건: 수업별 출석 상태와 회원별 노쇼 기록이 연결되고 중복 차감이 발생하지 않는다.
FR-019 회원별 이용·예외·노쇼 기록 확인
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 원장이 특정 회원을 선택한다.
- 정상 흐름:
- 회원의 회원권 총 횟수, 잔여 횟수, 시작일, 만료일을 표시한다.
- 예약, 취소, 대기 신청, 빈자리 수락, 출석 상태를 시간순으로 표시한다.
- 12시간 이내 취소와 예외 승인 기록을 표시한다.
- 회원별 노쇼 횟수와 최근 노쇼를 표시한다.
- 원장이 승인 판단 시 최근 기록을 확인할 수 있게 한다.
- 예외 흐름:
- 노쇼 기록을 자동으로 대기 순번에 반영할지는 확인 필요다.
- 노쇼 때문에 대기 신청 시각과 등록 순번을 임의로 변경하지 않는다.
- 완료 조건: 원장이 회원별 운영 이력을 한곳에서 확인하고 승인·예외 판단의 근거로 사용할 수 있다.
FR-020 오류 수정과 조정 이력
- 단계: 첫 개발
- 주체: 원장
- 시작 조건: 중복 예약, 대기 순서 누락, 잘못된 취소·노쇼·회원권 처리가 발견된다.
- 정상 흐름:
- 원장이 오류 유형과 대상 기록을 선택한다.
- 수정 전 값을 표시한다.
- 수정 내용과 수정 사유를 입력한다.
- 원본 기록을 유지한 채 새로운 오류 수정 기록이나 조정 이력을 추가한다.
- 처리자, 처리 시각, 수정 전후 값, 원본 이력을 저장한다.
- 예외 흐름:
- 수정 사유가 없으면 완료하지 않는다.
- 이미 취소되거나 복구된 회원권 이력을 다시 복구하려 하면 경고하고 중복 처리를 막는다.
- 수정으로 정원을 초과하거나 회원권 이력이 어긋나면 저장하지 않는다.
- 완료 조건: 원본을 삭제하지 않고 무엇을 왜 수정했는지 다시 확인할 수 있다.
FR-021 휴강 처리
- 단계: 첫 개발 포함 여부 확인 필요
- 주체: 원장
- 시작 조건: 스튜디오 사정으로 수업이 열리지 않는다.
- 정상 흐름:
- 원장이 수업을 휴강으로 변경하고 이유를 입력한다.
- 해당 수업의 예약, 수락 대기, 승인 대기, 대기 신청을 확인한다.
- 진행 중인 대기 제안과 좌석 보류를 종료한다.
- 기존 횟수 차감이 있다면 원본 이력에 연결해 복구한다.
- 예외 흐름:
- 이미 완료된 수업은 일반 휴강으로 변경하지 않고 오류 수정 절차를 사용한다.
- 회원 안내 방식은 확인 필요다.
- 완료 조건: 휴강 수업에 새로운 예약이나 대기 제안이 발생하지 않고 회원권 처리 결과가 일치한다.
이후 기능
FR-022 운영 정책 설정
- 단계: 이어서 만들 기능
- 주체: 원장
- 시작 조건: 스튜디오별로 기본 운영 기준을 변경해야 한다.
- 정상 흐름:
- 무료 취소 마감 기준을 설정한다.
- 대기 제안 응답 시간과 다음 대기 회원 처리 기준을 설정한다.
- 노쇼와 예외 승인 기준을 설정한다.
- 정책 변경 시각과 변경자를 기록한다.
- 기존 수업에는 기존 기준을 유지하고 변경 이후 생성된 수업부터 적용할지 선택한다.
- 예외 흐름:
- 첫 기본값은 무료 취소 12시간, 2시간 전까지 1시간 응답, 이후 10분 응답이다.
- 정책 변경이 이미 발송된 대기 제안의 마감을 소급 변경하지 않게 한다.
- 완료 조건: 각 처리 기록에서 어떤 운영 정책이 적용됐는지 확인할 수 있다.
FR-023 스튜디오용 월 구독료 결제
- 단계: 이어서 만들 기능
- 주체: 원장
- 시작 조건: 원장이 유료 이용을 시작하거나 갱신한다.
- 정상 흐름:
- 스튜디오용 월 구독 상품과 결제 금액을 표시한다.
- 원장이 결제를 완료한다.
- 구독 시작일, 다음 결제일, 결제 상태를 기록한다.
- 원장이 결제 내역과 현재 구독 상태를 확인한다.
- 예외 흐름:
- 결제 실패, 재결제, 해지, 환불, 이용 제한 기준은 확인 필요다.
- 회원의 회원권 결제·충전 기능과 섞이지 않게 한다.
- 완료 조건: 원장의 스튜디오용 구독 결제만 기록되고 회원 결제 기능은 생성되지 않는다.
7. 화면 요구사항
UIR-001 회원 화면
- 사용자: 회원
- 목적: 자신의 대기 신청 순서와 현재 내 대기 순번을 확인한다.
- 진입: 회원용 내 예약·대기 순번·취소 화면
- 핵심 표시: 수업 정보, 대기 신청 시각, 현재 내 대기 순번, 전체 대기 인원, 현재 상태
- 예외 상태: 대기 수락 만료, 승인 대기, 반려, 대기 종료
- 완료 조건: 다른 회원의 개인정보를 보지 않고 자신의 순번을 확인한다.
UIR-002 수업별 화면
- 사용자: 원장
- 목적: 수업의 취소, 대기 제안, 회원 응답, 최종 처리 상태를 시간순으로 확인한다.
- 진입: 원장용 날짜별 수업·예약 인원·대기 현황 화면
- 핵심 표시: 정원, 예약자, 대기 순번, 빈자리, 문자 상태, 응답 마감, 승인 상태, 시간순 이력
- 핵심 행동: 승인 화면 이동, 회원 기록 이동, 오류 수정 화면 이동
- 완료 조건: 특정 빈자리가 어떤 회원에게 어떤 순서로 제안됐는지 확인한다.
UIR-003 회원용 휴대폰 인증 화면
- 사용자: 회원
- 목적: 휴대폰 번호와 인증번호로 휴대폰 본인 확인을 한다.
- 진입: 카카오톡 예약 링크, 내 예약 링크, 문자 수락 링크
- 핵심 입력: 휴대폰 번호, 인증번호
- 예외 상태: 미등록 번호, 인증번호 오류·만료, 재전송 제한, 입력 횟수 초과
- 완료 조건: 인증 성공 후 원래 요청한 화면으로 이동한다.
UIR-004 회원용 수업 목록·예약·대기 신청 화면
- 사용자: 회원
- 목적: 수업을 고르고 예약하거나 대기 신청한다.
- 진입: 회원용 휴대폰 인증 화면, 회원용 내 예약·대기 순번·취소 화면
- 핵심 표시: 날짜, 수업명, 시작·종료 시각, 정원, 예약·대기 가능 상태
- 핵심 행동: 예약, 대기 신청, 내 예약 보기
- 완료 조건: 예약 확정 또는 대기 신청 완료 결과와 다음 행동을 확인한다.
UIR-005 회원용 내 예약·대기 순번·취소 화면
- 사용자: 회원
- 목적: 본인의 예약, 승인 대기, 대기 순번을 확인하고 예약을 취소한다.
- 진입: 회원용 수업 목록·예약·대기 신청 화면
- 핵심 표시: 예약 상태, 대기 순번, 전체 대기 인원, 무료 취소 마감 시각, 회원권 처리 상태
- 핵심 행동: 예약 취소, 취소 사유 선택, 상세 내용 입력, 회원 화면 이동
- 완료 조건: 회원이 취소 결과와 횟수 처리 상태를 확인한다.
UIR-006 문자 링크에서 여는 빈자리 수락 화면
- 사용자: 회원
- 목적: 제안받은 빈자리를 수락하거나 거절한다.
- 진입: 문자 수락 링크
- 핵심 표시: 수업 정보, 응답 마감 절대 시각, 회원권 잔여 횟수, 승인 대기 안내
- 핵심 행동: 빈자리 수락, 이번 제안 거절
- 예외 상태: 만료된 링크, 이미 처리된 링크, 다른 회원의 링크, 인증 필요
- 완료 조건: 수락은 승인 대기로, 거절은 다음 대기 회원 안내로 연결된다.
UIR-007 원장용 날짜별 수업·예약 인원·대기 현황 화면
- 사용자: 원장
- 목적: 날짜별 수업과 예약 인원, 대기 현황을 관리한다.
- 진입: 원장용 수업 등록·수정, 빈자리 수락 승인, 오류 수정 화면
- 핵심 표시: 날짜별 수업, 정원 대비 예약 인원, 대기 인원, 수락 대기, 승인 대기, 문자 실패
- 핵심 행동: 수업 등록·수정, 수업별 화면 이동, 승인 처리, 회원 기록 이동
- 완료 조건: 원장이 오늘 처리해야 할 수업과 승인 대기 건을 한눈에 확인한다.
UIR-008 원장용 회원별 회원권 횟수·취소 예외·노쇼 기록 화면
- 사용자: 원장
- 목적: 회원별 회원권, 취소 예외, 노쇼 기록을 확인하고 처리한다.
- 진입: 원장용 날짜별 현황, 오류 수정 화면, 회원·회원권 초기 등록 화면
- 핵심 표시: 회원권 총 횟수·잔여 횟수·만료일, 회원권 이력, 취소, 예외 승인, 노쇼
- 핵심 행동: 예외 승인, 예외 복구, 출석 상태 수정, 오류 수정, 회원권 등록·조정
- 완료 조건: 회원별 횟수 변경과 운영 판단의 근거를 확인한다.
UIR-009 원장용 수업 등록·수정 화면
- 사용자: 원장
- 목적: 수업 날짜·시각·수업명·정원·신청 상태를 관리한다.
- 진입: 원장용 날짜별 수업·예약 인원·대기 현황 화면
- 핵심 입력: 수업명, 날짜, 시작·종료 시각, 정원 5~15명, 예약·대기 가능 상태
- 예외 상태: 잘못된 시각, 정원 범위 오류, 현재 예약 인원보다 작은 정원
- 완료 조건: 저장한 수업 정보가 회원과 원장 화면에 동일하게 반영된다.
UIR-010 원장용 빈자리 수락 승인 화면
- 사용자: 원장
- 목적: 빈자리 수락 회원의 예약을 최종 승인하거나 반려한다.
- 진입: 원장용 날짜별 현황, 수업별 화면, 원장 확인 링크
- 핵심 표시: 회원, 수업, 수락 시각, 회원권 잔여 횟수·만료일, 최근 예외·노쇼, 승인 대기 좌석
- 핵심 행동: 승인, 반려, 사유 입력, 회원 기록 이동
- 완료 조건: 승인 또는 반려 결과가 예약, 대기 제안, 좌석, 회원권 이력에 함께 반영된다.
UIR-011 원장용 오류 수정·조정 이력 화면
- 사용자: 원장
- 목적: 잘못된 처리를 원본 기록을 보존한 채 수정한다.
- 진입: 수업별 화면, 회원별 기록 화면, 날짜별 현황 화면
- 핵심 표시: 오류 유형, 원본 이력, 수정 전후 값, 연결 수업·회원·예약
- 핵심 입력: 수정 내용, 수정 사유
- 완료 조건: 원본을 삭제하지 않고 새로운 오류 수정 기록이 추가된다.
UIR-012 원장용 회원·회원권 초기 등록 화면
- 사용자: 원장
- 목적: 기존 회원과 서비스 밖에서 결제한 회원권 정보를 등록한다.
- 진입: 원장용 회원별 회원권 횟수·취소 예외·노쇼 기록 화면
- 핵심 입력: 이름, 휴대폰 번호, 회원권 상품명, 총 횟수, 잔여 횟수, 시작일, 만료일
- 예외 상태: 중복 번호, 잘못된 날짜, 총 횟수와 잔여 횟수 불일치
- 완료 조건: 인증된 휴대폰 번호가 정확한 회원과 회원권에 연결된다.
8. 비기능 요구사항
NFR-001 웹 환경과 모바일 사용성
- 서비스는 Next.js 기반 웹으로 구현한다.
- 회원 화면은 휴대폰 브라우저를 우선으로 설계한다.
- 별도 앱 설치 없이 카카오톡 또는 문자 링크에서 사용할 수 있어야 한다.
- 인증 후 처음 열었던 화면의 주소를 보존하고 해당 화면으로 복귀해야 한다.
- 원장 화면은 휴대폰과 데스크톱 웹에서 핵심 업무를 처리할 수 있어야 한다.
NFR-002 정원 초과와 중복 처리 방지
- 마지막 좌석 예약, 빈자리 수락, 원장 승인, 회원권 횟수 변경은 일부만 성공하지 않도록 하나의 처리 단위로 묶는다.
- 동시에 여러 요청이 들어와도 예약 확정 인원이 정원을 넘지 않아야 한다.
- 동일 회원의 동일 수업 중복 예약과 중복 대기 신청을 막아야 한다.
- 하나의 빈자리에 둘 이상의 예약이 승인되지 않아야 한다.
- 동일 요청이 반복 전송돼도 한 번만 처리하도록 요청별 고유값을 사용한다.
NFR-003 예약 작업과 장애 복구
- 대기 수락 만료와 다음 순차 문자 안내는 예약된 시간에 실행되는 백그라운드 작업으로 처리한다.
- 서버가 재시작돼도 실행되지 않은 만료·발송 작업을 다시 찾을 수 있어야 한다.
- 처리 중 실패한 작업은 실패 이유와 재시도 횟수를 남겨야 한다.
- 동일 작업의 재실행으로 중복 문자나 중복 대기 제안이 생성되지 않아야 한다.
NFR-004 날짜·시각 계산
- 수업 시작 시각, 무료 취소 마감 시각, 2시간 기준, 1시간·10분 응답 시간을 동일한 스튜디오 시간대로 계산한다.
- 데이터에는 시간대 정보를 포함해 저장한다.
- 회원과 원장 화면에는 날짜를 포함한 절대 시각을 표시한다.
- 운영 중 스튜디오 시간대가 변경되더라도 기존 처리 이력의 시각이 바뀌지 않아야 한다.
NFR-005 휴대폰 본인 확인 보안
- 인증번호에는 만료 시간이 있어야 한다.
- 인증번호 재전송과 입력 실패 횟수를 제한해야 한다.
- 인증 성공 전에는 회원의 예약·회원권·대기 정보를 표시하지 않는다.
- 인증 세션 유지 기간과 재인증 기준은 구현 전에 확정해야 한다.
- 휴대폰 번호 변경 시 기존 인증을 그대로 사용하지 않는다.
NFR-006 빈자리 수락 링크 보안
- 수락 링크는 회원과 대기 제안을 식별할 수 있어야 한다.
- 링크에는 만료 시간이 있어야 한다.
- 다른 회원이 링크 주소를 알아도 수락할 수 없어야 한다.
- 만료되거나 처리된 링크는 현재 상태와 처리 시각만 보여주고 같은 처리를 다시 실행하지 않아야 한다.
- 링크 원문이나 인증 정보가 원장 화면의 일반 이력에 노출되지 않아야 한다.
NFR-007 개인정보와 접근 권한
- 회원 화면에는 다른 회원의 이름과 휴대폰 번호를 표시하지 않는다.
- 원장 화면의 휴대폰 번호는 기본적으로 필요한 범위만 표시한다.
- 스튜디오별 회원, 수업, 예약, 대기 신청, 회원권 이력을 분리한다.
- 회원은 자신의 기록만 조회하고 원장은 자신이 관리하는 스튜디오 기록만 조회해야 한다.
- 민감한 변경 작업은 원장 권한을 확인한 뒤 실행한다.
NFR-008 원본 이력 보존
- 회원권 이력, 예외 승인, 노쇼, 오류 수정 기록은 기존 기록을 덮어쓰거나 삭제하는 방식으로 수정하지 않는다.
- 복구와 조정은 원본 이력을 가리키는 새로운 기록으로 추가한다.
- 변경 작업에는 처리자, 처리 시각, 사유, 수정 전후 값을 남긴다.
- 삭제가 필요한 경우에도 운영 화면에서 보이지 않게 하는 처리와 실제 기록 삭제를 구분해야 한다.
NFR-009 회원권 데이터 일치
- 회원권 잔여 횟수는 회원권 이력의 합계와 일치해야 한다.
- 현재 잔여 횟수를 별도 저장하는 경우 이력 합계와 자동 비교할 수 있어야 한다.
- 불일치가 발견되면 원장에게 오류로 표시하고 오류 수정 절차로 연결한다.
- 예약·취소·예외 처리 실패 시 회원권 이력만 단독으로 남지 않아야 한다.
NFR-010 문자 발송 추적
- 인증번호 문자와 순차 문자 안내를 구분해 기록한다.
- 문자별 메시지 ID, 발송 요청 시각, 전달 상태, 실패 코드, 재시도 횟수를 저장한다.
- 문자 발송 업체의 요청 성공과 실제 전달 성공을 다른 상태로 관리한다.
- 원장이 최종 실패 건을 조회할 수 있어야 한다.
NFR-011 접근성
- 모든 입력 항목에 항목명을 제공한다.
- 오류가 발생한 입력 항목과 해결 방법을 함께 표시한다.
- 색상만으로 예약, 대기, 만료, 오류 상태를 구분하지 않는다.
- 키보드만으로 원장용 핵심 기능을 사용할 수 있어야 한다.
- 응답 마감과 무료 취소 마감은 남은 시간만 표시하지 않고 날짜와 시각을 함께 표시한다.
NFR-012 운영 기록 조회 성능
- 첫 시험 규모인 회원 약 50명과 수업당 정원 최대 15명에서 수업 목록, 날짜별 현황, 회원별 이력 조회가 운영을 방해하지 않아야 한다.
- 긴 회원권 이력과 처리 과정은 날짜 범위 또는 나누어 보기 방식으로 조회할 수 있어야 한다.
- 문자 발송 업체의 응답이 늦어도 예약 취소 기록 자체가 유실되지 않아야 한다.
- 구체적인 화면 응답 시간 목표는 시험 운영 환경을 측정한 뒤 확정한다.
9. 핵심 검수 시나리오
시나리오 1: 만석 수업 대기 신청
- 정원 8명 수업에 예약 8명이 있다.
- 회원이 대기 신청한다.
- 대기 신청 시각과 등록 순번이 저장된다.
- 회원 화면에 현재 내 대기 순번이 표시된다.
- 다른 회원의 개인정보는 보이지 않는다.
통과 조건: 회원과 원장 화면의 대기 순번이 같다.
시나리오 2: 수업 3시간 전 취소
- 예약 회원이 수업 시작 3시간 전에 취소한다.
- 회원이 취소 사유를 선택한다.
- 첫 번째 대기 회원에게 문자 수락 링크가 발송된다.
- 응답 마감은 발송 시각부터 1시간 후로 설정된다.
- 회원이 응답하지 않으면 대기 수락 만료가 된다.
- 다음 대기 회원에게 문자가 발송된다.
통과 조건: 대기 신청 순번을 건너뛰지 않고 한 명씩 안내된다.
시나리오 3: 수업 90분 전 취소
- 예약 회원이 수업 시작 90분 전에 취소한다.
- 첫 번째 대기 회원에게 대기 제안을 보낸다.
- 응답 마감은 발송 시각부터 10분 후다.
- 만료 후 다음 대기 회원에게 안내한다.
통과 조건: 2시간 기준이 정확히 적용되고 화면에 절대 시각이 표시된다.
시나리오 4: 회원권 부족 회원의 빈자리 수락
- 잔여 횟수가 부족한 회원이 빈자리 수락 링크를 연다.
- 회원은 빈자리를 수락할 수 있다.
- 상태가 승인 대기로 바뀐다.
- 좌석이 보류되고 다음 대기 회원 안내가 멈춘다.
- 원장이 회원권 상태를 보고 승인 또는 반려한다.
통과 조건: 회원 수락만으로 예약이 확정되지 않고 원장 결정이 기록된다.
시나리오 5: 12시간 이내 취소 예외
- 회원이 무료 취소 마감 시각 이후 취소한다.
- 건강 사유와 상세 내용을 제출한다.
- 원장 화면에 12시간 이내 취소 처리 대상으로 표시된다.
- 원장이 미차감과 이유를 기록한다.
- 기존 차감이 있다면 원본 이력에 연결된 예외 복구가 생성된다.
통과 조건: 기존 기록은 남아 있고 처리 이유와 변경 전후 횟수를 확인할 수 있다.
시나리오 6: 동시 마지막 좌석 예약
- 두 회원이 마지막 한 자리를 거의 동시에 예약한다.
- 한 회원의 예약만 확정된다.
- 다른 회원에게는 만석 상태와 대기 신청 행동을 표시한다.
통과 조건: 예약 확정 인원이 정원을 넘지 않는다.
시나리오 7: 같은 수락 링크 반복 실행
- 회원이 빈자리 수락 버튼을 여러 번 누른다.
- 네트워크 재전송으로 같은 요청이 반복된다.
- 빈자리 수락과 승인 대기 기록은 한 번만 생성된다.
통과 조건: 중복 승인 대기, 중복 예약, 중복 횟수 차감이 발생하지 않는다.
시나리오 8: 노쇼 기록
- 수업 종료 후 원장이 예약 회원을 노쇼로 기록한다.
- 회원별 노쇼 횟수와 최근 기록에 반영된다.
- 예약 확정 시 이미 횟수를 차감했다면 추가 차감하지 않는다.
- 예외 승인 시 원본 이력과 연결된 예외 복구를 추가한다.
통과 조건: 노쇼 기록과 회원권 이력이 연결되고 중복 차감이 없다.
10. 연동·운영 참고
- 휴대폰 본인 확인은 휴대폰 번호 소유 여부를 확인하는 절차다. 법정 의미의 본인확인과 같은 수준이 필요한지는 별도로 확인해야 한다.
- 문자 발신번호 등록, 인증번호 문자와 안내 문자 비용, 전달 결과 확인 방식은 실제 문자 발송 업체를 기준으로 확정해야 한다.
- 회원 연락처, 예약·취소·노쇼 기록의 수집 목적, 보관 기간, 회원 안내 문구를 실제 운영 기준에 맞게 정해야 한다.
- 원장 로그인, 문자 발송, 월 구독료 결제에 사용할 업체와 비용은 확인 필요다.