docs(deeplink): 커뮤니티 상세 이동 검증을 기록한다
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
# 커뮤니티 딥링크 상세 이동 계획
|
||||
|
||||
| 항목 | 내용 |
|
||||
|---|---|
|
||||
| 상태 | 구현·자동 검증 완료, 실제 게시물 UI 확인 제한 |
|
||||
| 작성일 | 2026-10-13 |
|
||||
| 요구사항 | [prd.md](prd.md) CD-001~005 |
|
||||
| API 기준 | 기존 상세 화면/조회 API 유지 |
|
||||
| 현재 Phase | 1: postId 기반 상세 라우팅 |
|
||||
|
||||
## 목표와 범위
|
||||
정상 community postId는 상세 화면으로 전달하고 누락·무효 값은 이동하지 않는다. 공통 handler와 기존 테스트만 변경하며 UI·API·다른 딥링크·기존 댓글 화면 정리는 제외한다.
|
||||
|
||||
## Phase 1
|
||||
**결과:** 커뮤니티 딥링크가 사용자 ID와 무관하게 정확한 게시글 상세 route를 선택한다.
|
||||
**선행조건:** 사용자 인터뷰 완료, 기존 딥링크 검사 22 assertions 통과.
|
||||
|
||||
### Task 1.1 라우팅 변경과 회귀 검사
|
||||
**Goal P1-T1:** CD-001~005를 production handler 실행으로 검증한다.
|
||||
**Files:**
|
||||
- Modify: `SodaLive/Sources/App/AppDeepLinkHandler.swift`
|
||||
- Test: `work/tests/AppDeepLinkGiftDetailCheck.swift`
|
||||
- Run: `work/tests/check-app-deep-link-gift-detail.sh`
|
||||
- Read: `SodaLive/Sources/App/AppStep.swift`, `SodaLive/Sources/ContentView.swift`, `SodaLive/Sources/Splash/SplashView.swift`
|
||||
- Read: `SodaLive/Sources/V2/CreatorChannel/Community/Detail/CreatorChannelCommunityPostDetailView.swift`, `CreatorChannelCommunityPostDetailViewModel.swift` (같은 디렉터리)
|
||||
**Interfaces:** 기존 URL handler 입력 → 기존 `creatorChannelCommunityPostDetail(postId:)` route.
|
||||
**완료 증거:** RED/GREEN 실행 결과, 유효·무효·스플래시·인접 라우팅 검사.
|
||||
|
||||
- [x] **RED:** 정상 postId 상세 이동 및 누락·무효 값 이동 금지 회귀 검사 추가.
|
||||
- [x] **RED 확인:** `bash work/tests/check-app-deep-link-gift-detail.sh`로 의도한 assertion 실패 확인.
|
||||
- [x] **GREEN:** postId 단독 community action과 기존 상세 route 연결.
|
||||
- [x] **GREEN 확인:** 같은 명령으로 신규·기존 검사 통과.
|
||||
- [x] **REFACTOR:** 이번 변경이 만든 handler 내부 불필요 코드 제거 및 회귀 재검증.
|
||||
|
||||
### Task 1.2 검증과 리뷰
|
||||
**Goal P1-GATE:** 변경 범위의 검증 결과와 확인 불가능한 환경 조건을 구분한다.
|
||||
**Files:** 위 코드/테스트, 본 PRD/계획, `reviews/phase1-community-post-detail-links.md`.
|
||||
**TDD 예외 사유:** 검증·리뷰 기록만 작성하는 Task.
|
||||
|
||||
- [x] Swift 컴파일/구문 검사와 앱 빌드 실행.
|
||||
- [x] 실제 handler 입력/결과 및 iOS UI 검증 가능 여부 기록.
|
||||
- [x] 읽기 전용 리뷰 후 확정 문제가 있으면 신규 Task 등록, 없으면 발견 사항 없음 기록.
|
||||
- [x] 변경 범위와 검증 결과를 Progress에 누적.
|
||||
|
||||
## 시나리오와 검증
|
||||
| 시나리오 | 이진 성공 기준 | 실행 표면 |
|
||||
|---|---|---|
|
||||
| 정상 입력 | `voiceon://community?postId=12345`가 상세 12345로 이동, 목록/댓글 예약 없음 | production handler를 swiftc로 컴파일한 기존 하네스 |
|
||||
| 잘못된 입력 | 누락·빈 값·문자·0·음수·범위 초과 입력은 route/pending 변경 없음 | 동일 하네스, 사용자 ID 0/양수와 path/query 변형 |
|
||||
| 시작·진입점 | splash에서 저장 후 apply, notificationList에서도 상세 12345 | 동일 하네스 |
|
||||
| 인접 회귀 | 기존 선물/콘텐츠 라우팅 유지 | 기존 22 assertions |
|
||||
|
||||
명령: `bash work/tests/check-app-deep-link-gift-detail.sh`, `swiftc -frontend -parse SodaLive/Sources/App/AppDeepLinkHandler.swift work/tests/AppDeepLinkGiftDetailCheck.swift`, `xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build`.
|
||||
iOS 수동 QA는 개발 앱에서 `xcrun simctl openurl booted 'voiceon-test://community?postId=12345'`로 진입해 상세 화면/게시물을 확인해야 한다. 운영 앱의 등록 scheme은 `voiceon`, 개발 앱은 `voiceon-test`다. 빌드/앱 실행이 차단되면 handler 하네스를 UI 검증으로 대체했다고 주장하지 않는다.
|
||||
|
||||
## 실행 순서와 중단 조건
|
||||
P1-T1 → P1-GATE. 검증과 리뷰가 끝나면 추가 정리 없이 종료한다. 현재 브랜치에서만 작업한다.
|
||||
|
||||
## Progress
|
||||
### 기준 확인 — 2026-10-13
|
||||
- 기존 딥링크 하네스: exit 0, 22 assertions 통과.
|
||||
- 상세 화면은 받은 postId로 기존 상세 API를 조회함을 확인.
|
||||
- Xcode 26.0, 실행 중 시뮬레이터 없음.
|
||||
- 인터뷰 결과: postId 누락·잘못된 값은 기존 목록 fallback 대신 이동 금지.
|
||||
|
||||
### P1-T1 RED — 2026-10-13
|
||||
- 기존 하네스에 정상 입력·사용자 ID 독립성·누락/무효·스플래시·알림 목록 검사를 추가했다.
|
||||
- `swiftc -frontend -parse work/tests/AppDeepLinkGiftDetailCheck.swift`: exit 0.
|
||||
- `bash work/tests/check-app-deep-link-gift-detail.sh`: `FAIL: community link accepted: voiceon://community?postId=12345, userId=0` assertion으로 실패. 기존 코드의 사용자 ID 의존성 때문에 발생한 의도된 RED다.
|
||||
|
||||
### P1-T1 GREEN — 2026-10-13
|
||||
- community action은 postId만 보유하며 기존 상세 route에 전달한다. 사용자 ID fallback과 기존 목록/댓글 예약 호출을 handler에서 제거했다.
|
||||
- 명시적인 community 경로의 누락·무효 postId는 다른 쿼리 route로 우회하지 않는다.
|
||||
- `bash work/tests/check-app-deep-link-gift-detail.sh`: exit 0, 279 assertions 통과.
|
||||
- `swiftc -frontend -parse SodaLive/Sources/App/AppDeepLinkHandler.swift work/tests/AppDeepLinkGiftDetailCheck.swift`: exit 0.
|
||||
- `git diff --check`: exit 0.
|
||||
- `for test_script in work/tests/check-*.sh; do bash "$test_script" || exit $?; done`: exit 0, 기존 스크립트 전체 통과.
|
||||
- 첫 앱 빌드는 도구의 120초 제한으로 중단되어 실행 제한을 600초로 늘려 재실행했다.
|
||||
|
||||
### P1-GATE — 2026-10-13
|
||||
- 앱 빌드: 위 `xcodebuild ... build` 재실행 결과 `BUILD SUCCEEDED`. 로그: `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/community-deeplink-build-retry.log`.
|
||||
- 변경 handler의 빌드 경고/오류 없음. `lsp_diagnostics` 도구가 제공되지 않아 Swift 컴파일·구문 검사와 앱 빌드로 확인했다.
|
||||
- Xcode test: `xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination 'platform=iOS Simulator,id=E9FC7721-AA96-440F-8349-2DC4B85F40F5' CODE_SIGNING_ALLOWED=NO test`는 `Scheme SodaLive-dev is not currently configured for the test action`으로 실행 불가. 전체 검증 성공은 `work/tests/check-*.sh` 범위이며 XCTest 통과를 의미하지 않는다.
|
||||
- 독립 읽기 전용 리뷰: 차단 결함 없음, handler 하네스 279 assertions 재확인. [리뷰](reviews/phase1-community-post-detail-links.md).
|
||||
- 실제 QA: 작업 전용 iPhone 17 Pro/iOS 26.0 시뮬레이터 `9794D878-ABFB-48F6-9759-17C9C2EB48F8` 생성·부팅 후 빌드한 개발 앱 설치. 부팅/설치 명령은 120초 제한에 걸렸으나 `simctl get_app_container`로 설치 완료를 별도 확인했다.
|
||||
- `xcrun simctl launch ... 9794D878-ABFB-48F6-9759-17C9C2EB48F8 kr.co.vividnext.sodalive.debug2`: PID 26019. `xcrun simctl openurl 9794D878-ABFB-48F6-9759-17C9C2EB48F8 'voiceon-test://community?postId=12345'` 실행.
|
||||
- 스크린샷 `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/community-deeplink-valid.png`에서 첫 실행 추적 허용 팝업과 배경 홈 화면 확인. 재실행 캡처는 같은 디렉터리의 `community-deeplink-reopen.png`.
|
||||
- [blocked] 실제 게시글 표시·접근 권한 및 푸시 탭 UI 검증: 첫 실행 시스템 팝업을 조작할 iOS UI 자동화 도구가 제공되지 않아 완료하지 못했다. 개발 앱에서 팝업을 처리한 뒤 접근 가능한 실제 postId로 확인해야 한다. handler 검사를 UI 검증 완료로 보고하지 않는다.
|
||||
- 작업 중 `SodaLive.xcodeproj/project.pbxproj`에 별도 항목 정렬 diff가 관찰됐다. 직접 수정한 파일이 아니므로 임의 복구하지 않았으며 라우팅 변경 범위와 분리한다.
|
||||
- QA 정리: `xcrun simctl terminate 9794D878-ABFB-48F6-9759-17C9C2EB48F8 kr.co.vividnext.sodalive.debug2 && xcrun simctl shutdown 9794D878-ABFB-48F6-9759-17C9C2EB48F8 && xcrun simctl delete 9794D878-ABFB-48F6-9759-17C9C2EB48F8` 성공. 작업 전용 앱/시뮬레이터를 정리했고 사용자 기존 기기/Preview는 변경하지 않았다. 테스트 임시 바이너리는 기존 스크립트의 EXIT trap으로 제거된다.
|
||||
- 최종 딥링크 검사 279 assertions 및 `git diff --check` 재통과. 스크린샷·빌드 로그는 위 임시 경로에 검증 자료로 보존한다.
|
||||
Reference in New Issue
Block a user