기획 목적 · 접근 방식
본 기획서는 볼토피아를 어떻게 짓고 어떤 순서로 발전시킬지를 정의합니다. 요구사항정의서가 "무엇을"이라면, 본 문서는 "어떻게 · 언제"입니다.
- 문제 프레이밍 — 회원은 대회 접수 · 클럽 활동 · 레인/락커 예약 · 성적 확인을 하나의 서비스로, 관리자는 하나의 화면으로 시설 전체를 운영
- 원칙 1 — 회원 데이터 보호
- 원칙 2 — 대회 운영의 공정성 · 안정성(접수 · 순위 산정 · 성적 처리가 외부 요인이나 장애로 흔들리지 않음)
- 원칙 충돌 시 — 개발 속도 등 다른 목표보다 항상 위 두 원칙을 우선
- 계약 범위(확정) — §07의 8개 운영 영역 전체가 진승과의 계약 딜리버리 대상
전체 아키텍처 개요
볼토피아는 관리자 웹 · 모바일 앱 · API 3계층으로 구성됩니다. 관리자 웹과 모바일 앱은 하나의 API를 통해서만 데이터에 접근하며, 진승 공인구 연동은 API 계층에서 표준화된 방식으로 처리됩니다.
개념 구성도 — 실제 인프라 구성이 아닙니다.
| 계층 | 역할 |
|---|---|
| 관리자 웹 | 시설 운영자가 대회 · 회원 · 레인/락커 · 게시판 · 결제 내역을 관리하는 화면 |
| 모바일 앱 | 회원이 접수 · 예약 · 성적 확인 · 소셜 · 알림 기능을 이용하는 화면 |
| 진승 JS-HOME 연동 | 대회 참가자가 등록한 볼의 시리얼을 진승 공인구 원장과 실시간 대조하는 유일한 외부 연동점 |
회원 · 등급 모델 개요
회원 등급 정책은 다음과 같습니다.
| 등급 | 산정 기준 | 강등 정책 |
|---|---|---|
| GUEST / MEMBER | 진승 ID 로그인 / 볼토피아 가입 | 해당 없음 |
| REGULAR(정회원) | 최근 1년 게임 참여 수 기준 또는 유효 락커 보유 | 게임 수 기준 승급은 강등 없음. 락커만으로 승급한 경우 락커 만료+미연장+게임 수 미달 시에만 자동 강등 |
| STORM(최고 등급) | 최근 1년 게임 참여 수 기준 | 자동 강등 없음 — 관리자 수동 조정만 |
확정
STORM 등급은 자동으로 강등되지 않으며, 관리자 수동 변경으로만 하향됩니다. 이는 확정된 정책입니다.
- 등급 문구 편집 — 승급 조건 · 혜택 · 소개 문구는 관리자가 직접 편집, 앱에 즉시 반영(앱 업데이트 불필요)
- 단일 로그인 세션 — 계정당 동시 세션 1개만 허용, 새 로그인 시 기존 기기 강제 로그아웃 + 안내
- 진승 인증 연동(확정) — 로그인은 현재 진승 인증 시스템 경유. 향후 진승 통합 인증(JS-AUTH/SSO) 완료 시 인증 권위가 그쪽으로 전환될 예정. 장애 시 자동 재시도 후 원인을 알 수 있는 안내로 대응
대회 · 리그 운영 모델 개요
접수 · 대기열
- 개인 / 클럽(팀) / 프로암 세 가지 접수 유형을 공통 흐름으로 처리
- 정원이 차면 대기열로 전환, 취소 발생 시 대기 1순위 자동 승격 + 관련자(팀 대표 · 클럽 운영자 · 관리자) 동시 알림
- 경기 당일 불참 시 상대측 자동 부전승 처리(승점만 반영, 핀수 · 게임 수 불변)
성적 제출 · 확정 워크플로우 (확정 — 대회 유형별 2가지 모델)
| 대회 유형 | 모델 | 내용 |
|---|---|---|
| 리그 · BMT(미니대회) | 2단계(제출 → 확정) | 선수 본인 제출 → 관리자 확정 / 정정 / 반려. 확정 전까지 순위 미반영 |
| 일반(GAME) 대회 | 단일 단계(직접 입력) | 관리자가 성적을 직접 입력 — 설계상 별도 모델이며 성숙도 차이가 아님 |
| 단계(리그 · BMT) | 주체 | 내용 |
|---|---|---|
| 1. 제출 | 선수 본인 | 경기 성적 입력 · 제출. 순위표에는 아직 미반영 |
| 2. 검수 | 관리자 | 확정 · 정정 · 반려 중 하나로 처리 |
| 3. 확정 | 관리자 | 순위표 · 팀 기록에 즉시 반영. 이후 선수 본인은 직접 수정 불가(관리자 경유만) |
| 4. 반려 | 관리자 → 선수 | 사유와 함께 재입력 요청, 재제출 시 2단계로 복귀 |
순위 산정 기준
| 참가 유형 | 순위 산정 기준 |
|---|---|
| 클럽(팀) | 승점 → 누적 핀수 → 팀 간 상대 전적 순 |
| 개인 | 게임별 누적 핀수 합산 |
| 핸디캡 적용 대회 | 핸디캡 반영 순위만 공식 표시(원점수 순위 별도 게시 안 함) |
접수 · 결제 진행 단계
| 단계 | 내용 |
|---|---|
| 결제 기간 | 접수 종료 직후 진입, 참가비 결제 가능 |
| 결제 마감 | 결제 기한 도래, 미결제 자동 취소 |
| 레인 배정 완료 | 관리자 수동 전환(자동 없음) |
| 진행 중 | 대회 시작 시각 도래 시 자동 전환 |
참가자와 관리자 모두 지금이 어떤 단계인지 화면에서 바로 확인할 수 있습니다.
미니대회(BMT) · 결과 공개 4모드
- 연속 참가일수에 따라 보너스 핸디캡 자동 부여
- 설정된 기간에 따라 자동 시작 · 종료
| 공개 모드 | 동작 | 공개 시점 |
|---|---|---|
| 즉시 공개 | 확정 즉시 순위표 반영 | 성적 확정 시 |
| 비공개 | 관리자가 수동 공개하기 전까지 비공개 | 관리자 조작 시 |
| 일 단위 공개 | 그날 확정분은 다음날부터 공개 | 익일 자정 기준 |
| 종료 후 공개 | 대회 전체 종료 후 일괄 공개 | 대회 종료 시 |
후보 선수 규칙
- 경기 시작 전 — 정규 선수를 대신해 출전자로 지정 가능
- 경기 시작 후 — 출전 선수 명단 확정, 후보 ↔ 정규 교체 차단
단체전(CLUB · 프로암) 팀 운영 — 확정 · 배포 완료
클럽(팀) · 프로암 접수는 개인 접수와 별도의 팀 전용 흐름으로 짓습니다. 팀 생성부터 순위 · 명예의 전당 연동까지 전 구간이 설계 확정을 거쳐 이미 프로덕션에 반영되었습니다.
- 팀 생성 · 로스터 — 클럽 운영자가 대상 대회를 골라 팀을 만들면, 팀 정원은 그 대회가 정한 규격에서 자동으로 정해집니다. 대표자는 로스터에 포함된 회원만 지정 가능. 프로암은 생성 · 로스터 수정 · 최종 확정 각 시점에 성별 · 프로 선수 정원 구성을 검증(초안 단계는 미완성 허용, 확정 시점은 규격과 정확히 일치해야 통과). 확정된 로스터는 관리자를 통해서만 변경합니다.
- 조 편성 접수 — 대회를 여러 조(회차)로 나눠 편성하고, 대표자가 접수 시 조를 선택합니다. 정원 · 대기(보결) · 추첨 · 승계는 모두 그 조 안에서만 독립적으로 산정됩니다. 선착순 대회는 정원 초과 시 대기 등록, 추첨 대회는 마감 시 조별 무작위 추첨으로 확정 · 보결을 가릅니다. 확정 팀이 취소하면 같은 조 대기 1순위가 자동 승격 + 알림 발송.
- 참가비 결제 — 팀 참가비는 대회가 정한 금액 그대로 팀당 1건 결제(팀원 수 곱셈 없음). 무료 대회는 자동 결제완료 처리. 결제 기한 내 미납 확정 팀은 자동 취소되고, 대기 팀이 결제 기한을 새로 부여받아 승격되며, 승격 팀도 미납이면 같은 방식으로 재취소 · 재승격됩니다.
- 레인 배정 · 순환 — 관리자가 조별 레인 구성과 게임 간 순환 방식(순환 없음 / 교차 순환 / 이동 순환)을 설정하면, 첫 게임 레인은 자동(무작위) 배정되고 이후 게임은 설정한 방식대로 자동 전환됩니다. 개별 팀 · 게임 단위 수동 조정도 가능(같은 조 안 레인 중복은 거부).
- 팀 성적 · 핸디캡 — 팀원별 게임 성적은 관리자가 직접 입력하며(참가자 본인 제출 절차 없음), 핸디캡이 자동 반영됩니다. 팀 확정은 로스터 전원이 모든 게임의 성적 또는 결장(불참) 처리를 보유해야 가능하며, 확정 후 수정하면 확정 · 공개가 함께 자동 해제됩니다.
- 순위 · 공개 — 확정된 팀만을 대상으로 순위를 자동 집계하며(동점 시 핸디캡 총점 → 최고 게임 → 평균 → 스크래치 총점 순), 관리자가 공개를 켜기 전까지 팀 · 개인 순위는 비공개입니다.
- 명예의 전당 자동 연동 — 결과가 공개되면 순위 1위 팀(공동 우승 포함) 로스터 전원이 명예의 전당에 자동 등재되며, 이후 우승 팀 변경 · 공개 취소 시 자동 등재 기록도 함께 갱신됩니다(관리자가 직접 등록한 기록은 영향받지 않음).
개인 종합전 리그(PERSONAL_AGGREGATE) — 설계 검토 중
개인 참가자가 팀 없이 개인 단위로 리그에 접수해, 회차(매치데이)마다 자기 게임 점수만 쌓아 순위를 겨루는 방식입니다. 상대와 대진을 겨루지 않고 누적 성적만으로 순위를 매기는 "종합전"이며, 이 설계안은 아직 CTO 검토를 기다리는 단계로 서버에 구현 · 배포되지 않았습니다.
- 접수 — 팀이 아니라 참가자 개인 단위로 정원 · 대기(승계)를 산정, 동일 인물의 중복 접수를 방지
- 점수 입력 — 회차별로 참가자 본인이 직접 점수를 입력 · 제출하면 관리자가 확정 · 정정 · 반려(기존 리그 · BMT 워크플로우와 동일한 방식)
- 순위 — 확정된 점수만 누적, 핸디캡이 설정된 리그는 핸디 적용 점수 기준(원점수 병기), 확정 시점 핸디를 고정해 이후 개인 핸디가 바뀌어도 과거 순위는 흔들리지 않음
- 동점 처리 — 핸디 적용 총핀 → 원점수 총핀 순으로 우선순위, 그래도 같으면 공동순위
- 시즌 종료 — 관리자가 수동으로 종료하면 확정 점수 기준 최종 순위를 스냅샷으로 저장(종료 후 값 변동 없음)
- 기존 클럽(팀) 리그와의 관계 — 팀 리그 데이터 · 로직은 변경 없이 그대로 유지되는 별도 경로로 설계
확정 대기
참가자끼리 1:1로 승부를 겨루는 "개인 대결전(PERSONAL_HEAD_TO_HEAD)"은 이번 설계 범위(개인 종합전)에 포함되지 않는 후속 단계이며, 아직 별도 설계 문서가 없어 확정 대기 상태입니다.
볼 등록 · 공인구 연동 방식 개요 — 진승 연동점
- 참가자는 브랜드 · 모델 · 무게(11~16파운드) · 시리얼 · 비고 다섯 항목을 필수 신고
- 대회별 참가자 1인당 등록 개수 상한을 관리자가 설정
- 등록은 참가비 결제 완료자만 가능, 마감 이후에는 조회만 가능
- 신고된 시리얼을 진승 공인구 원장과 실시간 대조 — 확인 결과는 참고 표시, 최종 규정 판정은 항상 관리자의 현장 검수
- 관리자는 대리 등록 · 수정 · 삭제(마감 · 개수 제한 무관), 확인 여부 수동 보정, 등록 현황 파일 내려받기 가능
안전장치
진승 연동이 일시 장애 상태이더라도 볼 등록 접수 자체는 계속됩니다. 확인 여부만 "미확인"으로 남기고 장애 해소 후 보정하여, 외부 연동 장애가 대회 운영을 막지 않게 합니다.
예약(레인 · 락커) 운영 모델 개요
레인
- 시간대별 가용 현황 조회 · 예약
- 대회 전체 대관 시 해당 시간대 레인 자동 예약 불가 처리(이중 배정 방지)
- 대회 등록 · 수정 시 정원이 배정 레인의 실제 수용 인원을 초과하지 않도록 자동 검증
- 관리자는 월간 예약 현황을 색상 표시 달력으로 확인
락커
- 임대 · 연장 가능, 만료 임박 시 회원에게 안내
- 신규 · 연장 신청은 앱 내 결제로 확정(결제 완료 전 신청은 서버에 남지 않음)
- 일부 락커는 3개월 단위 단기 상품, 신청일 기준 만료일 자동 계산
- 결제 대기 · 완료 등 진행 중인 신청은 "내 락커" 화면 상단에서 바로 확인
단계별 구축 순서
8개 운영 영역은 아래와 같이 진행 중입니다.
| 상태 | 영역 |
|---|---|
| 구축 · 운영 중 | 회원 · 등급 · 인증, 대회 · 이벤트 접수, 클럽 · 리그, 레인 · 락커 예약, 볼 등록 · 공인구 확인, 성적 · 등급 · 통계, 게시판 · 소셜, 결제 |
| 진행 중 | 알림 종류별 실시간 푸시 발송, 홈 화면 개편 등 세부 기능 |
| 백로그 | 매출 · 정산 리포트, 멀티 지점 관리, 키오스크 모드 — 별도 요구사항정의서로 상세화 예정 |
참고
대회 · 이벤트 접수 영역의 단체전(CLUB · 프로암) 팀 운영(팀 생성부터 레인 배정 · 성적 · 순위 · 명예의 전당 연동까지)은 2026-07-12 프로덕션에 반영 완료되었습니다.
참고
클럽 · 리그 영역의 개인 종합전 리그(PERSONAL_AGGREGATE) 설계안은 CTO 검토 대기 상태이며, 검토 · 확정 후 개발이 진행됩니다.
확정 대기 · 다음 단계
아래 항목은 현시점에서 확정되지 않았으며, 후속 검토를 통해 확정합니다.
서비스 수준(SLA) · 세부 일정
가동률 · 응답시간 등 서비스 수준 목표와 세부 일정은 별도 협의로 확정합니다.
실시간 푸시 알림 도입 일정
알림 종류별 실시간 푸시 발송은 순차 도입 중이며, 전체 도입 일정은 별도 협의로 확정합니다.
단체전 팀 로스터 중도 교체 전용 절차
현재는 로스터 인원 교체 시 신규 등록으로 최소 대응하고 있으며, 전용 교체 관리 화면 · 절차는 후속 검토를 통해 확정합니다.
개인 종합전 리그(PERSONAL_AGGREGATE) 설계 확정
§04에 반영한 개인 종합전 리그 설계안은 CTO 검토 대기 상태이며, 검토 · 확정 후 개발 · 배포됩니다. 참가자끼리 1:1로 승부를 겨루는 "개인 대결전(PERSONAL_HEAD_TO_HEAD)"은 이번 설계 범위(개인 종합전)에 포함되지 않는 후속 단계이며, 아직 별도 설계 문서가 없어 확정 대기 상태입니다.
다음 단계 산출물
개발 설계(논리 데이터 모델 · API 개요)를 상세화하고 단계별로 검수합니다.
본 문서는 초안(v0.5)이며 검수 대기 상태입니다. 내용 확인 · 수정 요청은 상단의 수정 요청을, 검수 완료 시 검수 승인을 이용해 주세요.