---
phase: implementation
agent: implementation-advisor
agent_version: 1
generated_at: 2026-06-29T13:30:00+09:00
workstream: W4-유저 배지/평판
---

# W4 파일 소유권 맵 (충돌 0 — 1파일=1worker, 강결합 그룹만 묶음)

> 의존: B-SCHEMA → B-DOMAIN(data/enum/매퍼) → {B-SERVICE → B-HOOK/B-MANAGE/B-DISPLAY}. B-PERM 은 B-MANAGE 선행.
> 시그니처 사전 제공(설계 §신규 함수 시그니처)으로 wave 간 read 의존 제거 → wave 내 병렬 안전.

## Wave 1 (병렬 — 상호 독립)
| 파일 | worker | id | 유형 | B-* | 의존 |
|---|---|---|---|---|---|
| docs/badge-ddl.sql | migration-writer | w-001 | create | B-SCHEMA | - |
| db/schema.sql | migration-writer | w-001 | modify(append 말미) | B-SCHEMA | badge-ddl 사본(같은 worker 동기) |
| src/main/java/.../security/PermissionKeys.java | code-writer | w-002 | modify(enum +1) | B-PERM | - |
| src/main/java/.../badge/BadgeKeys.java | code-writer | w-003 | create | B-DOMAIN | - |
| src/main/java/.../data/BadgeData.java | code-writer | w-004 | create | B-DOMAIN | - |
| src/main/java/.../data/UserBadgeData.java | code-writer | w-004 | create | B-DOMAIN | - |
| src/main/java/.../data/UserBadgeKeyRow.java | code-writer | w-004 | create | B-DOMAIN | - |
| src/main/java/.../mapper/BadgesMapper.java | code-writer | w-005 | create | B-DOMAIN | - |
| src/main/java/.../mapper/UserBadgesMapper.java | code-writer | w-006 | create | B-DOMAIN | - |
| src/main/java/.../mapper/UserBadgesQueryMapper.java | code-writer | w-007 | create | B-DOMAIN | - |
| src/main/java/.../mapper/ReputationEventsMapper.java | code-writer | w-008 | create | B-DOMAIN | - |

## Wave 2 (B-DOMAIN 시그니처 의존 — 프롬프트에 시그니처 명시 → 병렬)
| 파일 | worker | id | 유형 | B-* | 의존 |
|---|---|---|---|---|---|
| src/main/java/.../badge/BadgeCatalogSeeder.java | code-writer | w-009 | create | B-DOMAIN | BadgeKeys(w-003)·BadgesMapper(w-005) 시그니처 |
| src/main/java/.../badge/ReputationService.java | code-writer | w-010 | create | B-SERVICE | ReputationEventsMapper(w-008)·BadgeService 시그니처 |
| src/main/java/.../badge/BadgeService.java | code-writer | w-011 | create | B-SERVICE | BadgeKeys·ReputationEventsMapper·UserBadgesMapper 시그니처 |

## Wave 3 (B-SERVICE 의존)
| 파일 | worker | id | 유형 | B-* | 의존 |
|---|---|---|---|---|---|
| src/main/java/.../controller/api/GameReviewController.java | code-writer | w-012 | modify(append 훅+배지부착) | B-HOOK+B-DISPLAY | ReputationService·UserBadgesQueryMapper 시그니처 |
| src/main/java/.../controller/api/GameController.java | code-writer | w-013 | modify(append 훅) | B-HOOK | ReputationService 시그니처 |
| src/main/java/.../controller/BadgeManageController.java | code-writer | w-014 | create | B-MANAGE | BadgeService·PermissionGate·PermissionKeys.BADGE_MANAGE 시그니처 |
| src/main/webapp/WEB-INF/views/game-detail.jsp | code-writer | w-015 | modify(JS 리뷰 배지 렌더) | B-DISPLAY | authorBadges 필드명(w-012) |
| src/main/webapp/WEB-INF/views/profile.jsp | code-writer | w-016 | modify(본인 배지 표시) | B-DISPLAY | - (profile 은 자체 조회 추가) |

## Wave 4 (검증 산출물 — 신규 컴포넌트 시그니처 의존)
| 파일 | worker | id | 유형 | 의존 |
|---|---|---|---|---|
| src/test/.../BibimbapApplicationTests.java | code-writer | w-017 | modify(@MockBean +5매퍼·+2서비스) | 신규 빈 이름 |
| src/test/.../service/BadgeServiceTest.java | code-writer | w-018 | create | BadgeService(w-011) |
| src/test/.../controller/BadgeManageControllerTest.java | code-writer | w-019 | create | BadgeManageController(w-014) |
| src/test/.../controller/api/GameReviewControllerTest.java | code-writer | w-020 | modify(훅 회귀 + 본흐름 불변) | GameReviewController(w-012) |

# 불변식 점검
- 동일 파일 1 worker only: OK.
- profile.jsp(w-016) ↔ game-detail.jsp(w-015): 별 파일, 충돌 0.
- GameReviewController(w-012): 훅(B-HOOK) + 배지부착(B-DISPLAY) 한 파일에 통합 → 1 worker 가 전 변경 담당(split 충돌 회피, ownership-w34 선례).
- BadgeData/UserBadgeData/UserBadgeKeyRow(w-004): 같은 data 디렉토리 POJO 3개 강결합 → 1 worker.
- 매퍼 4종은 각 1 worker(w-005~008): SQL 독립, 병렬 이득.

# 설계 편차(grounding 확정)
- **게임 카드 SSR 배지 부착 보류**: 설계 영향맵 line322 "GameController getVisibleGames creator 배지 부착" — 실제 getVisibleGames 호출지점 0(미사용 매퍼). 게임 카드는 WebMvcController hub(listVisibleKeyset/searchVisibleKeyset) + SearchController 가 SSR(index.jsp). 둘 다 W3-4/타 W 산출물 → 작업지시 §금지 "W3-1/3/4/5 산출물 접근 금지". 따라서 게임 카드 배지는 미구현, AC-8/AC-9 는 리뷰 작성자 배지(listReviews JSON+JS) + profile.jsp 로 충족. UserBadgesQueryMapper.listActiveBadgeKeysByUserIds 배치쿼리는 listReviews 에서 N+1 차단 입증.
- B-HOOK 의 GameController createGame 훅은 작업지시 "GameController append 허용" 명시 대상 → 진행.

planned_workers: 20
