QA 체크리스트 — 요구사항 검증 / 인수 테스트
5장 요구사항 분석의 항목을 근거로 만든 인수 테스트 체크리스트다. 실제로 기능을 눌러 보고 기대한 대로 되면 박민호(PM)가 체크한다.
- 정본은 5장이다 — 여기 문구는 5장의 “확인 방법”을 체크 가능한 항목으로 옮긴 것이고, 요구사항 전문·근거·구현 상세는 5장을 본다. 둘이 어긋나면 5장이 이긴다.
- 이 페이지의 체크는 “PM이 실제로 확인했다”는 뜻이다. 5장의 ✅/🟡/❌ 상태(개발자 자체 보고)와는 다른 축이다 — 개발자가 됐다고 적어도 PM이 직접 눌러 보기 전엔 비워 둔다.
- 상위 항목(굵게 표시)은 하위 항목이 전부 통과했을 때 체크한다.
- 아직 만들어지지 않은 기능(5장에서 ❌ 미구현)은 체크하지 말고 비워 둔 채로 둔다 — 목록에서 지우지 않는다. 지우면 다음 사람이 “원래 없던 항목”으로 오해한다.
- 앱/웹/공통으로 나눴다. 기준은 “그 화면이 실제로 그 플랫폼에 있는가”다(2026-09-14,
flutter/lib/core/router/app_router.dart와www/src/app/기준). 앱 라우트는/login·/home·/videos·/profile넷뿐이라 웹보다 목록이 훨씬 짧다 — 빠진 게 아니라 아직 앱에 그 화면이 없다.
앱 (Flutter)
로그인·회원가입
앱에는 이메일/비밀번호 로그인과 회원가입이 한 화면에 있다(“계정이 없으신가요? 회원가입” 토글, 2026-09-14 추가). 구글 로그인은 아직 없다 — 그건 웹에서만 된다.
- 올바른 이메일·비밀번호로 로그인하면 토큰이 발급되고 홈 화면으로 이동한다
- 미가입 이메일과 틀린 비밀번호가 같은 오류 문구로 응답한다 — 가입 여부가 새지 않는다 (SEC-012)
- 회원가입
- 이메일·비밀번호(8자 이상)·닉네임(1~20자)을 채우고 가입하면 그 자리에서 로그인된 상태로 홈 화면에 들어간다
- 8자 미만 비밀번호·빈 닉네임·
@없는 이메일은 서버에 보내기 전에 화면에서 막힌다 - 이미 가입된 이메일로 가입하면 서버가 준 오류 문구가 뜬다 (409)
- “회원가입” ↔ “로그인” 토글을 눌러 두 모드를 오갈 수 있다
- 로그인·회원가입을 짧은 시간에 반복 시도하면 화면이 잠기고 남은 초가 카운트다운으로 표시되며, 그동안 버튼이 눌리지 않는다 (SEC-009)
- 앱을 완전히 종료했다가 다시 열면 로그인 상태가 유지되는지 — (2026-09-14 기준 미구현. 토큰을 메모리에만 두고 로컬 저장소에 안 옮겨서 앱을 끄면 로그아웃된다 —
auth_repository_api.dart주석에 명시. 구현되면 체크 항목으로 승격) - 로그인하지 않은 상태로는 홈·영상·프로필 어디에도 못 들어가고 로그인 화면으로 돌아간다
- 로그아웃 후 다른 계정으로 로그인하면 이전 계정의 종목(스포츠) 선택이 남아 있지 않다
- 🔴 배포(릴리스) 빌드에는 “개발용 바로 진입” 버튼이 보이지 않는다 — 디버그 전용 기능이 릴리스에 노출되면 안 된다
홈
- 로그인 후 홈 화면에 내 닉네임과 종목 선택 칩이 보인다
- 종목 칩을 바꾸면 선택한 종목으로 반영된다
- 아직 만들지 않은 메뉴(용병 매칭·내 선수 카드·내 팀·레슨/코치, 하단 메뉴의 크레딧·코치·설정)를 누르면 “준비 중입니다” 안내만 뜨고 그 이상 진행되지 않는다 — 오류로 죽지 않는다
영상 업로드 및 분석
⚠️ 2026-09-14 기준, 카메라·갤러리에서 영상을 실제로 고르는 기능은 아직 없다. “바로 찍기”·”앨범에서”를 눌러도 “준비 중입니다”만 뜬다. 지금 앱에서 실제로 동작하는 것은 AI 챗봇 대화뿐이고, 그마저 서버가 아니라 Mock 응답이다(chat_providers.dart가 MockChatRepository를 그대로 쓴다). 근거: SFR-001·002·003, QUA-001·002는 아직 앱에서 검증할 수 없다 — 웹 구획의 같은 절을 본다.
- “분석할 영상을 골라주세요” 판을 누르면 “바로 찍기”·”앨범에서” 두 선택지가 펼쳐진다
- 챗봇에 메시지를 보내면 답이 오고, 대화창이 자동으로 맨 아래로 스크롤된다
- 빈 메시지(공백만 입력)는 전송되지 않는다
- 답을 기다리는 동안 입력창·전송 버튼이 비활성화되고 “…” 표시가 보인다
- 카메라/갤러리로 실제 영상 선택·업로드 (미구현 — 눌러도 “준비 중입니다”만 뜬다. 구현되면 웹 구획과 같은 기준으로 체크)
- 챗봇 응답이 실제 분석 에이전트·리포트와 연결되는지 (미구현 — 현재는 고정된 Mock 응답)
프로필
- 내 이메일·닉네임·가입일이 표시된다
- 닉네임을 수정하면 반영된다
- 닉네임 저장 중에는 저장 버튼이 비활성화되고 로딩 표시가 보인다
- 저장이 실패하면 오류 문구가 뜨고, 시트가 닫히지 않아 다시 시도할 수 있다
웹 (Next.js, www/)
가입·로그인·계정
5장 1)절은 이걸 SFR로 세지 않지만(“모든 기능의 전제”) 인수 테스트에서는 가장 먼저 막힌다. 근거: SEC-002·003·004·009·011·012.
- 이메일/비밀번호 회원가입
- 정상 입력으로 가입하면 즉시 토큰이 발급되고 로그인된 상태가 된다
- 이미 가입된 이메일로 가입하면 “이미 가입된 이메일입니다” 안내가 뜬다 (409)
- 72바이트를 넘는 비밀번호는 자동으로 잘리지 않고 거부된다 (SEC-002)
- 이메일/비밀번호 로그인
- 올바른 이메일·비밀번호로 로그인하면 토큰이 발급된다
- 미가입 이메일과 틀린 비밀번호가 같은 오류 문구로 응답한다 — 가입 여부가 새지 않는다 (SEC-012)
- 구글 로그인
- 처음 구글로 로그인하면 계정이 자동으로 만들어진다
- 같은 구글 계정으로 다시 로그인하면 기존 계정으로 연결된다(계정이 중복 생성되지 않는다)
- 로그아웃(모든 기기) — 누르면 이전에 발급된 토큰이 전부 즉시 무효가 된다 (SEC-004)
- 짧은 시간에 로그인을 반복 시도하면 일정 횟수부터 제한(429)된다 (SEC-009)
영상 업로드 및 분석
근거: SFR-001·002·003, QUA-001·002.
- 영상 업로드
- 규격(용량·길이·해상도)에 맞는 영상은 업로드되고 목록에 나타난다
- 규격을 벗어난 영상은 반려되고, 반려 사유가 문장으로 표시된다
- 분석 실행
- 업로드 후 분석이 비동기로 진행되고, 진행 상태(대기/진행중/완료)가 화면에 보인다
- 같은 영상을 두 번 분석해도 같은 결과가 나온다 (QUA-001, 결정론적 재현성)
- 분석 리포트
- 분석이 끝나면 근거 문장(측정값 기반 코멘트)이 리포트에 나타난다
- 리포트에 점수·등급 숫자가 노출되지 않는다 (SFR-003)
호칭 부여
근거: SFR-004. (5장 기준 미구현 — 통과 시점까지 비워 둔다)
- 지표 조건을 만족하면 해당 호칭이 자동으로 부여된다
- 같은 지표 조건이면 누구에게나 같은 호칭이 부여된다(사람 간 상대 비교가 아니다)
선수 카드 공유
근거: SFR-009, SEC-005.
- 로그인한 사용자가 자신의 카드를 공개 링크로 만들 수 있다
- 그 링크는 로그인하지 않은 브라우저에서도 열린다
- 카드에 수치 능력치(점수·등급)가 노출되지 않는다
- 카드 링크의 슬러그가 닉네임 등에서 유추되지 않는 무작위 값이다
경기 등록 및 매칭
근거: SFR-006·007·010.
- 경기 등록 — 팀이 경기를 등록하며 필요한 포지션과 인원을 지정할 수 있다
- 경기 탐색 — 등록된 경기 목록을 조회·검색할 수 있다
- 지원 — 선수가 경기에 지원하고, 팀이 수락/거절할 수 있다
- 지원 취소 — 선수가 지원을 무를 수 있고, 팀이 경기를 취소해도 문제없이 처리된다
- 지원 건별로 적합도가 수준·역할·성향 세 축으로 따로 표시된다 (5장 기준 미구현)
- 팀에 후보가 추천되고, 추천마다 사유가 함께 표시된다 (5장 기준 미구현)
경기 후 평가
근거: SFR-008.
- 경기 종료 후 상대를 평가할 수 있고, 평가는 선택형 항목으로 되어 있다(자유 서술 점수가 아니다)
- 불참(노쇼)·신고는 평가와 별도 경로로 접수된다
- 평가 결과가 단일 점수로 합산되어 노출되지 않는다
공통 (백엔드·인프라 — 앱·웹 모두 해당)
앱·웹이 같은 API 서버를 쓰므로 플랫폼별이 아니라 한 번만 확인한다.
보안
근거: 나머지 SEC 항목.
- 사이트 접속 주소가
https://이고, 주소창에 경고가 뜨지 않는다 (SEC-001) - 남의 자원(다른 사람의 프로필·경기 등)을 URL 조작으로 접근하면 접근이 거부된다 (SEC-005)
- 계정을 탈퇴하면 관련 데이터가 삭제된다(영상 원본 포함) (SEC-006)
- 확장자만 바꾼 가짜 영상 파일을 올리면 반려된다 (SEC-008)
- 로그인 성공/실패가 기록되되, 로그에 비밀번호·토큰이 남지 않는다 (SEC-010)
성능
근거: PER-001·002·003. 측정 계획은 8장 본문(부하/성능 테스트)을 따른다.
- 영상 업로드·재생이 API 서버를 거치지 않고 빠르게 동작한다 (PER-002)
- 주요 조회 화면(경기 목록·카드·프로필)이 체감상 느리지 않다 — 정식 부하 시험 전 1차 확인
- 부하 시험 결과 조회 API P95가 500ms 이내다 (PER-003, [TBD] — 정식 측정 후 체크)
품질·자동화
근거: QUA-003.
main브랜치에 병합된 변경마다 자동 테스트가 돌았다(스킵으로 통과 처리되지 않았다)