30 KiB
30 KiB
메인 홈/콘텐츠 페이지 로그인 및 성인 콘텐츠 가드 Plan/Task
Assumptions
- "메인 홈, 콘텐츠 페이지"는 v2
HomeMainFragment,ContentMainFragment를 의미한다. - "이동시 guard"는 두 Fragment에서 발생하는 실제 화면 이동(
startActivity)을 의미한다. - 로그인 여부는 기존 코드와 동일하게
SharedPreferenceManager.token.isBlank()기준으로 판단한다. - 로그인 화면 이동은 기존
MainV2Activity.showLoginActivity()를 재사용한다. - 성인 콘텐츠 이동 여부를 판단할 수 있는 경우에는 로그인 이후 본인인증/성인콘텐츠 설정 가드를 적용한다.
- 접속 국가가 한국인지 여부는
SharedPreferenceManager.countryCode.ifBlank { "KR" } == "KR"기준으로 판단한다. - 한국 접속자는
SharedPreferenceManager.isAuth가true일 때 본인인증 완료로 판단한다. - 한국 외 접속자는 본인인증 여부와 무관하게 성인 콘텐츠 설정 확인 단계로 진행한다.
- 성인 콘텐츠 표시 설정은
SharedPreferenceManager.isAdultContentVisible기준으로 판단한다. HomeMainFragment의 팔로잉 탭 선택은 화면 내부 탭 전환이지만, 로그인 사용자 전용 콘텐츠 진입으로 보아 로그인 가드 대상에 포함한다.
Success Criteria
- v2 메인 전용 이동 guard helper가 추가된다.
HomeMainFragment의 모든 실제 화면 이동이 helper를 통과한다.HomeMainFragment의 팔로잉 탭 선택은 팔로잉 화면 전환 및 팔로잉 데이터 로드 전에 helper를 통과한다.HomeMainFragment의 팔로잉 탭 선택이 미로그인으로 차단되면, 탭 선택 상태와 화면은 팔로잉 탭 선택 전 상태로 복구된다.ContentMainFragment의 모든 실제 화면 이동이 helper를 통과한다.- 성인 콘텐츠로 판별 가능한 이동은 login -> country/auth -> adult setting 순서로 helper를 통과한다.
- helper는
SharedPreferenceManager.countryCode,SharedPreferenceManager.isAuth,SharedPreferenceManager.isAdultContentVisible,ContentSettingsActivity이동을 포함한다. - 레거시
HomeFragment,MainActivity,BaseFragment는 수정하지 않는다. - 지정된 source test, 컴파일, ktlint, diff whitespace 검증이 통과한다.
Phase 1: 현재 이동 지점과 기존 로그인 진입점 확인
-
Task 1.1:
HomeMainFragment이동 지점 확인- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt - 확인 대상:
openHomeOnAirLiveopenFollowingChatonBannerClickonRecentActivityClickonAiCharacterClickopenCreatorProfileopenAudioContentDetailopenPopularCommunityPost
- 검증 기준: 실제
startActivity호출 지점을 목록화하고,Unitplaceholder handler는 이동 대상에서 제외한다. - 검증 기록:
- 2026-06-27: source 확인 결과 위 함수들이 실제 화면 이동 지점이다.
onLiveClick,onFollowingSectionMoreClick,onFollowingLiveClick,onFollowingScheduleClick,onFollowingNewsClick은 현재Unit또는 이동 없음이므로 이번 가드 적용 대상이 아니다.
- 2026-06-27: source 확인 결과 위 함수들이 실제 화면 이동 지점이다.
- 파일:
-
Task 1.2:
ContentMainFragment이동 지점 확인- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt - 확인 대상:
onBannerClickopenAudioContentDetailopenSeriesDetailopenRankingAudioContentDetail은openAudioContentDetail로 위임됨
- 검증 기준: 실제
startActivity호출 지점과 위임 구조를 목록화한다. - 검증 기록:
- 2026-06-27: source 확인 결과
onBannerClick,openAudioContentDetail,openSeriesDetail이 실제 화면 이동 지점이다. 랭킹/카드 클릭은 이 함수들로 위임되므로 최종 이동 함수에 가드를 적용하면 된다.
- 2026-06-27: source 확인 결과
- 파일:
-
Task 1.3: 기존 로그인 진입점 확인
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt - 확인 대상:
MainV2Activity.showLoginActivity() - 검증 기준:
SharedPreferenceManager.token.isBlank()조건에서LoginActivity를 시작하는 기존 메서드를 재사용할 수 있다. - 검증 기록:
- 2026-06-27:
MainV2Activity.showLoginActivity()는 token blank 조건에서LoginActivity를 시작한다. helper는 이 메서드를 호출하는 방식으로 계획한다.
- 2026-06-27:
- 파일:
-
Task 1.4: 기존 성인 콘텐츠/본인인증 정책 확인
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/common/AdultContentVisibilityPolicy.ktapp/src/main/java/kr/co/vividnext/sodalive/common/SharedPreferenceManager.ktapp/src/main/java/kr/co/vividnext/sodalive/settings/ContentSettingsActivity.kt
- 확인 대상:
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(countryCode, isAdultContentVisible, isAuth)SharedPreferenceManager.countryCodeSharedPreferenceManager.isAuthSharedPreferenceManager.isAdultContentVisibleContentSettingsActivityConstants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDE
- 검증 기준: v2 helper가 사용할 기존 정책/설정 값을 목록화한다.
- 검증 기록:
- 2026-06-27:
countryCode기본값은KR이고, blank country도KR로 취급하는 기존 패턴을 확인했다.ContentSettingsActivity는Constants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDE가true이면 민감 콘텐츠 안내 Toast를 표시한다.
- 2026-06-27:
- 파일:
Phase 2: v2 메인 전용 이동 guard helper 추가
-
Task 2.1: helper source test 추가
- 파일:
app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.kt - 검증 기준:
- helper가
SharedPreferenceManager.token.isBlank()를 사용한다. - helper가
(activity as? MainV2Activity)?.showLoginActivity()를 사용한다. - helper가
SharedPreferenceManager.countryCode.ifBlank { "KR" }를 사용한다. - helper가 한국 접속자에 대해
SharedPreferenceManager.isAuth를 확인한다. - helper가 한국 접속 미인증 사용자에게
SodaDialog본인인증 안내를 표시한다. - helper가 본인인증 진입에
Auth.auth를 직접 재사용한다. - helper가
SharedPreferenceManager.isAdultContentVisible를 확인한다. - helper가
ContentSettingsActivity로 이동할 때Constants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDE를true로 전달한다. - helper에 레거시
MainActivity의존이 포함되지 않는다.
- helper가
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2LoginGuardSourceTest" - 기대 결과: 구현 전에는 helper 파일 부재로 실패한다.
- 검증 기록:
- 2026-06-27:
MainV2LoginGuardSourceTest를 추가하고 구현 전 실행했다.MainV2LoginGuard.kt파일 부재로 실패해 RED 상태를 확인했다.
- 2026-06-27:
- 파일:
-
Task 2.2: helper 구현
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt - 구현 방향:
fun Fragment.ensureMainV2NavigationAllowed( requiresAdultContentAccess: Boolean = false, onAllowed: () -> Unit ) { if (SharedPreferenceManager.token.isBlank()) { (activity as? MainV2Activity)?.showLoginActivity() return } if (requiresAdultContentAccess) { val isKoreanCountry = SharedPreferenceManager.countryCode.ifBlank { "KR" } == "KR" if (isKoreanCountry && !SharedPreferenceManager.isAuth) { showMainV2AuthDialog() return } if (!SharedPreferenceManager.isAdultContentVisible) { startActivity( Intent(requireContext(), ContentSettingsActivity::class.java).apply { putExtra(Constants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDE, true) } ) return } } onAllowed() } - 검증 기준: Task 2.1 source test가 통과한다.
- 검증 기록:
- 2026-06-27:
MainV2LoginGuard.kt를 추가했다. token blank 시MainV2Activity.showLoginActivity(), 성인 콘텐츠 요청 시 한국/본인인증 확인,SodaDialog본인인증 안내,Auth.auth,ContentSettingsActivity민감 콘텐츠 안내 extra, 최종onAllowed()흐름을 포함한다. - 2026-06-27: 리뷰 지적에 따라
Auth.auth완료 콜백에서BootpayResponse를 파싱하고AuthVerifyRequest를 생성해MyPageViewModel.authVerify()로 서버 검증 후SplashActivity를 재시작하는 기존 인증 완료 후처리를 추가했다. - 2026-06-27: 코드 리뷰에서
Auth.auth성공 콜백 후처리 누락을 지적받았고, 같은 Phase 2 범위에서 기존 패턴과 동일한 서버 본인인증 검증 및 상태 갱신 흐름으로 보완했다.
- 2026-06-27:
- 파일:
-
Task 2.3: 한국 접속 미인증 사용자 처리 방식 확정
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt- 필요 시 v2 main 하위 신규 auth guide helper
- 확인 대상:
- 기존
SodaDialog+Auth.auth흐름을 v2 helper에서 직접 재사용한다. - Fragment별 callback 위임 방식은 사용하지 않는다.
- 기존
- 검증 기준: 레거시 파일 수정 없이 v2 main helper 범위에서 본인인증 안내/진입을 처리한다.
- 검증 기록:
- 2026-06-27: 사용자 결정에 따라 한국 접속 미인증 사용자 본인인증 안내 흐름은 v2 helper에서 직접 재사용하는 것으로 확정했다.
- 파일:
Phase 3: HomeMainFragment 이동 지점에 로그인 가드 적용
-
Task 3.1: HomeMainFragment source test 추가
- 파일:
app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt - 검증 기준:
HomeMainFragment가ensureMainV2NavigationAllowed를 import/use 한다.- Task 1.1의 실제 화면 이동 함수들이 helper를 통해
startActivity를 실행한다. - invalid route/id return 조건은 가드보다 먼저 유지된다.
- 성인 콘텐츠 여부를 판단할 수 없는 홈 이동은
requiresAdultContentAccess = false또는 기본값을 사용한다.
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" - 기대 결과: 구현 전에는 helper 사용 부재로 실패한다.
- 검증 기록:
- 2026-06-27:
HomeMainFragmentLoginGuardSourceTest를 추가했다. 구현 전 실행 결과 helper import/guard 부재로 실패해 RED 상태를 확인했다.
- 2026-06-27:
- 파일:
-
Task 3.2: HomeMainFragment 적용
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt - 구현 방향:
ensureMainV2NavigationAllowed { startActivity(...) }형태로 감싼다.route ?: return, invalid id return은 기존 위치를 유지한다.- 홈 모델에서 성인 콘텐츠 여부를 판단할 수 있는 필드가 확인되면
requiresAdultContentAccess = true를 전달한다. - 성인 콘텐츠 여부를 판단할 수 없는 이동에는 임의 adult 판정을 추가하지 않는다.
BaseFragment, legacyMainActivity, legacyHomeFragment는 수정하지 않는다.
- 검증 기준: Task 3.1 source test가 통과한다.
- 검증 기록:
- 2026-06-27:
HomeMainFragment의 실제 화면 이동 지점에ensureMainV2NavigationAllowed를 적용했다. invalid route/id return은 guard보다 먼저 유지했고, 홈 모델에서 성인 콘텐츠 여부를 판단할 수 없어 기본 로그인 가드만 적용했다. - 2026-06-27: 구현 후
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest"가 통과했다.
- 2026-06-27:
- 파일:
-
Task 3.3: HomeMainFragment 팔로잉 탭 로그인 가드 source test 추가
- 파일:
app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt - 검증 기준:
binding.textTabBarHome.root.setOnTabSelectedListener가 팔로잉 탭 선택 시 즉시showHomeTab(HOME_TAB_FOLLOWING)을 호출하지 않는다.- 팔로잉 탭 선택은
ensureMainV2NavigationAllowed를 통과한 뒤showHomeTab(HOME_TAB_FOLLOWING)또는 팔로잉 탭 전환 helper를 실행한다. - 추천 탭과 랭킹 탭 선택은 기존처럼 로그인 가드 없이 탭 전환을 유지한다.
- 팔로잉 탭 전환 전
homeFollowingViewModel.loadFollowing()이 실행되지 않도록, 팔로잉 탭 화면 전환과 데이터 로드는 guard 허용 callback 내부 또는 guard 이후 함수에만 위치한다.
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" - 기대 결과: 구현 전에는 팔로잉 탭 선택 경로의 guard 부재로 실패한다.
- 검증 기록:
- 2026-06-27: 사용자 추가 요청에 따라 문서에 신규 source test Task만 추가했다. 구현 및 검증은 아직 수행하지 않는다.
- 2026-06-27:
HomeMainFragmentLoginGuardSourceTest에 팔로잉 탭 선택이ensureMainV2NavigationAllowed통과 후showHomeTab(HOME_TAB_FOLLOWING)을 실행하는지 검증하는 source test를 추가했다. 구현 전 실행 결과 팔로잉 탭 선택 경로의 guard 부재로 실패해 RED 상태를 확인했다.
- 파일:
-
Task 3.4: HomeMainFragment 팔로잉 탭 전환 로그인 가드 적용
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt - 구현 방향:
setOnTabSelectedListener또는showHomeTab(index)흐름에서HOME_TAB_FOLLOWING선택만ensureMainV2NavigationAllowed { ... }로 감싼다.- 미로그인 상태에서는
MainV2Activity.showLoginActivity()만 실행되고binding.nsvHomeFollowingContent.visibility = View.VISIBLE,hasLoadedFollowing = true,homeFollowingViewModel.loadFollowing()이 실행되지 않게 한다. - 로그인 상태에서는 기존 팔로잉 탭 전환 동작과 최초 1회
homeFollowingViewModel.loadFollowing()흐름을 유지한다. HOME_TAB_RECOMMENDATION,HOME_TAB_RANKING전환은 로그인 가드 없이 기존 동작을 유지한다.- 레거시
HomeFragment,MainActivity,BaseFragment는 수정하지 않는다.
- 검증 기준: Task 3.3 source test가 통과한다.
- 검증 기록:
- 2026-06-27: 사용자 추가 요청에 따라 문서에 신규 구현 Task만 추가했다. 구현 및 검증은 아직 수행하지 않는다.
- 2026-06-27:
HomeMainFragment의 tab listener에서HOME_TAB_FOLLOWING선택만ensureMainV2NavigationAllowed로 감싸고, 추천/랭킹 탭은 기존처럼showHomeTab(index)로 즉시 전환되도록 유지했다. 미로그인 상태에서는 guard callback 내부의showHomeTab(HOME_TAB_FOLLOWING)이 실행되지 않아 팔로잉 화면 전환과homeFollowingViewModel.loadFollowing()이 실행되지 않는다. - 2026-06-27: 구현 후
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest"가 통과했다.
- 파일:
-
Task 3.5: 팔로잉 탭 미로그인 차단 시 이전 탭 상태 복구
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt
- 구현 방향:
- 현재 선택된 홈 탭 index를
HomeMainFragment내부 상태로 보관한다. - 추천/랭킹/팔로잉 탭 전환이 실제로 허용되어
showHomeTab(index)가 실행될 때 현재 탭 index를 갱신한다. - 팔로잉 탭 선택이 미로그인 상태로 차단되면
TextTabBarView.selectTab(currentHomeTabIndex)로 탭 선택 UI를 이전 탭으로 복구한 뒤 기존 로그인 가드를 실행한다. - 로그인 상태에서는 기존처럼 팔로잉 탭으로 전환하고 최초 1회
homeFollowingViewModel.loadFollowing()흐름을 유지한다. - 레거시
HomeFragment,MainActivity,BaseFragment는 수정하지 않는다.
- 현재 선택된 홈 탭 index를
- 검증 기준:
HomeMainFragmentLoginGuardSourceTest가 팔로잉 탭 미로그인 차단 시 이전 탭 선택 복구 흐름을 검증한다.- Phase 5 통합 검증이 통과한다.
- 검증 기록:
- 2026-06-27: 사용자 후속 요청에 따라 문서에 신규 Task만 추가했다. 구현 및 검증은 이어서 수행한다.
- 2026-06-27:
HomeMainFragmentLoginGuardSourceTest에 팔로잉 탭 미로그인 차단 시 이전 탭 선택 상태 복구 source test를 추가했고, 구현 전 실행 결과 실패해 RED 상태를 확인했다. - 2026-06-27:
HomeMainFragment에서 현재 홈 탭 index를 보관하고, 팔로잉 탭 선택이 미로그인 상태이면TextTabBarView.selectTab(currentHomeTabIndex)로 이전 탭 선택 상태를 복구한 뒤 기존 로그인 가드를 호출하도록 구현했다. - 2026-06-27: 구현 후
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest"가 통과했다.
- 파일:
Phase 4: ContentMainFragment 이동 지점에 로그인 가드 적용
-
Task 4.1: ContentMainFragment source test 추가
- 파일:
app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentLoginGuardSourceTest.kt - 검증 기준:
ContentMainFragment가ensureMainV2NavigationAllowed를 import/use 한다.onBannerClick,openAudioContentDetail,openSeriesDetail이 helper를 통해startActivity를 실행한다.- invalid id return 조건은 가드보다 먼저 유지된다.
showAdultBadge또는isAdult에서 유래한 성인 콘텐츠 여부가 helper의requiresAdultContentAccess로 전달된다.
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentLoginGuardSourceTest" - 기대 결과: 구현 전에는 helper 사용 부재로 실패한다.
- 검증 기록:
- 2026-06-27:
ContentMainFragmentLoginGuardSourceTest를 추가했다. 구현 전 실행 결과 helper import/guard 및 성인 콘텐츠 여부 전달 부재로 실패해 RED 상태를 확인했다.
- 2026-06-27:
- 파일:
-
Task 4.2: ContentMainFragment 적용
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt - 구현 방향:
- 최종 이동 함수인
onBannerClick,openAudioContentDetail,openSeriesDetail에서ensureMainV2NavigationAllowed { startActivity(...) }를 사용한다. ContentAudioCardUiModel.showAdultBadge, 전체 탭 audio/series item의showAdultBadge를 성인 콘텐츠 가드 입력으로 전달한다.- 현재
ContentCommentedAudioUiModel과 추천ContentOriginalSeriesUiModel에는 성인 콘텐츠 여부 필드가 없어 모델/어댑터 범위를 확장하지 않는다. - 랭킹 아이템이나 배너처럼 성인 콘텐츠 여부를 판단할 수 없는 이동은 로그인 가드만 적용한다.
- 랭킹/카드 클릭 위임 구조는 유지한다.
- 최종 이동 함수인
- 검증 기준: Task 4.1 source test가 통과한다.
- 검증 기록:
- 2026-06-27:
ContentMainFragment의onBannerClick,openAudioContentDetail,openSeriesDetail최종 이동 지점에ensureMainV2NavigationAllowed를 적용했다.ContentAudioCardUiModel.showAdultBadge와 전체 탭 audio/series item의showAdultBadge는requiresAdultContentAccess로 전달했다. - 2026-06-27: 현재
ContentCommentedAudioUiModel과 추천ContentOriginalSeriesUiModel에는 성인 콘텐츠 여부 필드가 없어, 모델/어댑터 범위를 확장하지 않고 로그인 가드만 적용했다. - 2026-06-27: 구현 후
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentLoginGuardSourceTest"가 통과했다.
- 2026-06-27:
- 파일:
Phase 5: 통합 검증
-
추가 범위인 Task 3.3/3.4 구현이 완료되었으므로 Phase 5 체크리스트는 재검증 필요 상태로 유지한다.
-
Task 5.1: v2 main source test 실행
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*" - 기대 결과: v2 main 관련 source/unit test 통과.
- 검증 기록:
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*"를 재실행했고 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*"를 재실행했으나 실패했다. 실패 테스트는HomeFollowingFragmentSourceTest.following tab branch shows following content and hides other home surfaces,HomeFollowingViewModelTest.token이 있으면 repository에 Bearer auth header를 전달한다이다.HomeFollowingFragmentSourceTest실패는 단독 실행에서도 재현되며, 팔로잉 탭 guard 추가로HOME_TAB_FOLLOWING ->문자열이 listener와showHomeTab양쪽에 존재하게 되어 기존 source test가 listener 분기를 잘못 잘라 읽는 것이 원인이다.HomeFollowingViewModelTest.token이 있으면 repository에 Bearer auth header를 전달한다는 단독 실행 시 통과해 전체 패턴 실행 중 전역 상태/테스트 순서 영향을 추가 확인해야 한다. - 2026-06-27:
HomeFollowingFragmentSourceTest가showHomeTab(index)내부 팔로잉 분기를 검증하도록 source test 범위를 보정하고,HomeFollowingViewModelTest가 전역SharedPreferenceManager대신 테스트-local token provider를 사용하도록 격리했다. 이후./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*"를 재실행했고 통과했다. - 2026-06-27: 사용자 후속 요청으로 Task 3.5가 추가되어 Phase 5.1은 재검증 필요 상태로 되돌렸다.
- 2026-06-27: Task 3.5 구현 후
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*"를 재실행했고 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentLoginGuardSourceTest"와./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*"를 재실행했고 통과했다.
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
- 실행 명령:
-
Task 5.2: 컴파일 검증
- 실행 명령:
./gradlew :app:compileDebugKotlin - 기대 결과: Kotlin debug compile 통과.
- 검증 기록:
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:compileDebugKotlin을 재실행했고 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:compileDebugKotlin을 재실행했고 통과했다. - 2026-06-27: Task 3.5 구현 후
./gradlew :app:compileDebugKotlin을 재실행했고 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:compileDebugKotlin을 재실행했고 통과했다.
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
- 실행 명령:
-
Task 5.3: ktlint 검증
- 실행 명령:
./gradlew :app:ktlintCheck - 기대 결과: ktlint 통과.
- 검증 기록:
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:ktlintCheck를 재실행했고 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:ktlintCheck를 재실행했고 통과했다. - 2026-06-27: Task 3.5 구현 후
./gradlew :app:ktlintCheck를 재실행했고 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
./gradlew :app:ktlintCheck를 재실행했고 통과했다.
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
- 실행 명령:
-
Task 5.4: diff whitespace 검증
- 실행 명령:
git diff --check - 기대 결과: whitespace error 없음.
- 검증 기록:
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
git diff --check를 재실행했고 whitespace error가 없음을 확인했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
git diff --check를 재실행했고 whitespace error가 없음을 확인했다. - 2026-06-27: Task 3.5 구현 후
git diff --check를 재실행했고 whitespace error가 없음을 확인했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
git diff --check를 재실행했고 whitespace error가 없음을 확인했다.
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라
- 실행 명령:
Verification Log
- 2026-06-27: 사용자 요청에 따라 이번 작업은 문서 생성만 수행한다. source/test/helper 구현 및 Gradle 검증은 아직 실행하지 않는다.
- 2026-06-27: 사용자 요청에 따라 본인인증/성인 콘텐츠 설정 가드를 문서 범위에 추가했다. 구현은 아직 수행하지 않는다.
- 2026-06-27: 한국 접속 미인증 사용자 본인인증 안내 흐름은 v2 helper에서 기존
SodaDialog+Auth.auth패턴을 직접 재사용하는 것으로 확정했다. - 2026-06-27: Phase 1/2 진행 결과
MainV2LoginGuardSourceTest와MainV2LoginGuard를 추가했다. 구현 전 단일 source test는 helper 파일 부재로 실패했고, 구현 후./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2LoginGuardSourceTest",./gradlew :app:compileDebugKotlin,./gradlew :app:ktlintCheck,git diff --check가 통과했다. - 2026-06-27: 리뷰 지적에 따라 빈
Auth.auth콜백을 금지하는 source test를 추가한 뒤 RED를 확인했고, 서버 검증/상태 갱신 후처리 구현 후./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2LoginGuardSourceTest"와./gradlew :app:compileDebugKotlin이 통과했다. - 2026-06-27: Phase 1/2 코드 리뷰 지적을 반영한 뒤 검증을 재수행했다.
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2LoginGuardSourceTest",./gradlew :app:compileDebugKotlin,./gradlew :app:ktlintCheck,git diff --check는 모두 통과했다. - 2026-06-27: Phase 3/4 진행 결과
HomeMainFragmentLoginGuardSourceTest,ContentMainFragmentLoginGuardSourceTest를 추가하고HomeMainFragment,ContentMainFragment의 실제 화면 이동 지점에 v2 main guard helper를 적용했다. 각 source test는 구현 전 RED, 구현 후 GREEN을 확인했다. - 2026-06-27: Phase 3/4 최종 검증으로
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentLoginGuardSourceTest",./gradlew :app:compileDebugKotlin,./gradlew :app:ktlintCheck,git diff --check가 통과했다. 리뷰 게이트에서 문서 범위 불일치와ContentOriginalSeriesUiModel비확장 검증 누락을 지적받아 보완했고, 재검토 PASS를 확인했다. - 2026-06-27: 사용자 요청에 따라 Phase 3의 Task 3.3/3.4를 진행했다. 팔로잉 탭 선택 경로 source test는 구현 전 RED, 구현 후 GREEN을 확인했다.
- 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라 변경 범위를 재검토했다.
HomeMainFragment와ContentMainFragment의 실제startActivity이동은 v2 main guard helper를 통과하며, invalid route/id return은 guard보다 먼저 유지된다. 판단 가능한 성인 콘텐츠 여부는ContentAudioCardUiModel.showAdultBadge와 전체 탭 audio/seriesshowAdultBadge에서requiresAdultContentAccess로 전달된다. 차단 이슈는 발견하지 못했다. - 2026-06-27: 사용자 추가 요청에 따라
HomeMainFragment팔로잉 탭 선택 전 로그인 가드 요구사항을 PRD와 Plan/Task에 추가했다. 추가 범위가 생겼으므로 Phase 5 검증 체크리스트는 미완료 상태로 되돌렸고, 이후 Task 3.3/3.4 구현 및 검증을 진행했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라 재검토했다.
TextTabBarView.selectTab()은 선택 상태를 먼저 적용한 뒤 listener를 호출하므로, 현재HomeMainFragment의 listener guard는 팔로잉 콘텐츠 전환과 데이터 로드는 막지만 비로그인 상태에서 팔로잉 탭 선택 표시가 먼저 바뀔 수 있다. 또한./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*"는 실패했으므로 Phase 5.1은 미완료로 유지한다../gradlew :app:compileDebugKotlin,./gradlew :app:ktlintCheck,git diff --check는 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 후속으로
HomeFollowingFragmentSourceTest의 팔로잉 분기 추출 범위를showHomeTab(index)내부로 좁혔고,HomeFollowingViewModelTest의 token 검증은 테스트-local token provider로 격리했다. 이후./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeFollowingFragmentSourceTest.following tab branch shows following content and hides other home surfaces",./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeFollowingViewModelTest",./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*",./gradlew :app:compileDebugKotlin,./gradlew :app:ktlintCheck,git diff --check가 통과했다. - 2026-06-27: 사용자 후속 요청에 따라 팔로잉 탭 미로그인 차단 시 이전 탭 상태 복구 요구사항을 PRD와 Task 3.5에 추가했다. 구현 전 Phase 5.1은 재검증 필요 상태로 되돌렸다.
- 2026-06-27: Task 3.5 구현 결과
HomeMainFragment가 현재 홈 탭 index를 보관하고, 미로그인 팔로잉 탭 선택 시 이전 탭 선택 상태로 복구한 뒤 로그인 가드를 호출하도록 변경했다.HomeMainFragmentLoginGuardSourceTest는 구현 전 RED, 구현 후 GREEN을 확인했다. 최종 검증으로./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*",./gradlew :app:compileDebugKotlin,./gradlew :app:ktlintCheck,git diff --check가 통과했다. - 2026-06-27: Phase 3/4 코드 리뷰 및 검증 요청에 따라 변경 범위를 재검토했다.
HomeMainFragment는 실제 이동과 팔로잉 탭 전환이 v2 main guard helper를 통과하며, 미로그인 팔로잉 탭 선택 시 이전 탭 선택 상태로 복구된다.ContentMainFragment는 실제 이동이 helper를 통과하고 판단 가능한 성인 콘텐츠 여부를requiresAdultContentAccess로 전달한다. 차단 이슈는 발견하지 못했다. Fresh verification으로 Phase 3/4 전용 source test,v2.main.*전체 test, compile, ktlint, diff whitespace 검증이 통과했다.