7.9 KiB
7.9 KiB
2026-03-13 커뮤니티 댓글 알림 딥링크 postId 연결 구현 계획
요구사항 정리
- 입력 패턴:
$uriScheme://community/$creatorId?postId=$postId - 목표 동작:
path=community이고postId쿼리가 존재하면CreatorCommunityAllActivity로 이동한 뒤 해당 게시물의 댓글 리스트를 즉시 노출한다. - 범위: 앱 내부 딥링크 파싱/라우팅/커뮤니티 화면 진입 동작만 다루며, 서버 API 스키마와 푸시 발송 규격 변경은 포함하지 않는다.
완료 기준
DeepLinkActivity.buildDeepLinkExtras에서postId쿼리를 파싱해Constants.EXTRA_COMMUNITY_POST_ID로 보존한다.MainActivity.buildBundleFromDeepLinkUrl에서도 동일하게postId를 파싱해 cold start 경로와 foreground 경로의 동작을 일치시킨다.DeepLinkActivity.routeForegroundDeepLink와MainActivity.executeBundleRoute의 community 분기에서EXTRA_COMMUNITY_CREATOR_ID와EXTRA_COMMUNITY_POST_ID를 함께 전달한다.CreatorCommunityAllActivity가EXTRA_COMMUNITY_POST_ID를 수신하면 대상 게시물을 찾은 뒤 댓글 바텀시트(CreatorCommunityCommentFragment)를 자동으로 띄운다.- 대상 게시물이 첫 페이지에 없을 수 있으므로 페이징 로드 완료(
isLast)까지 탐색 후 미발견 시 안전하게 fallback(일반 커뮤니티 목록 유지 + 사용자 안내)한다. - 변경 파일 기준 정적 진단/단위 테스트/디버그 빌드 검증을 완료하고 결과를 문서 하단 검증 기록에 누적한다.
작업 체크리스트
- 딥링크 파라미터 매핑 확장
DeepLinkActivity.kt의 query 파싱 키 목록에postId추가MainActivity.kt의 query 파싱 키 목록에postId추가postId -> Constants.EXTRA_COMMUNITY_POST_ID매핑 규칙을 두 파일에 동일하게 반영
- community 라우팅 인텐트 확장
CreatorCommunityAllActivity호출 시 creatorId/postId 동시 전달- 포그라운드 라우팅과 앱 재실행 라우팅의 동작 일관성 검증
- 커뮤니티 화면 자동 댓글 오픈 처리
CreatorCommunityAllActivity에 목표postId상태(1회성 플래그 포함) 추가- 목록 수신 시 target
postId존재 여부 확인 후 댓글 바텀시트 자동 오픈 - 미발견 시 다음 페이지 로드 트리거 및
isLast도달 시 graceful fallback
- 회귀 방지 검증
- community 외 기존 딥링크(
live,content,series,message,audition) 경로 영향 점검 - 푸시 경유(
SodaFirebaseMessagingService)와 직접 URL 실행(Intent.ACTION_VIEW) 모두 동작 확인
- community 외 기존 딥링크(
예상 영향 파일
app/src/main/java/kr/co/vividnext/sodalive/main/DeepLinkActivity.ktapp/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.ktapp/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllActivity.kt
검증 계획
./gradlew :app:testDebugUnitTest./gradlew :app:assembleDebug- 필요 시
./gradlew :app:ktlintCheck
외부 레퍼런스(구현 기준)
- Android Intent/Filter 가이드:
https://developer.android.com/guide/components/intents-filters - Android
<data>element 가이드:https://developer.android.com/guide/topics/manifest/data-element - Android App Links 가이드:
https://developer.android.com/training/app-links - Navigation deep link 가이드:
https://developer.android.com/guide/navigation/navigation-deep-link
검증 기록
- 2026-03-13
- 무엇/왜/어떻게: 커뮤니티 댓글 알림 딥링크 구현 계획에 필요한 내부 라우팅 근거를 확보하기 위해 딥링크/커뮤니티/댓글/푸시 경로를 저장소 전역에서 탐색했다.
- 실행 명령:
grep(pattern="postId|community|deeplink|intent-filter|uriScheme|scheme", include="*.{kt,kts,xml,md}"),grep(pattern="getQueryParameter|Uri\\.parse|intent\\.data|ACTION_VIEW", include="*.{kt,kts,xml}"),ast_grep_search(pattern="Uri.parse($URL)", lang="kotlin"),ast_grep_search(pattern="$URI.getQueryParameter($NAME)", lang="kotlin"),rg ...시도 - 결과: 핵심 경로를
DeepLinkActivity/MainActivity/SodaFirebaseMessagingService/CreatorCommunityAllActivity로 특정했고, 현재 community 딥링크는 creatorId만 전달하며postId는 파싱/전달하지 않음을 확인했다. 또한 실행 환경에rg바이너리가 없어command not found: rg가 발생했다.
- 2026-03-13
- 무엇/왜/어떻게: 공식 문서 및 OSS 예시를 기반으로 안전한 딥링크 파라미터 처리 계획을 보강하기 위해 librarian 탐색 결과를 수집했다.
- 실행 명령:
task(subagent_type="librarian", run_in_background=true, ...)2건 수행 후session_read(session_id=...)로 결과 수집 - 결과: Android 공식 딥링크/App Links 가이드와 쿼리 파라미터 처리 예시를 확보했고, 계획 문서의 구현 기준/검증 항목에 반영했다.
- 2026-03-13
- 무엇/왜/어떻게: 계획 문서 기준 구현을 위해 community 딥링크 파싱/라우팅/화면 자동 댓글 오픈 경로를 수정했다.
- 실행 명령:
git diff -- app/src/main/java/kr/co/vividnext/sodalive/main/DeepLinkActivity.kt app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllActivity.kt - 결과:
postId쿼리(postId)를Constants.EXTRA_COMMUNITY_POST_ID로 맵핑하고, community 이동 인텐트에 함께 전달되며, 커뮤니티 화면에서 target post의 댓글 바텀시트를 자동 오픈하도록 반영했다.
- 2026-03-13
- 무엇/왜/어떻게: 수정 파일 정적 진단 가능 여부와 회귀를 점검했다.
- 실행 명령:
lsp_diagnostics(DeepLinkActivity.kt/MainActivity.kt/CreatorCommunityAllActivity.kt),./gradlew :app:testDebugUnitTest :app:assembleDebug - 결과: Kotlin LSP 서버 미구성으로
.kt진단은 불가했으며, Gradle 검증은BUILD SUCCESSFUL.
- 2026-03-13
- 무엇/왜/어떻게: 수동 딥링크 실행으로 실제 인텐트 라우팅 경로를 확인했다.
- 실행 명령:
adb devices,./gradlew :app:installDebug,adb shell am start -a android.intent.action.VIEW -d "voiceon://community/1?postId=1",adb shell dumpsys activity activities - 결과: 단말 연결/설치 성공 후
voiceon://community/1?postId=1인텐트가 앱DeepLinkActivity로 전달되고SplashActivity경유 태스크로 진입하는 것을 확인했다.
- 2026-03-13
- 무엇/왜/어떻게: 구현 누락 여부를 줄이기 위해 Oracle 리뷰를 수행하고 지적된 분기 불일치/누락을 보정했다.
- 실행 명령:
task(subagent_type="oracle", run_in_background=false, ...),git diff -- app/src/main/java/kr/co/vividnext/sodalive/main/DeepLinkActivity.kt app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllActivity.kt - 결과:
MainActivity에deep_link_value/deep_link_sub5승격 로직을 추가해 cold start 경로를 정렬했고,CreatorCommunityAllActivity의 마지막 페이지 fallback 트리거 보완 및 invalid creator 조기 반환을 반영했다.
- 2026-03-13
- 무엇/왜/어떻게: Oracle 보정 반영 후 회귀 여부를 다시 확인했다.
- 실행 명령:
lsp_diagnostics(DeepLinkActivity.kt/MainActivity.kt/CreatorCommunityAllActivity.kt),./gradlew :app:testDebugUnitTest :app:assembleDebug,adb shell am start -a android.intent.action.VIEW -d "voiceon://community/1?postId=1" && adb shell dumpsys activity activities - 결과: Kotlin LSP 서버 미구성으로
.kt진단은 불가했고, Gradle은BUILD SUCCESSFUL, ADB 수동 검증에서 딥링크 인텐트(voiceon://community/1?postId=1)가DeepLinkActivity인텐트로 전달됨을 재확인했다.