1) 개발 환경 및 기술 스택

계층별로 언어·프레임워크·패키지 관리자를 고정한다. 전체 시스템 구성도는 6장 1)절 시스템 구성도를 본다 — 여기는 개발자가 로컬에서 무엇을 설치·실행하는가를 정리한다.

계층 언어·프레임워크 패키지 관리 로컬 실행·테스트
앱 (flutter/) Flutter · Dart, 상태 관리는 Riverpod, 라우팅은 go_router pubspec.yaml flutter analyze (0건이어야 함) · flutter test
웹 (www/) Next.js 16(App Router) · React 19 · TypeScript 5 · Tailwind CSS 4 npm npm run dev · npm test(Vitest)
백엔드 API (fastapi/) Python 3.14 · FastAPI · SQLAlchemy(동기) · Alembic uv pytest -q · alembic upgrade head && alembic check
AI 에이전트 (agent/) Python 3.12(시스템 3.14와 별도 고정) · PyTorch · Transformers 5 uv uv run pytest tests/ -q
DB PostgreSQL 18 + pgvector 확장 — 로컬은 Docker 컨테이너 또는 네이티브 설치
문서 사이트(이 제안서) Jekyll(Just the Docs 테마) Bundler(RubyGems) bundle exec jekyll serve

백엔드는 바운디드 컨텍스트 구조다. app/<컨텍스트>/{domain,application, adapter,dependencies}로 계층을 나누고(컨텍스트: 사용자·카드·영상분석·매칭·평가), 컨텍스트끼리는 직접 임포트하지 않는다 — 남의 테이블이 필요하면 문자열 참조로 건다. 이 경계를 tests/test_architecture.py가 코드로 강제한다.

AI 에이전트는 시스템 Python(3.14)과 별도의 3.12 환경을 쓴다 — 판정 모델 (Transformers 5.x + EXAONE)이 요구하는 버전이 시스템 버전과 달라서다. 개발 GPU는 RTX 3050 8GB이고, 포즈 추정기와 판정 모델을 동시에 올릴 수 없어 순차 적재한다(6장 3)절). 평가·운영용 GPU는 AWS g4dn.xlarge를 쓴다.

배포 인프라는 AWS ap-northeast-2 단일 EC2 인스턴스 위에 k3s(단일 노드 쿠버네티스)로 백엔드 API를, 같은 인스턴스에 PostgreSQL을 직접 올린다. 앞단은 nginx + Let’s Encrypt로 TLS를 종단한다. main에 백엔드 변경이 들어가면 GitHub Actions가 이미지를 빌드해 Docker Hub에 올리고, 서버가 폴링해 재배포한다(CD). 웹은 Vercel에, 이 문서 사이트는 GitHub Pages에 각각 정적 배포한다. 영상 원본·리포트 산출물은 AWS S3에 둔다.

2) 주요 기능 구현 방안

5장 기능 요구사항(SFR)을 어떤 방식으로 구현하는지 기능 단위로 요약한다. 설계 근거·상세는 6장을, 요구사항 전문은 5장을 본다.

기능 핵심 구현 방식 상세 설계
영상 업로드 (SFR-001) 클라이언트가 API에서 사전 서명 URL을 받아 객체 저장소(S3)에 직접 업로드한다 — 원본이 API 서버를 거치지 않는다(PER-002) 6장 1)절
영상 분석 (SFR-002·003) 업로드 등록 시 분석 작업을 큐에 적재하고, 별도 GPU 워커가 폴링해 가져간다. 측정(포즈·수치)은 결정론적 코드, 판정 근거 문장만 언어 모델이 쓴다 — 모델이 점수를 생성하지 않는다 6장 3)·4)절
호칭 부여 (SFR-004) 지표 조건을 title_criteria에 행 단위로 정의하고, 절대 기준으로만 판정한다(상대 비교 없음) 부록 D
성향 유사도 (SFR-005) 지표 묶음을 특징 벡터로 만들어 pgvector에 색인하고 코사인 유사도로 검색한다 부록 D.4
적합도 산출 (SFR-006) 지원 건마다 수준·역할·성향 세 축을 각각 계산해 단일 점수로 합치지 않는다 5장 2절
매칭 추천 (SFR-007) 후보 추천에 사유를 함께 저장한다(recommendation.reason NOT NULL) — 근거 없는 추천을 남기지 않는다 부록 D.5
상호 평가 (SFR-008) 자유 서술·점수 대신 선택형 항목(review_option)으로 받고, 불참·신고는 평가와 분리된 별도 기록(no_show·report)으로 남긴다 부록 D
카드 공유 (SFR-009) 인증 없이 열리는 공개 링크를 96비트 무작위 슬러그로 발급한다. 카드에는 수치 능력치를 두지 않고, 수치는 리포트 경로로만 조회한다 5장 2절(SEC-005)
경기 등록·매칭 (SFR-010) 경기에 필요 포지션·인원을 행 단위(match_position_need)로 등록하고, 지원(match_application)은 팀·본인 수락 시각을 각각 가져 매칭 확정을 사람이 하게 한다 부록 D

