← Cockpit Wireframes
클럽 조 편성 — 모델 결정 보드
Approved — build queue
Venue Finder · 코트 찾기
ArchiveStrip Map · 세션 스트립 전체 시나리오Headers · 헤더 아이콘Compaction — 일정 · 코트 · 스코어카드Compaction — 클럽 상세 · 홈Compaction — 기록 · 프로필Live anchor — 진행 중 밴드Density · 카드 밀도토스트 — 리디자인 제안위저드 내비게이션 — 결정 보드드래프트 복원 — 무음 복원클럽 조 편성 — 모델 결정 보드Session Detail — Redesign · 일정Venue Detail — Redesign · 테니스장Profile Detail — Redesign · 프로필Tournament Detail — Redesign · 대항전Applicant Detail — Redesign · 가입 심사Canvas Migration — 회비 · 멤버 · 규칙Record Detail — Redesign · 기록Venue Filters · 코트 필터 재구성
Decided 2026-08-14 — shipped; kept as the decision record
Interactive kit · grounded in code

클럽 조 편성 — 모델 결정 보드

SHIPPED 2026-08-14 — migration 00476club_groups 테이블 · 자동/수동 배정 · 재편성 흐름 모두 라이브 — §1-4는 왜 B/B/A가 선택됐는지 남긴 결정 기록, §5 화면 목업은 실제 shipped 화면(ClubGroupsSection · RegroupPreview · MemberGroupModal · ranking-tab 조별 토글)을 그대로 그린 것이다.
1
모델 요약세 안 공통 — 결정 대기는 배정/재편성/기준일 뿐, 구조는 하나
club_groups                                            (신설)
  id            uuid   PK
  club_id       uuid   FK → clubs
  name          text   ≤ 20자
  sort_order    int    실력 순위, 0 = 최상위
  target_size   int?   nullable
  is_active     bool

club_members                                            (+2 컬럼)
  auto_group_id    uuid?  FK → club_groups
  manual_group_id  uuid?  FK → club_groups
  effective       = manual_group_id ?? auto_group_id     (NULL = 미배정)

club_regular_meets                                       (클린 브레이크)
  ✕ participation_group_label          text   (삭제)
  ✕ participation_group_expected_size  int    (삭제)
  ✓ participation_group_id  uuid  FK → club_groups
    — 그 모임의 실제 로스터 = 그 조의 실제 멤버 목록
