---
phase: implementation
agent: implementation-advisor
agent_version: 1
generated_at: 2026-06-29T10:30:00+09:00
workstream: W3-3-posting-board
---

# 파일 소유권 맵 (W3-3 포스팅 보드)

> 불변식: 동일 파일 정확히 1 worker. 파일 충돌 0. SSRF 보안핵심 단독 worker.
> Java 컴파일은 advisor 사후/verification 영역 — worker 는 파일 작성만. 시그니처는 설계서 확정값이라 타 클래스 참조 타입명 정확. 따라서 파일 독립이면 병렬 가능.

## Wave 1 (병렬 spawn, 파일 독립 — 동시 최대 6 준수)

| 파일 | 담당 worker | worker id | U-태그 | 변경 |
|---|---|---|---|---|
| docs/board-ddl.sql | migration-writer | w-schema | U-SCHEMA | create |
| db/schema.sql (append only, line 908 직후) | migration-writer | w-schema | U-SCHEMA | modify |
| data/PostData.java | code-writer | w-domain | U-DOMAIN | create |
| data/PostCategoryData.java | code-writer | w-domain | U-DOMAIN | create |
| data/UnityFeedSourceData.java | code-writer | w-domain | U-DOMAIN | create |
| data/UnityFeedItemData.java | code-writer | w-domain | U-DOMAIN | create |
| mapper/PostsMapper.java | code-writer | w-domain | U-DOMAIN | create |
| mapper/PostCategoriesMapper.java | code-writer | w-domain | U-DOMAIN | create |
| mapper/UnityFeedSourcesMapper.java | code-writer | w-domain | U-DOMAIN | create |
| mapper/UnityFeedItemsMapper.java | code-writer | w-domain | U-DOMAIN | create |
| pom.xml (jsoup 1.17.2 + commonmark 0.22.0) | code-writer | w-markdown | U-MARKDOWN | modify |
| service/PostMarkdownService.java | code-writer | w-markdown | U-MARKDOWN | create |
| test/.../PostMarkdownServiceTest.java | code-writer | w-markdown | U-MARKDOWN | create |
| security/SsrfSafeFetcher.java | code-writer | w-ssrf (보안핵심 단독) | U-SSRF | create |
| service/OgPreviewService.java | code-writer | w-ssrf (보안핵심 단독) | U-SSRF | create |
| test/.../SsrfSafeFetcherTest.java | code-writer | w-ssrf (보안핵심 단독) | U-SSRF | create |
| service/FeedParser.java | code-writer | w-feed | U-FEED | create |
| service/UnityFeedPoller.java | code-writer | w-feed | U-FEED | create |
| config/SchedulingConfig.java | code-writer | w-feed | U-FEED | create |
| test/.../FeedParserTest.java | code-writer | w-feed | U-FEED | create |
| test/.../UnityFeedPollerTest.java | code-writer | w-feed | U-FEED | create |
| controller/PostAdminController.java | code-writer | w-admin | U-ADMIN-CTRL | create |
| controller/UnityFeedAdminController.java | code-writer | w-admin | U-ADMIN-CTRL | create |
| views/admin-post-categories.jsp | code-writer | w-admin | U-ADMIN-CTRL | create |
| views/admin-unity-feeds.jsp | code-writer | w-admin | U-ADMIN-CTRL | create |

## Wave 2 (Wave1 후 — U-POST-CTRL + 테스트 + MockBean)

| 파일 | 담당 worker | worker id | U-태그 | 변경 |
|---|---|---|---|---|
| controller/PostController.java | code-writer | w-postctrl | U-POST-CTRL | create |
| views/posts-list.jsp | code-writer | w-postctrl | U-POST-CTRL | create |
| views/posts-detail.jsp | code-writer | w-postctrl | U-POST-CTRL | create |
| views/posts-form.jsp | code-writer | w-postctrl | U-POST-CTRL | create |
| views/header.jsp (append /posts 링크) | code-writer | w-postctrl | U-POST-CTRL | modify |
| test/.../PostControllerTest.java | code-writer | w-postctrl-test | (검증) | create |
| test/.../BibimbapApplicationTests.java (append @MockBean) | advisor 직접 | - | (검증) | modify |

## 계량 (최종)
- planned_workers: 8 (w-schema, w-domain, w-markdown, w-ssrf, w-feed, w-admin, w-postctrl, w-postctrl-test)
- actual_workers: 9 — 위 8 + JSP JSTL→scriptlet 변환 보정 worker 1 (계획 외 추가, 사유 아래)
- advisor 직접: BibimbapApplicationTests @MockBean append(병렬화 이득 0) + admin-unity-feeds JSP 잔존 점검(worker 가 최종 완료해 advisor 직접편집 불요로 귀결).

## 계획 외 추가 worker 사유 (JSP 변환 보정)
- U-ADMIN-CTRL / U-POST-CTRL worker 가 생성한 5개 JSP 가 `<%@ taglib c %>` + JSTL(`<c:out>` 등)을 사용했으나, 프로젝트에 JSTL 의존성이 전무(pom 0건 + ~/.m2 캐시 0건, 오프라인 빌드라 추가 불가)하여 런타임 JSP 변환 실패 위험.
- grounding 결과 기존 JSP 전부 scriptlet + HtmlUtils.htmlEscape 컨벤션. 설계 의도(출력 escape)는 동일 충족하되 메커니즘을 프로젝트 컨벤션으로 정렬하는 보정이 필요 → 단일 worker 로 5개 JSP 일괄 변환(일관성).

## 충돌 회피 근거
- db/schema.sql / header.jsp / BibimbapApplicationTests 는 기존+W3-1/4 보존 append-only.
- 각 파일 정확히 1 worker. 교차 소유 0.
- U-SSRF 단독 worker(보안핵심): SsrfSafeFetcher + OgPreviewService + Test 한 worker 격리.