공통 원칙으로 모든 화면·API가 스텁(가짜 응답) → 실제 백엔드로 교체 가능한 구조로 시작한다 — 웹·앱은 리포지토리 인터페이스만 알고 구현체(Mock/API)를 provider 한 곳에서만 교체하므로, 백엔드가 늦게 붙어도 화면 개발이 막히지 않는다.

3) 조직 구성 및 역할 분담

조직 구조

4인이 역할별로 완전히 분리된 영역을 각자 맡고, PM이 통합을 담당하는 단일 계층 구조다. 기획·디자인·개발을 겸하는 소규모 팀 특성상 별도의 리뷰어 직책을 두지 않고, main 통합 시점의 병합 확인(빌드·테스트 통과)이 실질적인 검토 관문 역할을 한다.

역할 담당 책임 범위 소유 코드 영역
PM 박민호 요구사항·일정 관리, 스프린트 진행, QA 총괄, main 브랜치 통합 jekyll/(제안서 문서), 미결 항목 운영
프론트·웹 백성검 Flutter 앱 UI/UX, 웹 페이지, 화면 구현 flutter/ · www/
백엔드·파이프라인 정어진 DB·API 설계, 영상 수집·전처리, 배포 fastapi/
AI 에이전트 정상호 루브릭 기반 실력 검증, 판정 근거 생성 agent/

전체 진행 일정과 스프린트별 담당 태스크는 아래 4)절을 본다.

협업 원칙

  • 사람마다 자기 브랜치(min·paik·jin·ho)에서 작업하고, main에는 직접 커밋하지 않는다. PM이 각 브랜치를 main에 병합하고, 필요하면 main을 다시 각 브랜치로 되병합(sync)해 서로의 작업을 흘려보낸다.
  • 남의 코드 영역을 고쳐야 하면 그 영역의 진입점 문서부터 읽는다 — 각 폴더(fastapi/·www/·flutter/·agent/)에 관례·테스트 구조를 적은 안내 문서를 둔다.
  • 스키마·API 계약을 바꾸는 변경은 사전에 공유한다. 클라이언트(앱·웹)가 뒤따라 고쳐야 하기 때문이다.
  • 팀원 사이 요청·결정은 미결 항목 페이지에 모은다. 데일리 스탠드업을 대신해 비동기로 담당자·기한과 함께 쌓이고, 처리되면 해소 표시를 남겨 같은 조사를 반복하지 않는다.

4) 단계별 개발 일정

애자일 스크럼 방식으로 진행한다. 전체 개발 기간(2026.08.20 ~ 2026.10.27, 10주)을 2주 단위 스프린트 5회로 나누고, 스프린트마다 스프린트 계획 → 데일리 스탠드업 → 스프린트 리뷰 → 회고를 반복한다.

팀 역할 (2026.08.26 재배정)

  • 박민호 — PM (요구사항/일정 관리, 스프린트 진행, QA 총괄)
  • 백성검 — 프론트·웹 (Flutter 앱 UI/UX, 화면 구현, 웹 페이지)
  • 정어진 — 백엔드·파이프라인 (DB·API, 영상 수집·전처리, 분석 파이프라인, 배포)
  • 정상호 — AI 에이전트 개발 (루브릭 기반 실력 검증, 근거 생성)

스프린트 로드맵

