docs: W3 사이트플랫폼 5기능 골자 확정 (draft→confirmed)

W3-1~W3-5 골자를 기능별·항목별 합의해 status draft→confirmed.

- W3-1 태그+검색: 통합 1테이블, 정렬 매트릭스(태그 일치도 가중×2차키), 개발자 검색
- W3-2 댓글/리뷰: 리뷰=별점5+서술(다축 후속), 권한 작성자+운영자, 수정=이력보존+'수정됨' 표시
- W3-3 포스팅: W1 완료 후 착수, 카테고리 DB, 마크다운, OG 미리보기, 유니티블로그 외부 피드 감시
- W3-4 메인 허브: 잼 노출=검색창 아래 배너→잼 태그 검색 라우팅, 페이지네이션 도입
- W3-5 WebGL: deferred 유지, 조사 항목 7개·권한·QG-3 조사 단계로

합의 중 새 결합 3건 발굴: W3-1↔W3-2 양방향 / W3-4→W3-1 잼태그 라우팅 / W3-3 외부 fetch 인프라.
착수순서 W3-2→W3-1→W3-4→W3-3→W3-5 확정. 미결질문은 해소 않고 합의 목록으로 유지.
세션 산출 동봉(20260617-172407 초안 생성 + 20260617-174635 합의).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
이정수 2026-06-18 09:57:37 +09:00
parent 2eb0be5654
commit 15b8bc3362
6 changed files with 662 additions and 0 deletions

View File