2
결정 축 1 · 배정 방식누가, 어떻게 조에 들어가나
A절대 ELO 컷오프
900점 / 1400점 선을 고정 컷오프로 사용 — 브론즈|실버, 실버|골드 경계 그대로문제: 실력이 비슷한 클럽은 전원이 한 조로 붕괴 — 신생 클럽 대부분이 이 상태
B랭킹 분할✓ 선택됨 · shipped
클럽 ELO 내림차순 정렬 → 조별 target_size만큼 위에서부터 채움장점: 클럽이 선언한 조 구조가 항상 유지됨 — 컷오프가 아니라 정원이 기준
C수동 전용
관리자가 전부 지정 — 리더보드 연동 없음문제: 클럽이 커질수록 관리 부담이 선형으로 증가
B 미리보기 · 정렬 → 채움 (target_size 2 / 2 / 2)
1박준서1780A조
2김민준1620A조
3이서연1510B조
4최지훈1350B조
5정다은1120C조
6한소미980C조
10경기 미만(신뢰 불가 레이팅)은 이 정렬에서 제외 — 자동 배정 없이 미배정으로 남는다.
비교
A
B
C
비슷한 실력 클럽
전원 한 조로 붕괴
조 구조 항상 유지
수동 의존
클럽 성장 대응
경계 재설정 필요
target_size만 조정
관리 부담 ↑
판단 근거
고정 ELO 숫자
클럽 내 상대 순위
총무 재량
3
결정 축 2 · 재편성 시점조를 언제 다시 계산하나
A실시간 자동
경기가 끝날 때마다 재계산문제: 조용한 강등, 사회적 마찰 — 방금 진 경기 하나로 조가 바뀐 걸 본인만 모른다
B관리자 트리거 + 미리보기✓ 선택됨 · shipped
조 관리 → [재편성] 버튼 → 승격↑/강등↓ diff 확인 → 확정장점: 타이밍과 결과 공개를 모두 총무가 통제 — 확정 전에는 아무것도 안 바뀜
C시즌 자동
분기별 cron으로 자동 재계산문제: 시즌 인프라가 아직 없음 — 시즌 자동화를 조 편성보다 먼저 만드는 격, 기계부터 만드는 격
B 핵심 화면 · 재편성 미리보기
재편성 미리보기
김철수B조A조
ELO 1480 · 12전 9승 — 승격 기준 충족
이영희A조B조
ELO 1320
박지민고정됨
취소
확정
비교
A
B
C
트리거
매 경기
총무 버튼
분기 cron
확정 전 검토
없음
diff 미리보기
없음
필요 인프라
없음 (지금 가능)
없음 (지금 가능)
시즌 개념 신설
사회적 마찰
높음 — 즉시·비공개
낮음 — 예고된 이벤트
낮음이지만 늦게 옴
4
결정 축 3 · 순위 기준배정 정렬에 쓰는 실력 지표
A클럽 ELO✓ 선택됨 · shipped
club_elo_ratings · 복식 기준장점: 전 서비스의 실력 기준과 일치 — 리더보드·매치메이킹·티어 배지와 같은 숫자를 쓴다
B시즌 승수 우선
get_season_standings 방식문제: 출석 많은 사람이 위로 가는 왜곡 — 실력이 아니라 참석률을 재는 지표가 조를 정한다
⚠️10경기 미만(신뢰 불가 레이팅)은 A·B 어느 기준에서도 자동 배정 대상에서 제외된다 — 결과는 미배정, 관리자 수동 지정만 가능.
5
화면 목업 — AS-BUILT실제 shipped 컴포넌트 그대로, 시나리오 데이터로 그림
(a) 조 관리 — ClubGroupsSection (클럽 설정 화면 안)
클럽 설정
조 편성클럽의 실력별 조를 관리합니다. 순서는 배정 우선순위(위→아래)입니다.
A조8명 목표 · 현원 7
B조8명 목표 · 현원 8
C조8명 목표 · 현원 6
+ 조 추가
재편성10경기 미만 멤버는 자동 배정에서 제외됩니다 — 수동 지정만 가능
(b) 재편성 미리보기 — RegroupPreview (모달)
클럽 설정
A조8명 목표 · 현원 7
B조8명 목표 · 현원 8
재편성 미리보기
승격
김철수ELO 1480 · 12전
B조A조
강등
이영희ELO 1320 · 11전
A조B조
고정됨 (수동 핀)
박지민고정됨
취소확정
(c) 멤버 kebab → MemberActionModal(조 지정) → MemberGroupModal
멤버
박준서
정다은수동
한소미
정다은 · 조 지정
A조
B조
C조
미배정
자동 배정으로 되돌리기
(d) 조별 리더보드 — ranking-tab.tsx 전체/조별 토글
랭킹
전체
조별
A조
8명
1
박준서
🌳NTRP 4.01780
2
김민준
🌳NTRP 3.5–4.01620
B조
7명
1
이서연
🌳NTRP 3.51510
2
최지훈
🌿NTRP 3.51350
6
계산배정·모임별 인원·정원 산식
배정sort(club_elo DESC, matches DESC, joined ASC) → fill by sort_order up to target_size (수동 고정 인원이 자리 차지)
모임별 예상 인원전원: 활동 멤버 × 참석률 / 조: 조 현원 × 참석률
주간 연인원Σ 모임별 예상
필요 정원전원제: max(모임별) / 조별: Σ 조 정원
7
결론
결론SHIPPED — 랭킹 분할 + 관리자 트리거 재편성 + 클럽 ELO 기준
정원 기반 분할(B)은 클럽이 선언한 조 구조를 실력 분포와 무관하게 지킨다 — 절대 컷오프(A)는 신생 클럽·실력이 몰린 클럽에서 전원이 한 조로 붕괴한다.재편성은 총무의 판단이 필요한 사회적 결정 — 실시간 자동(A)은 조용한 강등과 마찰을 낳고, 시즌 자동(C)은 아직 없는 시즌 인프라부터 요구한다. 트리거 + 미리보기(B)는 지금 바로 지을 수 있다.클럽 ELO(A)는 이미 전 서비스가 쓰는 실력 기준 — 시즌 승수(B)로 별도 랭킹을 만들면 "실력"이라는 단어가 화면마다 다른 숫자를 가리키게 된다.이 세 문단은 결정 당시의 근거이지 여전히 열린 질문이 아니다 — club-groups.rules.ts의 파일 헤더가 이 보드를 "Owner-ratified design"으로 직접 인용하고, computeRankPartition이 B/B/A를 그대로 구현한다.
Spec (grounding, anatomy)

SHIPPED 2026-08-14 (migration 00476). club_groups + auto/manual 배정 + 재편성 트리거가 라이브 — 세 축(배정 방식 B · 재편성 시점 B · 순위 기준 A)은 club-groups.rules.ts가 직접 인용하는 확정 결정 기록이고, §5 화면 목업은 실제 shipped 화면(ClubGroupsSection · RegroupPreview · MemberActionModal/MemberGroupModal · ranking-tab 조별 토글)을 그린 것이다.

grounded in 7 source file(s)
packages/app/src/domain/rules/club-groups.rules.tspackages/features/clubs/src/settings/club-groups-section.tsxpackages/features/clubs/src/settings/regroup-preview.tsxpackages/features/clubs/src/members/member-modals.tsxpackages/features/clubs/src/club-detail/ranking-tab.tsxpackages/features/clubs/src/club-members-screen.tsxpackages/app/src/domain/rules/tier.config.ts