스프린트 1 ✓08.20~08.31요구사항 확정,개발환경 구축스프린트 2 ✓09.01~09.14핵심 기능 프로토타입스프린트 309.15~09.28기능 고도화스프린트 409.29~10.12통합 및 테스트스프린트 510.13~10.27마무리 및 배포 준비박민호PM스프린트 1 · 박민호 — 요구사항/일정 확정, 백로그 작성요구사항/일정 확정,백로그 작성스프린트 2 · 박민호 — 스프린트 진행, 중간 점검스프린트 진행, 중간 점검스프린트 3 · 박민호 — 진행 점검, 리스크 관리진행 점검, 리스크 관리스프린트 4 · 박민호 — 통합 테스트 총괄, QA통합 테스트 총괄, QA스프린트 5 · 박민호 — 최종 점검, 발표 준비최종 점검, 발표 준비백성검프론트·웹스프린트 1 · 백성검 — 프로젝트 초기 셋업, 화면 설계프로젝트 초기 셋업,화면 설계스프린트 2 · 백성검 — 로그인/선수 카드 화면 구현로그인/선수 카드 화면구현스프린트 3 · 백성검 — 매칭/구인 플로우 구현매칭/구인 플로우 구현스프린트 4 · 백성검 — 화면 통합, 버그 수정화면 통합, 버그 수정스프린트 5 · 백성검 — 앱 배포 빌드, 웹 페이지 마감앱 배포 빌드, 웹 페이지마감정어진백엔드·파이프라인스프린트 1 · 정어진 — DB 스키마 설계, 데이터 수집 방안DB 스키마 설계,데이터 수집 방안스프린트 2 · 정어진 — API 규격 확정, 영상 전처리 파이프라인 구축API 규격 확정, 영상전처리 파이프라인 구축스프린트 3 · 정어진 — 영상 분석 모델 연동, 벡터 저장·검색영상 분석 모델 연동, 벡터저장·검색스프린트 4 · 정어진 — 파이프라인 성능 튜닝, 추천 API 정확도 검증(Hit Rate/Recall)파이프라인 성능 튜닝,추천 API 정확도검증(HitRate/Recall)스프린트 5 · 정어진 — 운영 환경 배포운영 환경 배포정상호에이전트스프린트 1 · 정상호 — 에이전트 아키텍처 리서치에이전트 아키텍처리서치스프린트 2 · 정상호 — 루브릭 기반 실력 검증 로직 프로토타입루브릭 기반 실력 검증로직 프로토타입스프린트 3 · 정상호 — 채점 시스템 신뢰성 강화(fps 불변성 개선, 임계값 출처 조사)채점 시스템 신뢰성강화(fps 불변성 개선,임계값 출처 조사)스프린트 4 · 정상호 — 채점 검증 결과 반영·통합 테스트 지원(골든셋 확보 시 QWK·MAE 측정)채점 검증 결과 반영·통합테스트 지원(골든셋 확보시 QWK·MAE 측정)스프린트 5 · 정상호 — 최종 검증 및 튜닝최종 검증 및 튜닝
그림 7-1. 스프린트 다섯 개와 사람마다 맡은 일 — 아래 표와 같은 내용이다. 색은 사람이다. 칸 글이 길면 줄여 보이고, 칸에 마우스를 올리면 전부 보인다. ✓ 는 스프린트 로그가 있는(끝난) 스프린트다.
Sprint 기간 목표 박민호(PM) 백성검(프론트·웹) 정어진(백엔드·파이프라인) 정상호(에이전트)
1 08.20 ~ 08.31 요구사항 확정, 개발환경 구축 요구사항/일정 확정, 백로그 작성 프로젝트 초기 셋업, 화면 설계 DB 스키마 설계, 데이터 수집 방안 에이전트 아키텍처 리서치
2 09.01 ~ 09.14 핵심 기능 프로토타입 스프린트 진행, 중간 점검 로그인/선수 카드 화면 구현 API 규격 확정, 영상 전처리 파이프라인 구축 루브릭 기반 실력 검증 로직 프로토타입
3 09.15 ~ 09.28 기능 고도화 진행 점검, 리스크 관리 매칭/구인 플로우 구현 영상 분석 모델 연동, 벡터 저장·검색 채점 시스템 신뢰성 강화(fps 불변성 개선, 임계값 출처 조사)
4 09.29 ~ 10.12 통합 및 테스트 통합 테스트 총괄, QA 화면 통합, 버그 수정 파이프라인 성능 튜닝, 추천 API 정확도 검증(Hit Rate/Recall) 채점 검증 결과 반영·통합 테스트 지원(골든셋 확보 시 QWK·MAE 측정)
5 10.13 ~ 10.27 마무리 및 배포 준비 최종 점검, 발표 준비 앱 배포 빌드, 웹 페이지 마감 운영 환경 배포 최종 검증 및 튜닝

백엔드와 파이프라인이 정어진 한 사람에게 묶여 있다. API 규격과 색인 스키마가 각각 백성검·정상호의 착수 조건이므로, 이 영역은 구현보다 규격을 먼저 낸다.

현재 스프린트 칸반 보드 (Sprint 2 · 09.01 ~ 09.14)

Backlog