@ -0,0 +1,156 @@
---
schema_version: 2
session_id: 20260617-172407
resumed_from: null
started_at: 2026-06-17T17:24:07+09:00
ended_at: 2026-06-17T17:40:00+09:00
user_request: |
W3에서 기능별로 골자는 정해두고 싶어. 당장 작업하려는건 아니야
---
# Summary
W3(사이트 플랫폼 워크스트림) 5개 서브기능(W3-1 태그+검색, W3-2 댓글/리뷰, W3-3 포스팅 보드, W3-4 메인 허브, W3-5 Unity 업로드 deferred)의 "골자"를 정의하는 기획 정리 세션. 사용자 명시: 당장 구현 아님(코드 0줄). 산출은 문서 only.
# Invocations
- id: inv-001
layer: orchestrator
name: orchestrator
started_at: 2026-06-17T17:24:07+09:00
input_digest: "W3 기능별 골자 정의 요청 (구현 아님)"
output_digest: "프로토콜+로드맵 로드, 골자 깊이/범위 미결 → 계획 게이트 진입 예정"
artifacts: []
concerns: []
# Advisor Invocation Decision Log
# 각 advisor 호출/스킵 판단 즉시 1줄 append
- advisor: requirements-advisor
decision: call
rationale: '골자=기능 윤곽+미결질문 도출 = requirements 도메인. 코드현황 대조 필요(컨텍스트 오염 방지 위임). tier=medium/effort=medium/s-batch'
checked_at: 2026-06-17T17:24:07+09:00
- advisor: design-advisor
decision: skip
rationale: '윤곽 카탈로그 깊이 — 미결질문을 남기는 게 목적, 오픈질문0 완결설계 아님. 본격 design 은 기능별 착수 시'
checked_at: 2026-06-17T17:24:07+09:00
- advisor: verification-advisor
decision: skip
rationale: '코드 변경 0줄(문서 only 기획) — 검증 대상 없음'
checked_at: 2026-06-17T17:24:07+09:00
- advisor: graph-refresh-checker
decision: skip
rationale: 'src/ scope 변경 없음(docs only) — no-scope-change'
checked_at: 2026-06-17T17:24:07+09:00
# Decisions
- by: user
at: 2026-06-17T17:24:07+09:00
decision: "골자 깊이=윤곽 카탈로그 / W3-5 deferred=포함(조사항목 스텁만)"
rationale: "당장 구현 아님 — 미결질문 남기는 1페이지 카탈로그"
related_invocations: [inv-001]
- by: orchestrator
at: 2026-06-17T17:24:07+09:00
decision: "산출 카테고리 backlog → work-log 정정"
rationale: "document-category-classification §backlog 은 '확정 로드맵 제외' 명시. W3 골자는 확정 로드맵(W1~W4) 구체화 = work-log(로드맵과 동일 카테고리, 시점성 기획). 자체 발견 정정(§2.3)"
related_invocations: [inv-001]
# Conflicts
# Open Items
- 미커밋 잔여: docs/work-log/2026-06-17-w3-feature-skeletons.md(신규), docs/work-log/index.md(수정), .atp/work-session/20260617-172407/(신규). 커밋 여부 사용자 판단 대기(CLAUDE.md 커밋 정책 = 명시 요청 시).
- QG-3 (코드 잠재 버그): /game/** 정적 핸들러 미등록(UploadResourceConfig 는 /profile/** 만) — W3-5 착수 전 의도/버그 확인 필요. 골자 범위 밖이라 본 세션 미수정.
# verified_by_me
- L1/L2: 해당 없음 — 코드 변경 0줄(문서 only 기획). verification-advisor skip.
- 문서 정합성: work-log/index.md 링크 추가 확인, source_roadmap 상호 링크 확인, 골자 깊이(DDL/API/시퀀스 없음·미결 해소 안 함) 사용자 확정과 일치.
# needs_user_verification
- 골자 카탈로그 검토(5기능 미결질문·결합표·착수순서가 의도와 맞는지).
- QG-3 /game/** 핸들러 동작 확인은 W3-5 착수 시 research 단계 과제.
# graph_refresh
- skip: no-scope-change — src/ 변경 0(docs only). graph-refresh-checker 미호출(§3.2 호출 스킵 조건 충족).
# User Signals
user_signals:
positive:
- quote_or_paraphrase: "AskUserQuestion(깊이+범위) 1회에 명확히 답하고 수락(윤곽 카탈로그 + deferred 포함)"
about: "계획 게이트 옵션 설계 — 미리보기로 깊이 차이를 구체화한 것이 1회 수락으로 이어짐"
negative:
- quote_or_paraphrase: "너 혼자 정한거야? → 걸리는 곳: 골자 내용 자체"
about: "골자 내용(5기능 미결질문 선정·결합 해석·착수순서 제언)을 사용자 검토 없이 advisor→work-log 문서로 확정. 깊이/범위만 계획 게이트로 묻고, 정작 이 세션의 핵심 deliverable 인 골자 내용은 동의 없이 굳힘. '골자는 정해두고 싶어'=함께 정하자는 의도를 통보로 처리."
structural: true
# Protocol Feedback
protocol_feedback:
- issue: "문서-only 기획 세션의 산출물 내용 동의 게이트 부재"
detail: "§5.0 계획 가시성 의무는 '첫 코드 변경 전' 동의를 강제한다. 코드 변경 0인 기획/골자 세션에선 이 트리거가 안 걸려, 산출물(골자) 내용 자체를 사용자 동의 없이 advisor→docs 로 확정하는 경로가 열린다. §5.0 은 'design 산출물은 파일로만 존재, orchestrator 가 핵심 결정 전달 책임'을 말하나, 문서 세션에서 그 '전달'을 확정 전 동의가 아닌 사후 보고로 처리해도 막는 규정이 없다."
repro: "요청='X 골자/기획 정해두고 싶어' + 코드 변경 0. orchestrator 가 깊이/범위만 게이트로 묻고 내용은 advisor 산출→docs 직행 확정."
proposed: "문서가 곧 deliverable 인 세션(기획/골자/설계 문서)은 advisor 산출 내용을 docs 정식 배치 전 사용자 검토 게이트를 1회 둔다. '코드 변경 전' 대신 'deliverable 확정 전' 으로 §5.0 트리거 일반화."
---
# Retrospective
```yaml
Retrospective:
signals:
positive:
- quote_or_paraphrase: "AskUserQuestion(깊이+범위) 1회에 명확히 답하고 수락(윤곽 카탈로그 + deferred 포함)"
about: "계획 게이트에서 3단계 깊이(윤곽/설계/구현) 옵션을 미리보기로 구체화 — 왕복 없이 1회 결정 완료"
negative: []
what_went_well:
- "계획 게이트 AskUserQuestion에서 깊이 옵션을 추상 레이블이 아닌 산출물 차이(미결질문 남김 vs DDL/API까지 vs 코드 직접) 미리보기로 구체화했고, 사용자가 1회 수락으로 범위 확정. 재호출 없이 완료."
- "orchestrator가 산출 카테고리를 backlog로 추정했다가 document-category-classification.md §backlog('확정 로드맵 제외' 명시)를 읽고 work-log로 자체 정정(§2.3). 분류기준 문서가 의도대로 작동함."
- "requirements-advisor가 코드 대조(GamesMapper, GameCommentsMapper, UploadResourceConfig)를 수행해 '결합/의존' 섹션 정확도를 높임. 분류 문서 없이 추정만 했다면 결합표가 부정확했을 것."
what_to_improve:
- "orchestrator가 분류기준 문서를 읽기 전에 backlog를 추정 출력했다가 정정한 패턴이 재현 가능. 문서 카테고리 결정은 산출 시점이 아니라 배치 전 document-category-classification.md 조회 후 결정하는 순서를 고정해야 한다."
memory_candidates:
- name: doc-category-read-before-placement
type: feedback
description: "문서 산출 카테고리는 document-category-classification.md를 읽은 후 결정한다 — 추정 먼저 출력 금지"
body_draft: |
orchestrator가 docs/ 산출물 배치 카테고리를 결정할 때, document-category-classification.md를 확인하기 전에 추정값을 먼저 사용하면 정정 사이클이 발생한다.
**Why:** 2026-06-17 세션(20260617-172407)에서 W3 골자 기획 문서를 backlog로 추정했다가, document-category-classification.md §backlog("확정된 로드맵 제외")를 읽고 work-log로 정정. 분류기준이 명문화돼 있어 조회만 했으면 첫 판단이 정확했을 것.
**How to apply:**
- 산출 문서를 처음 배치할 때 조건 판단 전에 document-category-classification.md를 먼저 읽는다.
- 빠른 결정 순서(§빠른 결정 순서)를 따라 해당 카테고리를 선택한 후 배치한다.
- 추정이 맞더라도 근거 없는 추정은 report.md Decisions에 기록하지 말고 조회 후 기록한다.
- 적용 조건: docs/ 하위 신규 문서 배치 시 전건 적용.
rationale_for_saving: "분류기준 문서가 존재하지만 '먼저 읽어야 한다'는 절차는 CLAUDE.md나 프로토콜에 명시되어 있지 않음. orchestrator가 추정-정정 사이클을 반복할 수 있는 구조적 빈틈. 재현 가능성 높음."
signal_source: observation
docs_sync_target: /Users/wemadeplay/workspace/stz/bibimbap/docs/development/agent-team-protocol.md
- name: plan-gate-depth-preview-single-pass
type: feedback
description: "계획 게이트에서 깊이/범위 옵션을 산출물 차이 미리보기로 구체화하면 1회 수락으로 이어진다"
body_draft: |
AskUserQuestion의 깊이/범위 옵션을 추상 레이블만으로 제시하면 추가 질문이 발생하지만, 각 옵션 선택 시 실제 산출물이 어떻게 달라지는지를 2~3줄 미리보기로 포함하면 왕복 없이 결정 완료된다.
**Why:** 2026-06-17 세션(20260617-172407)에서 W3 골자 깊이를 "윤곽 카탈로그 / 설계 완결 / 구현 착수"로 구분하고 각 옵션의 산출물 차이(미결질문 남김 여부, DDL/API 포함 여부, 코드 직접 작성 여부)를 미리보기로 제시. 사용자가 재질의 없이 1회 수락(윤곽 카탈로그 + deferred 포함).
**How to apply:**
- 깊이/범위 옵션 ≥ 2이고, 선택이 이후 작업량과 산출 형식을 크게 바꾸는 경우에 적용.
- 옵션별로 "이 옵션을 선택하면 X가 포함되고 Y는 다음 세션으로" 형식의 2~4줄 비교를 포함한다.
- 전체 설계 공유는 과잉 — 선택 기준이 되는 핵심 차이만 기술한다.
- 기존 memory `preview-requery-pattern`(agent-team-protocol 프로젝트)과 동일 패턴. 중복 후보 — 해당 memory가 bibimbap 프로젝트에도 적용 가능한지 orchestrator가 판단 후 신규 저장 여부 결정.
rationale_for_saving: "agent-team-protocol 프로젝트에 `preview-requery-pattern`으로 이미 존재. bibimbap 프로젝트 memory에는 없으나, 패턴 자체는 기존 memory와 중복. orchestrator가 프로젝트별 memory 저장 필요성을 판단해야 하므로 후보로 올려 위임."
signal_source: positive
conflicts_with: preview-requery-pattern (agent-team-protocol 프로젝트)
docs_sync_target: null
protocol_feedback: []
applied_changes:
- "memory_candidates 2건 검토 → 둘 다 미수용(보류)."
- "후보1 doc-category-read-before-placement: 기존 CLAUDE.md docs-first 정책('작업 시작 전 카테고리 index→구체 문서')에 내포된 교훈. 위반은 단발 실수(self-caught, 비용 0). docs_sync_target(플러그인 번들 agent-team-protocol.md)은 §6 ~/.claude 수정 금지 + bibimbap 경로 부재로 부적합. 신규 MEMORY 불필요."
- "후보2 plan-gate-depth-preview-single-pass: 일반 UX 패턴, agent-team-protocol 프로젝트 preview-requery-pattern 중복, 프로젝트 특정성 없음. bibimbap 중복 저장 가치 낮음."
```
# Closeout
- ended_at: 2026-06-17T17:40:00+09:00
- 미커밋 잔여(커밋 정책 = 사용자 명시 요청 시): docs/work-log/index.md(M), docs/work-log/2026-06-17-w3-feature-skeletons.md(??), .atp/work-session/20260617-172407/(??). 사용자 커밋 결정 대기.
- project-gate: skip: no-project-gate (코드 0줄, 런타임 게이트 무의미).

View File

@ -0,0 +1,185 @@
---
phase: requirements
agent: requirements-advisor
agent_version: 1
generated_at: 2026-06-17T18:10:00+09:00
concerns: []
concerns_checked: true
---
# W3 사이트 플랫폼 — 5개 서브기능 골자 카탈로그
## 원 요청
bibimbap(Spring Boot + MyBatis + JSP, Java 21) 프로젝트에서 W3(사이트 플랫폼 워크스트림) 5개 서브기능의 "골자(skeleton)" 카탈로그를 작성한다. 깊이는 윤곽 카탈로그로 확정. 미결질문은 해소하지 않고 목록으로 남긴다.
---
## 코드 현황 요약 (확인 결과)
확인 파일 근거:
1. **`games` 테이블 현황** — `GamesMapper.java`: id, user_id, name, creator_note, git_url, webgl_path, thumbnail_url, like_count, is_visible, sort_order, created_at, updated_at. 태그 컬럼 없음. 검색은 name/display_name/creator_note ILIKE 방식만 존재.
2. **`game_comments` 현황** — `GameCommentsMapper.java`: id, game_id, nickname, content, created_at, deleted_at, is_delete. 로그인 연동 없이 nickname 자유입력. content 글자수 제한 없음(DB 컬럼 타입 미확인). **review 테이블 없음(신규)**, **tag 테이블 없음(신규)**.
3. **권한 현황**`UserData.java``role` 필드 존재. `UserController.java``ROLE_USER = "USER"` 상수만. **Interceptor 클래스 없음** — 인터셉터 미구현, 권한 게이트 없음(W3-3 포스터 게이트가 얹힐 자리 미비).
4. **`index.jsp` 현황** — 게임 카드 그리드 + 텍스트 검색(ILIKE). 잼 출품작 노출 없음. 섹션 단일(일반 게임만).
5. **WebGL 업로드 현황**`GameUploadController.java`: `/api/game-files/webgl-zip` 이미 구현. zip-slip 방어·엔트리 수 상한(8000)·압축 해제 크기 상한(512MB) 적용됨. `/game/{uuid}/` 경로 배치 구현. **단, 로그인 체크만 있고 권한 체크 없음. `/game/**` 정적 파일 핸들러가 `UploadResourceConfig.java`에 미등록** — `/profile/**`만 등록, `/game/**` 핸들러 누락 확인.
---
## 기능 요구 (FR)
### W3-1 — 태그 + 검색
- **목적**: 일반 게임 발견성 향상이 1차. 잼 용도(진행 회차 강조, 이전 회차 검색)는 부수 기능.
- **핵심 동작**: 게임/잼에 태그를 붙이고, 태그로 필터링 검색한다. 기존 텍스트 검색과 병행.
- **결합/의존**:
- `games` 테이블에 태그 연결 → 신규 `tags` + 조인테이블 필요(기존 코드에 없음, 신규).
- 잼 태그 연결은 W2 게임잼 엔티티(`jams` 테이블) 존재 후에만 가능 — 잼 부분은 W2 선행 의존.
- 단독 게임 태그 검색은 W2와 무관하게 독립 착수 가능.
- `GamesMapper.searchVisibleGames`: 현재 ILIKE 방식 — 태그 필터 추가 시 쿼리 확장 필요.
- **주요 미결질문**:
- Q1: 태그 관리 방식 — 자유입력(사용자 생성)인가, 운영자 사전 정의 목록인가, 혼합인가?
- Q2: 태그당 게임 수 제한·태그명 최대 길이·허용 문자셋은?
- Q3: 잼 전용 태그와 게임 공용 태그를 같은 `tags` 테이블로 통합하는가, 분리하는가?
- Q4: 태그 검색 결과 정렬 기준(좋아요순/최신순/태그 일치도)은?
- Q5: 다중 태그 AND/OR 조합 검색을 지원하는가?
- **후속 진입점**: design-advisor
---
### W3-2 — 댓글 / 리뷰 분리
- **목적**: 모든 게임 페이지의 일반 기능. 잼 평가기간 게이트 없음, 잼 독립.
- **핵심 동작**: 기존 `game_comments`(닉네임 자유입력)를 로그인 사용자 연동 댓글로 전환하고, 별도 리뷰(게임당 1회, 완성도+종합 평점) 기능을 신설한다. W2-6 시상이 리뷰 평점을 단방향으로 집계한다.
- **결합/의존**:
- `game_comments` 테이블 기존 존재 — 단, nickname 자유입력 구조. 로그인 연동으로 변경 시 기존 데이터 처리 결정 필요(마이그레이션 우려 → concerns).
- `game_reviews` 테이블 — 신규, 없음.
- W2-6(시상)이 이 기능의 평점을 집계 — W2-6이 나중에 리뷰 평점 컬럼 계약을 요구함. W3-2 설계 시 집계 계약을 W2-3(평가 통합설계) 동결과 맞출 필요.
- 현재 content 길이 제한 미적용 — 200자 제한 신규 적용 필요.
- **주요 미결질문**:
- Q1: 기존 `game_comments`의 nickname 자유입력 레코드를 어떻게 처리하는가? (유지/마이그레이션/별도 표시)
- Q2: 댓글 수정·삭제는 작성자 본인만인가, 운영자도 가능한가? 현재 updateGameComment가 있으나 권한 체크 없음.
- Q3: 평점 척도 — 완성도 및 종합 각각 몇 점 만점인가? (예: 5점/10점)
- Q4: 리뷰는 수정 가능한가? 게임당 1회 제한이면 수정 허용 여부와 수정 이력 관리 방식은?
- Q5: W2-3 평가 통합설계와의 리뷰 평점 집계 계약을 W3-2 설계 단계에서 선확정해야 하는가, W2-3 동결 후 맞추는가?
- **후속 진입점**: design-advisor (W2-3 진행 상황 연계 확인 후)
---
### W3-3 — 포스팅 보드
- **목적**: 사이트 공지·블로그 + 외부링크 큐레이션. 별도 메뉴. 잼과 무관한 독립 콘텐츠 채널.
- **핵심 동작**: 포스터 권한자(W1 RBAC로 부여)만 작성. 카테고리(유니티블로그/세션/게임잼대상 후기인터뷰/뒤끝 개발팀) 선택. 일반 유저는 읽기만 가능.
- **결합/의존**:
- W1(포스터 권한) 선행 필요 — `UserData.role` 필드는 존재하나, 현재 Interceptor 없음. 포스터 권한 게이트를 얹을 인터셉터·어노테이션 인프라가 W1에서 구현돼야 함.
- `posts` 또는 `board_posts` 테이블 — 신규, 없음.
- `RecruitPostsMapper`/`RecruitController` 참고 가능(유사 게시판 패턴 기존 존재).
- **주요 미결질문**:
- Q1: W1 포스터 권한 인프라가 W3-3 착수 전에 완료돼야 하는가, 임시 하드코딩(role=="POSTER" 직접 체크)으로 먼저 구현하고 W1 완료 후 교체하는가?
- Q2: 카테고리는 DB 저장인가, 코드 enum 고정인가?
- Q3: 외부링크 큐레이션의 구체적 형태 — 링크 URL + 설명 텍스트만인가, OG 미리보기를 포함하는가?
- Q4: 포스팅 본문 형식 — 순수 텍스트인가, 마크다운/HTML 허용인가? (XSS 영향)
- Q5: 포스팅에 댓글(W3-2)을 붙일 수 있는가?
- **후속 진입점**: design-advisor (W1 진행 상황 확인 선행)
---
### W3-4 — 메인페이지 (게임 허브)
- **목적**: `index.jsp`를 게임 + 잼 출품작이 함께 노출되는 허브로 확장. 포스팅은 별도 메뉴이며 메인 통합 아님.
- **핵심 동작**: 현재 일반 게임 카드 그리드에 잼 출품작 섹션을 추가 노출. 진행 중인 잼 출품작 강조, 일반 게임과 시각적 구분.
- **결합/의존**:
- 현재 `index.jsp``GamesMapper.getVisibleGames()` / `searchVisibleGames()` 단일 소스 — 잼 출품작 섹션 추가 시 쿼리 확장 또는 분리 필요.
- W2 게임잼 엔티티(`jams` 테이블, 잼-게임 조인) 선행 의존 — 잼 출품작 노출 부분만. 일반 게임 허브 개선은 W2 없이 가능.
- W3-1 태그 검색 완료 시 메인 필터 UI 연동 가능(선택적 연계).
- **주요 미결질문**:
- Q1: 잼 출품작 섹션의 노출 조건 — 진행 중인 잼이 있을 때만 표시하는가, 항상 섹션을 보여주는가?
- Q2: 일반 게임과 잼 출품작이 같은 games 레코드를 재사용한다면, 메인에서 중복 노출 방지 정책은?
- Q3: 게임 정렬·추천 로직 — 현재 sort_order ASC + created_at DESC 그대로 유지인가, 허브로 개편 시 큐레이션/인기순 등 다른 기준을 도입하는가?
- Q4: 페이지네이션 또는 무한스크롤 도입 여부 — 현재 전체 목록 단일 조회.
- Q5: W2 완료 전 메인 개선을 일반 게임 허브 부분만 먼저 착수할 수 있는가? (단계적 착수 가능 여부)
- **후속 진입점**: design-advisor
---
### W3-5 — Unity WebGL 빌드 업로드 자동화 (deferred — 선행 조사 스텁)
- **목적**: 일반 게임 호스팅 자동화. 현 수동 호스팅 대체. 게임잼과 무관한 인프라.
- **현황**: `GameUploadController.java``/api/game-files/webgl-zip` 구현 존재. zip-slip 방어·크기 상한(512MB 압축 해제, 엔트리 수 8000) 적용. UUID 기반 `/game/{uuid}/` 배치 로직 구현. **단, `/game/**` 정적 리소스 핸들러가 `UploadResourceConfig.java`에 미등록** — `/profile/**`만 등록 확인.
- **선행 조사 필요 항목**:
- zip-slip 방어 충분성 검증 — 현 구현 `target.startsWith(targetDir)` 체크 존재하나, 심볼릭 링크·인코딩 우회 케이스 검토 필요.
- Unity WebGL 빌드 포맷 검증 — index.html 탐지 외 필수 파일(Build/*.data, Build/*.wasm, Build/*.js) 존재 여부 검증 범위.
- 업로드 크기/타입 상한 — 현재 압축 해제 후 512MB, zip 원본 크기 상한 미확인. Content-Type 검증이 MIME 헤더 + 확장자 이중 체크인지 검토.
- 저장 경로 boundary — `app.upload.game-storage-path` 설정값 외부 주입 시 경계 검증.
- `/game/**` 정적 핸들러 미등록 문제 — 현재 업로드 후 실제 서빙 경로 동작 미보장.
- 업로드 권한 게이트 — 현재 로그인 체크만, 권한 제한 없음(누구나 업로드 가능).
- 기존 레코드 덮어쓰기/삭제 정책 — UUID 재사용 시 처리.
- **주요 미결질문 (= 조사 항목)**:
- Q1: `/game/**` 정적 핸들러 미등록 — 의도적 누락인가, 버그인가? (현재 동작 확인 필요)
- Q2: 업로드 권한 범위 — 로그인 사용자 전체 허용인가, 특정 권한(W1)자만인가?
- Q3: 빌드 포맷 검증 수준 — index.html 존재 확인으로 충분한가, WebGL 필수 파일 구조 검증까지 하는가?
- Q4: 업로드 후 게임 등록 플로우 — 업로드와 `games` 테이블 등록이 별도 단계인가, 자동 연동인가?
- Q5: 스토리지 전략 — 현재 로컬 파일시스템, 향후 오브젝트 스토리지(S3 등) 전환 계획 있는가?
- **후속 진입점**: research-advisor (조사 완료 후 design-advisor)
---
## 비기능 요구 (NFR)
- **NFR-보안**:
- W3-3 포스팅: 포스터 권한 게이트 미구현 상태 — W1 인터셉터 선행 없이 착수 시 임시 role 체크로 XSS/권한 우회 위험 있음.
- W3-2 댓글: 현재 content 길이 제한 없음 — 200자 제한 서버사이드 검증 신규 적용 필요.
- W3-5 업로드: zip-slip 방어 존재하나 심볼릭 링크 우회 검토 미완.
- **NFR-호환성**: W3-2에서 기존 `game_comments` 닉네임 자유입력 레코드의 호환 처리 결정 필요(스키마 변경 강제 — concerns 이관).
- **NFR-운영**: W3-5 `/game/**` 정적 핸들러 미등록 — 현재 배포 시 게임 서빙 경로 동작 불명확.
- **NFR-성능**: W3-4 메인 — 현재 전체 목록 단일 쿼리. 게임 수 증가 시 페이지네이션 미적용 상태.
해당 없음 항목: 접근성(이 단계 스코프 외), i18n(한국어 단일 서비스).
---
## 스코프
- **포함**: W3-1~W3-5 각 기능의 목적·핵심 동작·결합 지점·미결질문 윤곽. 코드 현황 대조.
- **제외**: DDL/SQL, API 경로, 시퀀스 다이어그램, 구현 세부. W1·W2 자체 설계. W4 유저 배지.
---
## 가정 / 추측
- `game_comments`의 content 컬럼 타입은 TEXT로 추정 — 현재 코드에서 길이 제한 없으므로. 확정은 DB 스키마 직접 확인 필요.
- `UserData.role` 필드의 현재 허용값은 "USER" 확인, 다른 값(ADMIN/POSTER 등)은 코드에서 미확인 — 확정 필요.
- `RecruitPostsMapper` 패턴이 W3-3 포스팅 보드 구현 참고 대상으로 적합하다고 추정(유사 게시판 구조).
---
## 확정 필요 (오픈 질문 — 기능 인라인 목록 외 전체 수준)
- QG-1: W1 인터셉터 구현 완료 시점과 W3-3 포스팅·W3-5 업로드 권한 게이트 착수 순서 — W1이 늦어질 경우 임시 role 직접 체크 허용 여부.
- QG-2: W3-2 댓글의 기존 닉네임 자유입력 레코드 처리 — 마이그레이션, 유지, 또는 레거시 표시?
- QG-3: W3-5의 `/game/**` 정적 핸들러 미등록이 의도적인지 확인 — 현재 WebGL 서빙이 실제로 동작하는지.
---
## 워크스트림 결합 요약
| 기능 | 결합 대상 | 결합 방식 | 독립 출시 가능? |
|---|---|---|---|
| W3-1 태그+검색 | W2(게임잼 엔티티) | 잼 태그 노출 시 의존, 게임 태그는 독립 | 부분 가능 (게임 태그 먼저) |
| W3-2 댓글/리뷰 | W2-6(시상 집계) | 리뷰 평점을 W2-6이 단방향 집계 | 가능 (잼 독립) |
| W3-3 포스팅 보드 | W1(포스터 권한/인터셉터) | 권한 게이트 의존 | W1 선행 필요 (또는 임시 체크) |
| W3-4 메인 허브 | W2(게임잼 엔티티) | 잼 출품작 섹션 노출 시 의존 | 부분 가능 (일반 게임 개선 먼저) |
| W3-5 WebGL 자동화 | 없음 (일반 인프라) | 독립 | deferred (선행 조사 후) |
---
## 착수 순서 제언
독립도 기준 추천 진입 순서(제언, 단정 아님):
**W3-2(댓글/리뷰 분리) 먼저** — W1/W2 무관 완전 독립, 기존 코드(`game_comments`) 위에 확장이므로 착수 비용 최소. 단, W2-3 리뷰 평점 집계 계약 조율은 병행 필요.
**다음 W3-1(태그+검색, 게임 태그 부분)** — 게임 태그 단독은 W2 불필요, 발견성 개선 즉시 효과.
**다음 W3-4(메인 허브, 일반 게임 부분)** — W2 없이 일반 게임 허브 개선 먼저 가능.
**W3-3(포스팅)** — W1 인터셉터 인프라 선행 후.
**W3-5(WebGL 자동화)** — 선행 조사 완료 후, deferred.

View File

@ -0,0 +1,19 @@
# W3-2 리뷰 — 사용자 선제 입력 (파킹, W3-2 진입 시 펼칠 것)
W3-1 Q4 "점수" 명확화 중 사용자가 선제로 준 리뷰 방향. W3-2 미결질문으로 편입 예정.
1. **리뷰 = 별점 평점 + 디테일 텍스트**
- 초기: 별점 5개(★5) 단일 평점 + 해당 게임 디테일 평가(서술형)
- → W3-1 의 "점수 정렬" = 이 별점 평점 기반으로 확정
2. **리뷰 단위 정책 (고민중 — W3-2 미결)**
- 업데이트 단위로 리뷰를 나눌지
- 나눠도 점수는 통합 평점으로 집계할지
3. **리뷰 고도화 (고민중 — W3-2 미결)**
- 여러 축 평가 → 게임 스탯을 그래프로 (육각형/레이더 차트 느낌)
- → 실현 시 "점수"가 단일값 아닌 다축 → W3-1 점수 정렬의 정렬키 의미가 W3-2 설계에 종속
## W3-1 로 되돌아오는 영향
- 점수 정렬키 = 리뷰 평점 기반 (W3-2 의존 확정, C6)
- 단일 평점 vs 다축(육각형) 여부는 W3-2 설계에서 확정 → W3-1 골자엔 "정렬 점수의 정확한 의미는 W3-2 종속"으로 남김

View File

@ -0,0 +1,136 @@
---
schema_version: 8
sid: 20260617-174635
resumed_from: 20260617-172407
started_at: 2026-06-17T17:46:35
ended_at: null
user_request: |
W3 골자(docs/work-log/2026-06-17-w3-feature-skeletons.md, status:draft, 미커밋)를
기능 하나씩(W3-1→W3-5) 함께 확정. 각 기능마다 초안 미결질문·결합해석을 항목별로 펼쳐
보여주고 keep/제거/수정/추가를 사용자에게 묻고, 합의된 것만 문서에 반영.
골자 내용(미결질문 선정·결합 해석·우선순위) 사용자 동의 없이 docs 확정 금지.
착수순서 제언은 5기능 합의 후 맨 마지막에 같이 확정.
제약: 객관 코드사실 유지 / 윤곽 카탈로그 깊이 / DDL·API·시퀀스 금지 /
미결질문은 해소 아닌 합의 목록으로 / 당장 구현 아님.
---
# Summary
W3 골자 카탈로그(5기능)를 사용자와 기능별·항목별 합의해 status:draft→confirmed 로 확정. orchestrator 직접 구동(advisor 전체 skip). 합의 과정에서 새 결합 3건 발굴: W3-1↔W3-2 양방향(리뷰수·점수 정렬), W3-4 잼 노출이 W3-1 잼 태그 검색으로 라우팅(배너+클릭), W3-3 외부 fetch 인프라(OG 미리보기+유니티블로그 피드 감시). 착수순서 W3-2→W3-1→W3-4→W3-3→W3-5 확정. 코드 변경 0.
# Invocations
[]
# Advisor Invocation Decision Log
# 각 advisor 호출/스킵 판단 즉시 1줄 append
- advisor: requirements-advisor
decision: skip
rationale: '초안에 미결질문이 이미 항목 열거됨. 사용자가 항목별 keep/제거/수정/추가를 직접 판정하는 대화 → orchestrator-사용자 직접 구동이 본분. advisor 가 사용자 대신 선정 불가.'
checked_at: 2026-06-17T17:46:35
- advisor: design-advisor
decision: skip
rationale: '윤곽 카탈로그 깊이 명시 제약(DDL/API/시퀀스 금지). 설계 산출 아님.'
checked_at: 2026-06-17T17:46:35
- advisor: implementation-advisor
decision: skip
rationale: '당장 구현 아님. 코드 0줄.'
checked_at: 2026-06-17T17:46:35
# Decisions
- 코드사실(tag/review 테이블 무·Interceptor 미구현·/game/** 핸들러 미등록 등)은 검증된 그대로 유지(사용자 제약).
- 미결질문은 해소하지 않고 합의된 목록으로만 정리(합의된 방향 + 잔여 미결 형식).
- 착수순서는 5기능 합의 후 마지막에 확정.
- W3-1: 태그 통합 1테이블, 정렬 매트릭스(태그 일치도 가중×2차키), 개발자 검색. 결합 C1~C7(C5 조회수·C6 W3-2의존·C7 user조인 신규).
- W3-2: 리뷰=별점5+서술, 다축 후속. 댓글 권한 작성자+운영자. 리뷰 수정=이력보존+"수정됨"표시. 평점 계약 W2-3 동결 후 정합. Q6(리뷰 단위) 신규. 기존 닉네임(QG-2) 미결 유지.
- W3-3: W1 완료 후 착수(임시 체크 안 함). 카테고리 DB. 본문 마크다운(sanitize). 외부링크 OG 미리보기. 유니티블로그=외부 피드 감시(Q6 신규). 댓글 안 붙임. 외부 fetch 인프라 결합 신규.
- W3-4: 잼 노출=별도 그리드 대신 검색창 아래 배너+신규작 강조→클릭 시 잼 태그 검색(W3-1). 현 정렬 유지. 페이지네이션 도입. 단계 착수 가능.
- W3-5: deferred 유지. 조사 항목 7개 유지. 업로드 권한·QG-3 조사 단계로.
- 착수순서 확정: W3-2 → W3-1 → W3-4 → W3-3 → W3-5.
# Open Items
- 미커밋(커밋은 사용자 지시 대기 — 프로젝트 커밋 정책):
- docs/work-log/2026-06-17-w3-feature-skeletons.md (??) — 5기능 합의 반영 완료, status:confirmed
- docs/work-log/index.md (M) — W3 엔트리 status confirmed 동기화
- .atp/work-session/20260617-174635/ (??) — 본 세션 산출(report + w3-2 리뷰 파킹 노트)
- .atp/work-session/20260617-172407/ (??) — 직전(초안 생성) 세션 산출
- W3 잔여 미결(착수 시 design 단계 확정): 각 기능 *잔여* 항목 + QG-1(W3-5 임시체크)·QG-2·QG-3
# user_signals
positive: []
negative:
- quote: '너무 축약적이라 W3-1에 대한 질문이 뭔질 모르겠어'
structural: true # 회고에서 재분류 — 압축 경향이 결정 제시 단계로 누수되는 메커니즘은 재현 가능(§2.3 (c))
note: 'W3-1 마무리 질문을 ID 약어(C3/C6/(가))·표로 과압축해 사용자가 질문 내용을 파악 못 함. caveman 압축 경향이 사용자 대면 의사결정 제시에 번진 것. 결정 제시는 항상 배경+선택지+권장을 풀어 쓴다. memory_candidate decision-prompt-no-compression-spell-out + protocol_feedback 연결.'
checked_at: 2026-06-17T17:52
# verified_by_me
- 코드 변경 0줄(src/pom.xml 클린) → L1/L2 검증 스크립트 비해당. verification-advisor skip: no-code.
- 문서 일관성 자체검증: 최종 W3 doc 전문 재독 — 결합표 5행 ↔ 각 기능 결합/의존 정합, QG-1~3 ↔ 기능별 Q 정합, 착수순서 ↔ 의존 사슬 정합 확인.
- work-log/index.md 의 W3 doc 엔트리 status draft→confirmed 동기화 완료.
# needs_user_verification
- (선택) 커밋 여부 — 아래 open_items 참조. 사용자 지시 시 커밋.
# graph_refresh
skip: no-scope-change — 코드 변경 0(docs only). src scope 그래프 영향 없음. (atp-graphify add-on 존재하나 scope 변경 없어 비실행.)
# Retrospective
Retrospective:
signals:
positive:
- quote_or_paraphrase: '(풀어쓰기 전환 후) 항목별로 자유텍스트 + AskUserQuestion 팝업을 혼용해 막힘 없이 답변'
about: 'orchestrator 가 약어/표 과압축에서 배경+선택지+권장 풀어쓰기로 전환한 직후의 의사결정 제시 — 교정이 즉효였음을 사용자 응답 흐름이 검증'
- quote_or_paraphrase: '5기능 항목별 keep/제거/수정/추가 합의가 advisor 재호출 없이 끝까지 완료'
about: 'advisor 전체 skip + orchestrator 가 사용자와 직접 구동한 결정 (사용자 대신 선정 불가한 합의 대화는 orchestrator 직접 구동이 본분)'
- quote_or_paraphrase: '항목별 펼침 대화에서 W3-1↔W3-2(C6), W3-4→W3-1 잼태그 라우팅 등 결합 3건을 사용자가 받아들이고 문서 반영'
about: '미결질문을 ID 압축 대신 기능별·항목별로 펼쳐 보여준 진행 방식 — 기능 간 결합을 표면화하는 효용이 검증됨'
negative:
- quote_or_paraphrase: '너무 축약적이라 W3-1에 대한 질문이 뭔질 모르겠어'
about: 'orchestrator 가 W3-1 마무리 결정을 ID 약어(C3/C6/(가))·표로 과압축해 사용자가 질문 내용을 파악 못 함. caveman 압축 경향이 사용자 대면 의사결정 제시 단계로 번짐'
structural: true # report.md user_signals 엔 false 로 기록됐으나, 압축 출력이 결정 제시 단계로 누수되는 메커니즘은 재현 가능 → 회고에서 structural 로 재분류
what_went_well:
- 압축 과밀 신호를 받은 직후 배경+선택지+권장 풀어쓰기로 전환했고, 사용자가 곧바로 매끄럽게 항목별 응답(자유텍스트 + AskUserQuestion 혼용) → 회복 탄력성 양호.
- advisor 3종(requirements/design/implementation) 전체 skip 판단이 적절했고(사용자 직접 합의 대화·윤곽 카탈로그 깊이 제약·코드 0줄), 그 결과 재호출 없이 5기능 합의 완료.
- 자유텍스트와 AskUserQuestion 팝업을 혼용해 사용자가 형식에 갇히지 않고 답하게 함.
- 미결질문을 기능별·항목별로 펼친 진행이 W3-1↔W3-2·W3-4→W3-1 등 기능 간 결합 발굴을 표면화.
- 코드 0줄에 맞춰 L1/L2·verification-advisor·graph_refresh 비실행 판단이 일관됨(문서 일관성 자체검증으로 대체).
what_to_improve:
- 사용자 대면 의사결정 제시문(질문)에 출력 압축(약어·ID 참조·표 과밀)을 적용하지 말 것. 결정 제시는 항상 배경 → 선택지 → 권장을 풀어 쓴다. 압축은 에이전트 간 내부 산출물·로그·요약에 한정.
- 첫 제시부터 풀어쓰기를 기본값으로 삼고, 압축형은 사용자가 명시 요청(예: "요약만") 했을 때만 사용. 신호를 받은 뒤 전환하는 것은 1회 왕복 비용을 발생시킴.
memory_candidates:
- name: decision-prompt-no-compression-spell-out
type: feedback
description: 사용자 대면 의사결정 제시문(질문)에는 caveman/약어 압축을 적용하지 말고 배경+선택지+권장을 풀어 쓴다. 압축은 내부 산출물 한정.
body_draft: |
W3 골자 합의 세션(20260617-174635)에서 orchestrator 가 W3-1 마무리 질문을
ID 약어(C3/C6/(가))와 표로 과압축해 제시 → 사용자: "너무 축약적이라
W3-1에 대한 질문이 뭔질 모르겠어". 풀어쓰기로 전환하니 즉시 매끄럽게 답변.
**Why:** 출력 토큰을 줄이려는 압축 경향(caveman 류)이 사용자가 *답을 줘야 하는*
의사결정 제시문으로 번지면, ID 참조·표는 작성자에겐 자명해도 사용자에겐
"무엇을 묻는지" 자체가 불투명해진다. 압축의 적용 대상 경계가 잘못 그어진 것.
에이전트 간 내부 산출물·로그·요약은 압축이 ROI 양수지만, 사용자 결정 제시는
파악 실패 → 재질의 왕복 비용이 압축 절감을 초과한다.
**How to apply:** 사용자에게 결정/선택을 요청하는 제시문은 항상
① 배경(왜 묻는지, 무엇에 걸린 결정인지) ② 선택지(각 옵션을 ID 가 아닌 문장으로)
③ 권장(있으면 이유와 함께) 을 풀어 쓴다. ID 약어·교차참조표는 *보조*로만 병기.
압축형은 사용자가 "요약만" 등 명시 요청했을 때만. AskUserQuestion 팝업을 쓰더라도
옵션 라벨/설명은 자기완결적이어야 한다(외부 표 참조 금지).
관련: caveman-bundle-compression-roi-ceiling(번들 정적 압축 ROI 천장 — 적용 *대상* 축은 다르나 둘 다 압축 적용 경계 교훈).
rationale_for_saving: 코드/문서로 유도 불가하고 관찰로만 드러나는 출력 스타일 교훈. 동일 메커니즘(압축 경향의 결정 제시 단계 누수)이 어떤 대면 대화에서도 재발 가능. bibimbap 프로젝트 첫 memory.
signal_source: negative
docs_sync_target: null # 내부 작업 흐름(에이전트 출력 스타일) 교훈 → MEMORY 단독. 단 protocol_feedback 로 ATP 출력 규약 반영 제안 별도.
protocol_feedback:
- agent-team-protocol 의 출력 스타일/압축 규약에 "사용자 대면 의사결정 제시문은 압축 비적용(배경+선택지+권장 풀어쓰기)" 예외 규칙을 명문화 제안. caveman/토큰 다이어트 지침이 있다면 그 적용 범위를 "에이전트 간 내부 산출물·로그·요약"으로 한정하고, 사용자 질문/AskUserQuestion 옵션 라벨은 자기완결 서술을 요구하도록 가드 추가. (structural negative 신호에서 도출)
applied_changes: []
# ended_at
2026-06-18

View File

@ -0,0 +1,165 @@
---
kind: work-log
title: W3 사이트 플랫폼 — 기능별 골자 카탈로그
description: W3(사이트 플랫폼 워크스트림) 5개 서브기능(W3-1 태그+검색 / W3-2 댓글·리뷰 / W3-3 포스팅 보드 / W3-4 메인 허브 / W3-5 Unity업로드 deferred)의 골자. 기능당 목적·핵심동작·결합/의존·미결질문·후속진입점. 윤곽 카탈로그 깊이 — 미결질문 해소 안 하고 남김. 당장 구현 아님, 착수 전 굳혀두는 기획 메모.
status: confirmed
source_roadmap: 2026-06-17-jam-platform-roadmap.md
source_session: 20260617-172407
confirmed_session: 20260617-174635
confirmed_at: 2026-06-18
created_at: 2026-06-17
owner: art
---
# W3 사이트 플랫폼 — 기능별 골자 카탈로그
상위 로드맵: [2026-06-17-jam-platform-roadmap.md](./2026-06-17-jam-platform-roadmap.md) §W3.
**깊이**: 윤곽 카탈로그. 기능당 목적·핵심동작·결합/의존·미결질문·후속진입점만 굳혀둔다. DDL/API 계약/시퀀스는 기능별 착수(design) 단계에서. **미결질문은 해소하지 않고 남긴다** — 골자의 목적은 "무엇을/왜 + 무엇이 미결인지"를 1페이지로 굳히는 것. 당장 구현 아님.
> W3 전부 잼 일정 독립(독립 출시 가능). 게임잼(W2)은 W3 기능의 소비자 중 하나일 뿐.
---
## 코드 현황 (착수 전 확인된 결합점)
골자의 "결합/의존" 정확도를 위해 현 코드베이스를 대조했다. file 근거:
1. **`games` 테이블** (`GamesMapper.java`) — id, user_id, name, creator_note, git_url, webgl_path, thumbnail_url, like_count, is_visible, sort_order, created_at, updated_at. **태그 컬럼 없음.** 검색은 name/creator_note ILIKE 방식만.
2. **`game_comments`** (`GameCommentsMapper.java`) — id, game_id, **nickname(자유입력)**, content, created_at, deleted_at, is_delete. 로그인 연동 없음. content 길이 제한 없음. **review 테이블·tag 테이블 모두 없음 → W3-1·W3-2 구조 전부 신규.**
3. **권한 인프라**`UserData.role` 필드 존재, `UserController``ROLE_USER="USER"` 상수만. **Interceptor 클래스 없음** (`WebMvcConfigurer` 구현체에 `addInterceptors` 없음). W3-3 포스터 게이트가 얹힐 자리 미비 → W1 의존 강화.
4. **`index.jsp`** — 게임 카드 그리드 + 텍스트 검색(ILIKE) 단일 섹션. 잼 출품작 노출 없음.
5. **WebGL 업로드** (`GameUploadController.java`) — `/api/game-files/webgl-zip` 이미 구현. zip-slip 방어·엔트리 수 상한(8000)·압축 해제 크기 상한(512MB)·UUID 기반 `/game/{uuid}/` 배치 적용. **단 (a) 로그인 체크만, 권한 체크 없음 (b) `/game/**` 정적 핸들러가 `UploadResourceConfig.java` 에 미등록** — `/profile/**` 만 등록. → 서빙 경로 동작 미보장(QG-3, 의도/버그 미확인).
---
## 기능별 골자
### W3-1 — 태그 + 검색
- **목적**: 일반 게임 발견성 향상이 1차. 잼 용도(진행 회차 강조, 이전 회차 검색)는 부수.
- **핵심 동작**: 게임/잼에 태그를 붙이고 태그로 필터 검색(기존 텍스트 검색과 병행). 개발자(제작자) 검색 지원. 정렬은 태그 일치도 가중 × 2차 정렬키(좋아요/최신/방문수/리뷰수/점수).
- **결합/의존**:
- C1: 신규 `tags` + 조인테이블 필요(현 코드에 태그 구조 없음). — 코드사실
- C2: 잼 전용 태그 연결은 W2 게임잼 엔티티 선행 의존.
- C3: 게임 태그 기본 기능은 W2 무관 독립 착수 가능. **단 정렬 일부는 의존** — 리뷰수·점수 정렬은 W3-2, 방문수 정렬은 신규 조회수 인프라.
- C4: `GamesMapper.searchVisibleGames` ILIKE 쿼리 확장 필요. — 코드사실
- C5: 방문수 정렬 → 신규 조회수 카운터 필요(games 에 `like_count`만, 조회수 컬럼 없음). — 코드사실
- C6: 리뷰수·점수 정렬 → W3-2(`game_reviews`) 의존. 정렬 점수의 정확한 의미(단일 평점 vs 다축)는 W3-2 설계 종속.
- C7: 개발자 검색 → `games.user_id` ↔ user 조인 확장.
- 태그 테이블 구조: **통합 1테이블 + 용도 구분(게임 공용/잼 전용)** 권장. 잼 태그 요건(W2) 확정 시 분리 재검토.
- **미결질문** (합의된 방향 + 잔여):
- Q1 태그 관리: 출시는 운영자 사전정의, 구조는 혼합(운영자 사전정의 + 사용자 생성) 지원. *잔여*: 사용자 생성 태그 개방 시점·승인 흐름.
- Q2 제한·허용: 태그당 게임 수·게임당 태그 수 제한 없음. 허용 조건은 보안(주입·XSS sanitize) + 욕설/금칙어 필터 통과. *잔여*: 태그명 길이·허용 문자셋 구체값, 금칙어 사전 출처.
- Q3 테이블 구조: 통합 1테이블 채택(위 결합/의존). *잔여*: 잼 태그 요건 확정 시 분리 여부.
- Q4 정렬: 태그 미선택=최신순(기본), 태그 미선택+좋아요=전체 좋아요순, 태그 선택=태그 일치도 가중+2차키(최신/좋아요/방문수/리뷰수/점수). *잔여*: 태그 일치도 가중 계산·동률 처리는 design 단계.
- Q5 다중 태그·개발자 검색: 다중 태그 AND/OR 지원 + 개발자(제작자) 검색 추가. *잔여*: AND/OR 노출·입력 방식은 design 단계.
- **후속 진입점**: design-advisor
### W3-2 — 댓글 / 리뷰 분리
- **목적**: 모든 게임 페이지 일반 기능. 잼 평가기간 게이트 없음, 잼 독립.
- **핵심 동작**: 기존 `game_comments`(닉네임 자유입력)를 로그인 사용자 연동 댓글로 전환 + 별도 리뷰(게임당 1회) 신설. 리뷰 = **별점 5점 평점 + 서술 평가**, 다축(육각형 레이더)은 후속 확장 여지. W2-6 시상이 리뷰 평점을 **단방향 집계**. 댓글 content 200자 제한 신규.
- **결합/의존**:
- ①: `game_comments` 기존 존재 — 닉네임 자유입력, 로그인 연동 없음 → 로그인 연동 전환 시 기존 데이터 처리 결정 필요. — 코드사실
- ②: `game_reviews` 신규 (review 테이블 없음). — 코드사실
- ③: W2-6 시상이 리뷰 평점을 단방향 집계 → W2-3(평가 통합설계) 동결과 정합 필요. — 해석
- ④: 댓글 content 200자 제한 신규 (현 `game_comments` content 길이 제한 없음). — 코드사실
- ⑤: W3-1 의 리뷰수·점수 정렬이 W3-2(평점·리뷰수)에 의존 — W3-1 C6 의 역방향. — 신규
- **미결질문** (합의된 방향 + 잔여):
- Q1 기존 닉네임 레코드 처리: **미결로 유지** (전체수준 QG-2 사안 — 골자 단계 해소 보류).
- Q2 댓글 수정·삭제 권한: 작성자 본인 + 운영자. *잔여*: `updateGameComment` 권한 체크 신규 적용 범위는 design.
- Q3 평점 척도: 별점 5점(초기 단일), 다축(육각형) 후속 확장 여지. *잔여*: 다축 시 축 구성·완성도/종합 분리 여부는 design.
- Q4 리뷰 수정: 수정 가능 + 이력 보존, 노출은 "수정됨" 마커만 표시. *잔여*: 이력 열람 권한은 design.
- Q5 W2-3 평점 집계 계약: W2-3 동결 후 정합 (W3-2 선확정 안 함).
- Q6 *(신규)* 리뷰 단위: 업데이트 단위 분리 여부 + 나눠도 통합 평점 여부 — 미결 유지.
- **후속 진입점**: design-advisor (W2-3 진행 연계 확인 후)
### W3-3 — 포스팅 보드
- **목적**: 사이트 공지·블로그 + 외부링크 큐레이션. **별도 메뉴**, 잼 무관 독립 채널.
- **핵심 동작**: 포스터 권한자(W1 RBAC 부여)만 작성, 일반 유저 읽기만(댓글 없음). 카테고리는 운영자가 추가/수정/삭제 가능(DB 저장). 본문은 **마크다운 류 여러 서식(sanitize)**. 외부링크 큐레이션은 **OG 미리보기 포함**. 유니티블로그는 고정 카테고리가 아니라 **외부 피드(레퍼런스) 감시 — 새 글 게시 감지 후 알림** 형태로 별도 취급.
- **결합/의존**:
- C1: **W1 선행 필요**`UserData.role` 존재하나 Interceptor 미구현. 권한 게이트 인프라가 W1 에서 구현돼야 함. — 코드사실
- C2: `posts`/`board_posts` 신규.
- C3: `RecruitPostsMapper`/`RecruitController` 유사 게시판 패턴 참고 가능. — 코드사실(참고)
- C4: *(신규)* 외부 fetch 인프라 — OG 미리보기 + 유니티블로그 피드 감시 → SSRF 방어·캐싱·실패처리·폴링 필요. — 신규
- **미결질문** (합의된 방향 + 잔여):
- Q1 착수 시점: **W1 완료 후 착수** (임시 role 직접 체크 안 함). → 전체수준 QG-1 의 W3-3 부분 결정. *(W3-5 권한 부분은 여전히 미결)*
- Q2 카테고리 저장: DB 저장 (운영자 추가/수정/삭제 가능).
- Q3 외부링크: OG 미리보기 포함. *잔여*: SSRF 방어·캐싱·실패처리 방식은 design.
- Q4 본문 형식: 마크다운 류 여러 서식(sanitize). *잔여*: 허용 서식 범위·sanitize 정책은 design.
- Q5 댓글 부착: **붙이지 않음** (읽기 전용 채널). → W3-2 결합 없음.
- Q6 *(신규)* 유니티블로그 외부 피드 감시: 새 글 게시 감지 → 알림 형태. *미결*: 확인 방식(RSS/폴링)·알림 표면·갱신 주기.
- **후속 진입점**: design-advisor (W1 진행 확인 선행)
### W3-4 — 메인페이지 (게임 허브)
- **목적**: `index.jsp` 를 게임 허브로 확장 + 진행 중 잼 안내. 포스팅은 별도 메뉴(메인 통합 아님).
- **핵심 동작**: 평소엔 현 게임 카드 그리드 전체 노출(현 정렬 유지). 진행 중 잼 있을 때만 **검색창 아래에 "게임잼 진행 중" 안내 + 신규 출품작 강조**, 클릭 시 **게임잼 태그 검색(W3-1)으로 이동**. (별도 잼 섹션 그리드 아님.) 페이지네이션/무한스크롤 도입.
- **결합/의존**:
- C1: 현 `index.jsp``GamesMapper.getVisibleGames()`/`searchVisibleGames()` 단일 소스. — 코드사실
- C2: 잼 노출(검색창 아래 안내·신규작 강조·클릭 라우팅) = **W2(잼 엔티티·진행 상태) + W3-1(잼 태그 검색)** 의존. — 신규/해석
- C3: 일반 게임 허브 개선(페이지네이션·그리드)은 W2/W3-1 무관 독립.
- **미결질문** (합의된 방향 + 잔여):
- Q1 잼 노출 조건: 진행 중 잼 있을 때만.
- Q2 노출 형태: 별도 그리드 섹션 대신 검색창 아래 안내 배너 + 신규작 강조 → 클릭 시 잼 태그 검색. 평소 전체 게임 그대로. *(별도 그리드 없어 중복 노출 문제 해소)*
- Q3 정렬·추천: 현 정렬 유지(`sort_order` ASC + `created_at` DESC). 인기순은 후속.
- Q4 페이지네이션: 도입. *잔여*: 페이지네이션 vs 무한스크롤 택은 design.
- Q5 단계 착수: **단계 착수 가능** — 일반 허브(페이지네이션·그리드) 먼저, 잼 안내는 W2+W3-1 후.
- **후속 진입점**: design-advisor
### W3-5 — Unity WebGL 빌드 업로드 자동화 ⏸ deferred
> 골자 아님 — **선행 조사 스텁**. 조사 완료 후 골자/설계 진입.
- **목적**: 일반 게임 호스팅 자동화. 현 수동 호스팅 대체. 게임잼 무관 인프라.
- **현황**: 업로드 로직 부분 구현 존재(위 코드현황 5). zip-slip·크기상한·UUID 배치 됨. **권한 체크 없음 + `/game/**` 정적 핸들러 미등록.**
- **선행 조사 항목**:
- zip-slip 방어 충분성 — 현 `target.startsWith(targetDir)` 외 심볼릭 링크·인코딩 우회 케이스.
- WebGL 빌드 포맷 검증 범위 — index.html 외 필수 파일(Build/*.data, *.wasm, *.js) 존재 검증.
- 업로드 크기/타입 — zip 원본 크기 상한, Content-Type MIME+확장자 이중 체크 여부.
- 저장 경로 boundary — `app.upload.game-storage-path` 외부 주입 시 경계 검증.
- `/game/**` 정적 핸들러 미등록 — 서빙 동작 미보장(QG-3).
- 업로드 권한 게이트 — 현 로그인만, 권한 제한 없음.
- UUID 재사용 시 기존 레코드 덮어쓰기/삭제 정책.
- **착수 전 합의(이번 세션)**: 조사 항목 7개 그대로 유지. 업로드 권한 게이트는 QG-1 미결로 유지(조사 단계 확정). QG-3(`/game/**` 핸들러)는 코드 확인을 조사 단계로 미룸.
- **후속 진입점**: research-advisor → (조사 후) design-advisor
---
## 워크스트림 결합 요약
| 기능 | 결합 대상 | 결합 방식 | 독립 출시 |
|---|---|---|---|
| W3-1 태그+검색 | W2(잼 태그) + W3-2(리뷰수·점수 정렬) + 조회수 인프라(방문수 정렬) | 잼 태그·정렬 일부 의존, 게임 태그 코어는 독립 | 부분 (게임 태그 코어 먼저) |
| W3-2 댓글/리뷰 | W2-6(시상 집계) + W2-3(평점 계약 정합) + W3-1(정렬이 평점·리뷰수 소비) | 리뷰 평점을 W2-6 단방향 집계, W3-1 정렬이 역참조 | 가능 (댓글·리뷰 코어 독립, 평점 집계 계약은 W2-3 동결 후) |
| W3-3 포스팅 보드 | W1(포스터 권한/인터셉터) + 외부 fetch 인프라(OG·유니티블로그 피드) | 권한 게이트 의존, W1 완료 후 착수(임시 체크 안 함) | W1 선행 |
| W3-4 메인 허브 | W2(잼 엔티티·진행 상태) + W3-1(잼 태그 검색 라우팅) | 잼 안내·신규작 강조→잼 태그 검색 의존, 일반 허브는 독립 | 부분 (일반 허브 먼저, 잼 안내는 W2+W3-1 후) |
| W3-5 WebGL 자동화 | 없음 (일반 인프라) | 독립 | deferred (조사 선행) |
---
## 착수 순서 제언 (단정 아님 — 이번 세션 합의)
> 의존 사슬: W3-2(평점 공급) → W3-1(정렬이 평점 소비) → W3-4(잼 안내가 잼 태그 검색으로 라우팅). W3-3·W3-5 는 W1 권한 게이트 선행.
1. **W3-2 댓글/리뷰** — 기존 `game_comments` 확장, 코어 완전 독립, 착수 비용 최소. 다른 기능의 평점 공급원. 평점 집계 계약만 W2-3 동결 후 정합.
2. **W3-1 태그+검색** — W3-2 뒤에 오면 리뷰수·점수 정렬까지 완성. 게임 태그 코어는 독립, 정렬 일부는 W3-2·조회수 인프라 의존.
3. **W3-4 메인 허브 (일반 부분 먼저)** — 페이지네이션·그리드 개선은 독립 선착수. 잼 안내(검색창 아래 배너→잼 태그 검색)는 W2+W3-1 후.
4. **W3-3 포스팅** — W1 Interceptor 선행(임시 체크 안 함 확정). OG·유니티블로그 외부 fetch 인프라 동반.
5. **W3-5 WebGL 자동화** — deferred, 선행 조사 완료 후.
---
## 전체 수준 미결질문 (착수 전 확정 필요)
- **QG-1**: W1 인터셉터 완료 시점과 권한 게이트 착수. **W3-3 은 W1 완료 후 착수(임시 role 직접 체크 안 함)로 확정.** W3-5 업로드 권한은 미결 유지(조사 단계 확정). *잔여*: W1 지연 시 W3-5 임시 체크 허용 여부.
- **QG-2**: W3-2 기존 닉네임 자유입력 레코드 처리 — 마이그레이션/유지/레거시 표시. **미결 유지 확정**(골자 단계 해소 보류).
- **QG-3**: W3-5 `/game/**` 정적 핸들러 미등록이 의도인지 버그인지 — 현 WebGL 서빙 실제 동작 확인 필요. **코드 확인을 조사 단계로 미룸 확정.**
---
## 다음 단계
골자 합의 완료(이번 세션 — 5기능 + 착수 순서). 각 기능을 실제 착수할 때 위 "후속 진입점" advisor 로 진입한다. 착수 전 해당 기능의 *잔여* 미결 + 관련 QG 를 먼저 확정한다. **착수 1순위 = W3-2 로 확정.**

View File

@ -5,3 +5,4 @@
## 목록 ## 목록
- [2026-06-17-jam-platform-roadmap.md](./2026-06-17-jam-platform-roadmap.md) — bibimbap 플랫폼 고도화 목적별 워크스트림 로드맵. 4개 W(W1 거버넌스/RBAC · W2 게임잼 · W3 사이트플랫폼 · W4 유저배지)+운영으로 재구조. 게임잼은 W2 하나. 의존성(빌드순서) 유지 + 잼일정 분리가능 여부 명시. S→W 매핑 + 150635 대비 교정 5건 포함. `status: active`, source_session: 20260617-150635, restructured_by: 20260617-162536. - [2026-06-17-jam-platform-roadmap.md](./2026-06-17-jam-platform-roadmap.md) — bibimbap 플랫폼 고도화 목적별 워크스트림 로드맵. 4개 W(W1 거버넌스/RBAC · W2 게임잼 · W3 사이트플랫폼 · W4 유저배지)+운영으로 재구조. 게임잼은 W2 하나. 의존성(빌드순서) 유지 + 잼일정 분리가능 여부 명시. S→W 매핑 + 150635 대비 교정 5건 포함. `status: active`, source_session: 20260617-150635, restructured_by: 20260617-162536.
- [2026-06-17-w3-feature-skeletons.md](./2026-06-17-w3-feature-skeletons.md) — W3(사이트 플랫폼) 5개 서브기능 골자 카탈로그. 기능당 목적·핵심동작·결합/의존·미결질문·후속진입점(윤곽 깊이, 미결 해소 안 함). 코드 현황 대조(tag/review 테이블 신규·Interceptor 미구현·`/game/**` 핸들러 미등록). 결합표 + 착수순서 제언(W3-2 1순위) + QG-1~3. 당장 구현 아님. `status: confirmed`(20260617-174635 세션서 5기능+착수순서 항목별 합의), source_session: 20260617-172407.