--- 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