박민호·PM골든셋 라벨링 지도자 섭외(ho 2번)
박민호·PM클립의 동작(motion) 자리 — 부록 D 수정 여부 판단(jin 17번)
백성검·프론트/웹flutter/ 진입점 문서 작성(jin 9번)
정어진·백엔드/파이프라인분석 결과 적재 — 지표 코드 종목 충돌 합의 대기 중이라 구현 보류(jin 1번)
정어진·백엔드/파이프라인팀 구성원의 카드 식별자 — 스쿼드 등재가 막혀 있음(paik 2번)
정어진·백엔드/파이프라인카드 꾸미기 규격 — 별명·사진 필드가 계약에 없음(paik 3번)
정상호·에이전트agent/ 진입점 문서 작성(jin 9번)
정상호·에이전트클립의 동작(motion) — 동작 코드 목록 확인(jin 17번)

To Do

박민호·PM패킷 B(평가·신뢰) 애플리케이션·어댑터·라우터·테스트(jin 14번)
백성검·프론트/웹클라이언트 계약 반영 — 429 재요청 억제·프록시의 Retry-After 전달·Flutter 에러 code 보존(jin 2번)
백성검·프론트/웹패킷 A(과금) 도메인 구현 착수(jin 13번)
백성검·프론트/웹경기 탐색 /matches 화면(jin 15번)
정상호·에이전트분석 워커 폴링 루프 — 서버 쪽은 열렸음(jin 18번)
정상호·에이전트업로드 60초 상한 vs max_frames 300 판단(jin 11번)
정상호·에이전트스윙 측 자동판별 개선(ho 6번)

In Progress

정상호·에이전트fps 등급 불일치 — 원인 규명 후 인접 결함 수리(ho 7번)

Done

정어진·백엔드/파이프라인백엔드를 EC2에 배포 — PostgreSQL 18·Python 3.14.7
정어진·백엔드/파이프라인클립 업로드 개통 — S3 사전 서명 URL(SFR-001)
정어진·백엔드/파이프라인백엔드 미구현 도메인을 패킷 A·B로 분담(지시서 작성)
정어진·백엔드/파이프라인경기 탐색·수정·취소 개통 — GET/PATCH/DELETE /matches
정어진·백엔드/파이프라인지원 무르기·거절 경로 — 지원 붙은 경기 취소가 막히던 409 해소(jin 16번)
정어진·백엔드/파이프라인분석 작업 큐·워커 경로 개통 + worker-interface.md(정상호에게 인계)
정어진·백엔드/파이프라인멈춘 분석 작업 회수 — 워커가 죽어도 큐가 안 막힌다
정어진·백엔드/파이프라인패킷 B 마이그레이션 리뷰·DB 검증(min 2번 해소)
박민호·PM탄력적 IP·IAM 인스턴스 프로파일 부착 확인
박민호·PM패킷 B 초기 review_option 목록 확정, 5테이블 마이그레이션 작성
박민호·PM웹에 클립 업로드 붙임 — 분석 화면의 저장 버튼(jin 12번 해소)
박민호·PM웹을 mock에서 실제 백엔드로 전환 — getBackend()가 FastAPI를 부른다(jin 10번 해소)
박민호·PM부록 D 종목 서술 오타 수정(jin 4번 해소)
박민호·PM경기 취소를 A안(지원 취소·거절 경로 먼저)으로 결정(jin 16번)
백성검·프론트/웹사람 추적을 탐지 기반(MoveNet MultiPose)으로 재구현
백성검·프론트/웹레슨·상점 화면(mock) 신설, 판 안에서 도는 구조로 통합
백성검·프론트/웹상점 상품 목록 복구 · 영상 모음 댓글창 · 레슨/상점 판 2색 체계
백성검·프론트/웹카드를 만드는 자리를 화면에 — /me?edit=1 의 선수 카드 만들기(jin 7번 해소)
백성검·프론트/웹내 프로필(/me) 전면 개편 — 소속·정보·내 경기·계정·내 영상 한 판 + 카드 꾸미기
정상호·에이전트4K 입력 host RAM 문제 해결(D-1 — 재디코딩 방식)
정상호·에이전트fps 불변성안(E-1·E-2) 사전 판정 — 구현 전 기각, 근본 처방은 탐색범위 제한임을 확정
정상호·에이전트GPU 인스턴스(g4dn.xlarge) 확보·검증 — 할당량·IAM 역할 해소(ho 16번)
정상호·에이전트관측 sink 우회가 흔적을 남기도록 수정(ho 12번 해소)
정상호·에이전트골든셋 사전 등록 명세를 라벨 보기 전에 코드로 고정, 라벨 12건 확정·제외 27건 사유 기록

← 목차로


Table of contents