12 KiB
팬Talk 팬레터 Resource 문구 변경 Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 크리에이터 채널 FanTalk 사용자 노출 문구를 기본/영어/일본어 resource에서 팬레터 계열 표현으로 통일한다.
Architecture: Android string resource 값만 수정한다. Resource key와 Kotlin/layout/drawable 식별자는 호환성 유지를 위해 그대로 둔다.
Tech Stack: Android XML string resources, Gradle :app:mergeDebugResources, repository docs workflow.
| 문서 항목 | 내용 |
|---|---|
| 상태 | 구현 완료 |
| 작성일 | 2026-08-14 |
| 요구사항 기준 | docs/20260814_팬Talk_팬레터_resource_문구_변경/prd.md |
| API 기준 | 없음 |
| 현재 Phase | Phase 1 완료 |
| 현재 활성 Goal | 없음 |
목표
크리에이터 채널의 FanTalk 탭/섹션/오류 문구가 한국어 팬레터, 영어 Fan Letter, 일본어 ファンレター로 표시된다.
현재 상태
| Phase | 상태 | 완료 Task | 활성/다음 Goal | 차단 또는 남은 조건 |
|---|---|---|---|---|
| 1 | 완료 | 2/2 |
없음 | 없음 |
범위
포함
app/src/main/res/values/strings.xml의 변경 대상 string 값 수정app/src/main/res/values-en/strings.xml의 변경 대상 string 값 수정app/src/main/res/values-ja/strings.xml의 변경 대상 string 값 수정- resource merge와 diff whitespace 검증
제외
- Resource key rename
- Kotlin class/package/method rename
- Layout id, drawable name, API, DTO, repository, ViewModel 변경
- 과거 PRD/plan-task 이력 문구 일괄 치환
- UI/계측 테스트와 기기·에뮬레이터 수동 조작
기술적 제약
- 기술 스택: Android XML string resources
- 아키텍처: 기존
creator_channel_*_fantalkkey를 유지하고 값만 변경한다. - 데이터·보안: 민감정보와 외부 API 변경 없음
- 호환성: 기존 resource 참조 경로를 유지한다.
- 테스트 범위: resource-only 변경이므로 신규 unit test를 작성하지 않는다.
- 검증:
rg,:app:mergeDebugResources,git diff --check로 실제 변경과 XML merge를 확인한다.
Phase 1
Phase 결과: 크리에이터 채널 FanTalk 관련 사용자 노출 resource 값이 팬레터 표현으로 바뀐다.
선행조건: PRD I18N-FANLETTER-001~004 확정.
Phase 완료 조건: P1-T1, P1-GATE 완료와 검증 기록 누적.
구현 항목
Task 1.1 Resource 값 변경
Goal 실행 P1-T1: 기본/영어/일본어 FanTalk 사용자 노출 string 값을 팬레터 표현으로 변경한다.
- 시작 조건: PRD
DEC-001,DEC-002확정. - 완료 증거: 변경 대상 string 값이 PRD 표와 일치하고 이전 기능명 표현이 대상 resource 값에 남지 않는다.
- 범위 밖: resource key rename, 코드 식별자 rename, 과거 문서 이력 수정.
- TDD 예외 사유: XML resource 값만 바꾸는 작업이라 실패 unit test를 작성할 로직 단위가 없다.
- 대체 검증 방법: 변경 전후
rg대조와 resource merge로 확인한다.
Files:
- Modify:
app/src/main/res/values/strings.xml - Modify:
app/src/main/res/values-en/strings.xml - Modify:
app/src/main/res/values-ja/strings.xml - Test: 없음
Interfaces:
-
Consumes: 기존
R.string.creator_channel_tab_fantalk,R.string.creator_channel_section_fantalk,R.string.creator_channel_fantalk_error_message참조 -
Produces: 같은 resource key의 새 표시 값
-
RED: 변경 전 대상 resource에 이전 기능명 표현이 존재함을 확인한다.
rg -n "팬Talk|팬톡|FanTalk|ファントーク" "app/src/main/res/values" "app/src/main/res/values-en" "app/src/main/res/values-ja"Expected:
creator_channel_tab_fantalk,creator_channel_section_fantalk,creator_channel_fantalk_error_message중 하나 이상에서 이전 표현이 출력된다. -
RED 확인: 변경 대상 key를 재확인한다.
rg -n "creator_channel_(tab|section)_fantalk|creator_channel_fantalk_error_message" "app/src/main/res/values" "app/src/main/res/values-en" "app/src/main/res/values-ja"Expected: 기본/영어/일본어 resource에서 세 key가 모두 출력된다.
-
GREEN: 아래 값으로 XML string 값을 수정한다.
<string name="creator_channel_tab_fantalk">팬레터</string> <string name="creator_channel_section_fantalk">팬레터</string> <string name="creator_channel_fantalk_error_message">팬레터를 불러오지 못했습니다.</string><string name="creator_channel_tab_fantalk">Fan Letter</string> <string name="creator_channel_section_fantalk">Fan Letter</string> <string name="creator_channel_fantalk_error_message">Could not load Fan Letter.</string><string name="creator_channel_tab_fantalk">ファンレター</string> <string name="creator_channel_section_fantalk">ファンレター</string> <string name="creator_channel_fantalk_error_message">ファンレターを読み込めませんでした。</string> -
GREEN 확인: 대상 resource 범위에서 이전 기능명 표현이 사라졌는지 확인한다.
rg -n "팬Talk|팬톡|FanTalk|ファントーク" "app/src/main/res/values" "app/src/main/res/values-en" "app/src/main/res/values-ja"Expected: 출력 없음. 코드 식별자나 layout id 검색은 이 확인 범위에 포함하지 않는다.
-
REFACTOR: 추가 정리 없이 변경 파일을 유지하고 resource merge를 실행한다.
./gradlew :app:mergeDebugResources git diff --checkExpected: 두 명령 모두 성공한다.
검증 방법
Phase 1 Gate
Goal 실행 P1-GATE: resource-only 변경과 제외 범위 준수를 최종 판정한다.
- 시작 조건:
P1-T1완료. - 완료 증거: 아래 명령 통과와 Progress 기록.
- 범위 밖: Gate 통과를 위한 코드 식별자 rename, 테스트 삭제·완화, 관련 없는 문구 수정.
rg -n "creator_channel_(tab|section)_fantalk|creator_channel_fantalk_error_message" "app/src/main/res/values" "app/src/main/res/values-en" "app/src/main/res/values-ja"
rg -n "팬Talk|팬톡|FanTalk|ファントーク" "app/src/main/res/values" "app/src/main/res/values-en" "app/src/main/res/values-ja"
./gradlew :app:mergeDebugResources
git diff --check
Expected: 첫 번째 명령은 변경된 팬레터 값만 출력한다. 두 번째 명령은 출력이 없다. Gradle resource merge와 whitespace check는 성공한다.
- 변경된 세 locale의 세 key가 PRD 값과 일치한다.
- 대상 resource에서 이전 기능명 표현이 출력되지 않는다.
./gradlew :app:mergeDebugResources가BUILD SUCCESSFUL로 통과한다.git diff --check가 출력 없이 통과한다.
실행 순서와 의존성
| 순서 | Goal | 선행조건 | 병행 가능 | 차단 시 다음 행동 |
|---|---|---|---|---|
| 1 | P1-T1 |
PRD 확정 | 아니요 | 변경 대상 key 재검색 후 계획 보정 |
| 2 | P1-GATE |
P1-T1 |
아니요 | 실패한 검증의 소유 Task로 회귀 수정 Task 추가 |
P1-T1 -> P1-GATE
변경 금지 항목
- Resource key를 변경하지 않는다.
- Kotlin, layout, drawable, API 관련 식별자를 변경하지 않는다.
- 과거 문서의 이력 문구를 일괄 치환하지 않는다.
- 신규 dependency를 추가하지 않는다.
- UI/계측 테스트나 기기·에뮬레이터 조작을 실행하지 않는다.
Decision Log
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 Goal/문서 |
|---|---|---|---|---|---|
| 2026-08-14 | DEC-001 |
확정 | 관련 기능명 표현 전체를 팬레터 계열로 변경한다. | 사용자 A안 선택 | P1-T1, prd.md |
| 2026-08-14 | DEC-002 |
확정 | 구현 범위는 string resource 값 변경으로 한정한다. | 사용자 요청과 최소 변경 원칙 | P1-T1, P1-GATE |
발견된 문제
| ID | 심각도 | 상태 | 발견 내용 | 영향 Goal | 처리 계획 |
|---|---|---|---|---|---|
| 없음 | Low | 해결 | 문서 작성 시점에 별도 문제 없음 | 없음 | 없음 |
Progress
기존 기록을 삭제하거나 덮어쓰지 않고 실제 실행 결과를 차수별로 누적한다.
문서 작성 1차 실행 — 2026-08-14
- 상태: 완료
- 무엇을: PRD와 구현 계획/TASK 문서를 생성했다.
- 왜: 저장소 규칙상 구현 전에 요구사항과 실행 계획을 확정해야 하기 때문이다.
- 어떻게:
rg -n "팬Talk|FanTalk" "app/src/main/res/values" "app/src/main/res/values-en" "app/src/main/res/values-ja"— 변경 후보 확인.rg -n "creator_channel_(tab|section)_fantalk|creator_channel_fantalk_error_message" "app/src/main/res/values" "app/src/main/res/values-en" "app/src/main/res/values-ja"— 기본/영어/일본어의 세 key 확인.
- 남은 항목:
P1-T1,P1-GATE실행. - 다음 행동: 사용자 승인 후 계획의
P1-T1부터 resource 값을 수정한다.
P1-T1 1차 실행 — 2026-08-14
- 상태: 완료
- 무엇을: 기본/영어/일본어의 세 FanTalk 표시 resource 값을 PRD의 팬레터 표현으로 변경했다.
- 왜: 사용자에게 노출되는 같은 기능명을 locale별로 일관되게 표시하기 위해서다.
- 어떻게:
- 변경 전 이전 표현 검색 — 한국어 3건, 영어 3건, 일본어 3건을 확인했다.
- 변경 후 대상 key 검색 — 한국어
팬레터, 영어Fan Letter, 일본어ファンレター와 각 오류 문구가 PRD 표와 일치했다. - 변경 후 이전 표현 검색 — 출력 없음으로 통과했다.
- 남은 항목:
P1-GATE. - 다음 행동: resource merge와 공백 검증을 실행한다.
P1-GATE 1차 실행 — 2026-08-14
- 상태: 완료
- 무엇을: resource merge, 공백 검사와 인접 debug unit test 상태를 확인했다.
- 왜: XML resource 유효성과 직접 영향 범위의 회귀 여부를 판정하기 위해서다.
- 어떻게:
./gradlew :app:mergeDebugResources—BUILD SUCCESSFUL in 8s, 7개 task 중 2개 실행·5개 up-to-date.git diff --check— 출력 없음으로 통과했다../gradlew :app:testDebugUnitTest— 1,218개 중 기존 범위의 2개 테스트가 실패했다.CreatorChannelHomeViewModelTest후원 재로딩 실패와CreatorChannelFanTalkFragmentLayoutTest의 일본어 empty 문구 기대값 불일치다../gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.CreatorChannelFanTalkFragmentLayoutTest"— 6개 중 1개가 같은 기존 불일치로 실패했다. 실패 지점은 변경 대상 세 key가 아닌creator_channel_fantalk_empty_message기대값이다.
- 남은 항목: 없음.
- 다음 행동: 없음.
Verification Log
- 2026-08-14: 문서 생성 단계에서는 production resource를 수정하지 않았다. 구현 검증은
P1-T1과P1-GATE실행 시 누적한다. - 2026-08-14: 문서 placeholder 검증은 샘플 placeholder와 미완성 표시 패턴을 대상으로 실행했고 출력 없음으로 통과했다.
- 2026-08-14: 문서 변경 후
git diff --check는 출력 없음으로 통과했고,./gradlew tasks --all은BUILD SUCCESSFUL로 통과했다. - 2026-08-14:
P1-T1변경 후 세 locale의 대상 값 일치와 이전 표현 0건을 확인했다.:app:mergeDebugResources와git diff --check는 통과했다. - 2026-08-14: debug unit suite는 1,218개 중 기존 범위의 2개가 실패했다. 이번 변경 대상과 직접 관련된 resource merge는 통과했고, FanTalk focused 실패 assertion은 변경하지 않은 일본어 empty 문구 기대값 불일치로 확인했다.
- 2026-08-14: Phase 1 독립 리뷰는 승인된 9개 resource 값, 범위 준수, PRD/plan 완료 증거를 확인하고 blocking 없음으로
APPROVE했다. 결과는reviews/phase1-fan-letter-resource-review.md에 기록했다.