Files
sodalive-android/docs/20260814_팬Talk_팬레터_resource_문구_변경/plan-task.md
T

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_*_fantalk key를 유지하고 값만 변경한다.
  • 데이터·보안: 민감정보와 외부 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 --check
    

    Expected: 두 명령 모두 성공한다.

검증 방법

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:mergeDebugResourcesBUILD 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:mergeDebugResourcesBUILD 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-T1P1-GATE 실행 시 누적한다.
  • 2026-08-14: 문서 placeholder 검증은 샘플 placeholder와 미완성 표시 패턴을 대상으로 실행했고 출력 없음으로 통과했다.
  • 2026-08-14: 문서 변경 후 git diff --check는 출력 없음으로 통과했고, ./gradlew tasks --allBUILD SUCCESSFUL로 통과했다.
  • 2026-08-14: P1-T1 변경 후 세 locale의 대상 값 일치와 이전 표현 0건을 확인했다. :app:mergeDebugResourcesgit 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에 기록했다.