Files
sodalive-android/docs/20260627_메인_홈_콘텐츠_페이지_로그인_가드/prd.md

12 KiB

PRD: 메인 홈/콘텐츠 페이지 로그인 및 성인 콘텐츠 가드

1. Overview

v2 메인 홈/콘텐츠 페이지에서 상세 화면, 외부 링크, 채팅방 등 화면 이동 전에 로그인 여부와 성인 콘텐츠 접근 가능 여부를 확인하는 가드를 추가한다.


2. Problem

비로그인 상태 또는 성인 콘텐츠 접근 조건을 만족하지 않은 상태에서도 HomeMainFragmentContentMainFragment의 일부 화면 이동이 바로 진행될 수 있다.

  • 홈 추천/팔로잉/랭킹 영역에서 크리에이터 프로필, 오디오 상세, 커뮤니티 글, 채팅방, 라이브 목록 등으로 이동하기 전에 로그인 확인이 일관되게 적용되지 않는다.
  • 홈 팔로잉 탭은 로그인 사용자 전용 콘텐츠 영역이지만, 탭 전환 전에 로그인 가드가 적용되지 않아 비로그인 상태에서도 팔로잉 탭 화면으로 먼저 전환될 수 있다.
  • 콘텐츠 추천/랭킹/전체 영역에서 배너, 오디오 상세, 시리즈 상세 이동 전에 로그인 확인이 일관되게 적용되지 않는다.
  • 성인 콘텐츠로 판별 가능한 콘텐츠 이동에서 접속 국가와 본인인증 여부, 성인 콘텐츠 표시 설정이 일관되게 확인되지 않는다.
  • v2 메인 화면에서는 기존 MainV2Activity.showLoginActivity() 진입점이 있으나 Fragment 이동 지점에서 공통으로 사용되지 않는다.

3. Goals

  • HomeMainFragment에서 발생하는 모든 실제 화면 이동 전에 로그인 여부를 확인한다.
  • HomeMainFragment에서 팔로잉 탭을 터치하면 팔로잉 탭 화면으로 전환하기 전에 로그인 여부를 확인한다.
  • ContentMainFragment에서 발생하는 모든 실제 화면 이동 전에 로그인 여부를 확인한다.
  • 미로그인 상태에서는 기존 MainV2Activity.showLoginActivity()를 호출하고 원래 이동은 실행하지 않는다.
  • 로그인 상태에서는 기존 이동 동작과 Intent extra를 유지한다.
  • 성인 콘텐츠로 판별 가능한 이동에서는 SharedPreferenceManager.countryCode, SharedPreferenceManager.isAuth, SharedPreferenceManager.isAdultContentVisible를 기준으로 접근 가능 여부를 확인한다.
  • 한국 접속자(countryCode가 blank이거나 KR)는 본인인증이 완료되어야 성인 콘텐츠 이동을 계속할 수 있다.
  • 성인 콘텐츠 표시 설정이 꺼져 있으면 ContentSettingsActivity로 이동하고 원래 이동은 실행하지 않는다.
  • v2 메인 Fragment 범위에만 영향을 주는 작은 helper 또는 guard 계층으로 구현한다.

4. Non-Goals

  • 본인인증 SDK 또는 본인인증 서버 API의 동작 변경은 제외한다.
  • 성인 콘텐츠 설정 화면 UI 변경은 제외한다.
  • 레거시 HomeFragment, MainActivity, BaseFragment 수정은 제외한다.
  • API, DTO, DB, 서버 스키마 변경은 제외한다.
  • 로그인 화면 자체의 UX 또는 인증 플로우 변경은 제외한다.

5. Target Users

  • v2 메인 홈/콘텐츠 페이지를 사용하는 비로그인 사용자
  • v2 메인 홈/콘텐츠 페이지에서 콘텐츠 상세, 크리에이터, 채팅, 배너 링크로 이동하는 로그인 사용자

6. User Stories

  • 비로그인 사용자는 홈/콘텐츠 페이지에서 상세 화면으로 이동하려 할 때 로그인 화면으로 안내받고 싶다.
  • 비로그인 사용자는 홈 팔로잉 탭을 터치할 때 팔로잉 탭으로 전환되기 전에 로그인 화면으로 안내받고 싶다.
  • 한국 접속 미인증 사용자는 성인 콘텐츠로 이동하려 할 때 본인인증이 필요하다는 안내를 받고 싶다.
  • 성인 콘텐츠 표시 설정이 꺼진 사용자는 성인 콘텐츠로 이동하려 할 때 설정 화면으로 안내받고 싶다.
  • 로그인 사용자는 기존처럼 탭, 카드, 배너, 랭킹 아이템을 눌렀을 때 해당 화면으로 이동하고 싶다.
  • 개발자는 v2 메인 화면의 이동 가드를 레거시 공통 코드 변경 없이 확인하고 유지보수하고 싶다.

7. Core Features

Feature A: v2 메인 Fragment 전용 이동 가드

kr.co.vividnext.sodalive.v2.main 하위에 v2 메인 Fragment에서만 사용하는 이동 guard helper를 둔다.

Requirements

  • SharedPreferenceManager.token.isBlank()를 로그인 여부 기준으로 사용한다.
  • token이 blank이면 (activity as? MainV2Activity)?.showLoginActivity()를 호출하고 원래 이동 callback을 실행하지 않는다.
  • token이 blank가 아니고 성인 콘텐츠 가드 대상이 아니면 전달된 이동 callback을 실행한다.
  • 성인 콘텐츠 가드 대상이면 접속 국가와 본인인증 여부를 먼저 확인한다.
  • countryCode.ifBlank { "KR" } == "KR"이면 한국 접속자로 판단한다.
  • 한국 접속자이고 SharedPreferenceManager.isAuth == false이면 원래 이동 callback을 실행하지 않는다.
  • 한국 외 접속자는 본인인증 여부와 무관하게 성인 콘텐츠 설정 확인 단계로 진행한다.
  • SharedPreferenceManager.isAdultContentVisible == false이면 ContentSettingsActivity로 이동하고 원래 이동 callback을 실행하지 않는다.
  • ContentSettingsActivity 이동 시 기존 패턴과 동일하게 Constants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDEtrue로 전달한다.
  • 기존 AdultContentVisibilityPolicyContentSettingsActivity의 country/auth 정책을 확인해 중복 또는 충돌 없이 사용한다.
  • helper에는 레거시 MainActivity 로직을 넣지 않는다.

Edge Cases

  • Fragment가 MainV2Activity에 붙어 있지 않은 경우에는 안전하게 login call을 생략하고 이동도 실행하지 않는다.
  • 이미 유효성 검사를 통해 invalid id를 return하는 이동 지점은 기존 return 조건을 유지한다.
  • 성인 콘텐츠 여부를 판단할 수 없는 이동은 로그인 가드만 적용한다.

Feature B: HomeMainFragment 이동 가드 적용

HomeMainFragment의 실제 startActivity 이동 지점을 helper로 감싼다.

Requirements

  • openHomeOnAirLive
  • openFollowingChat
  • onBannerClick
  • onRecentActivityClick
  • onAiCharacterClick
  • openCreatorProfile
  • openAudioContentDetail
  • openPopularCommunityPost
  • 위 이동 지점에 로그인 가드를 적용한다.
  • 팔로잉 탭 선택 시 실제 팔로잉 화면으로 전환하기 전에 로그인 가드를 적용한다.
  • 팔로잉 탭 선택 시 로그인되어 있으면 기존처럼 팔로잉 탭 화면으로 전환하고, 필요한 경우 기존 homeFollowingViewModel.loadFollowing() 흐름을 실행한다.
  • 팔로잉 탭 선택 시 미로그인 상태이면 기존 MainV2Activity.showLoginActivity()를 호출하고, 팔로잉 탭 화면 전환 및 팔로잉 데이터 로드는 실행하지 않는다.
  • 팔로잉 탭 선택 시 미로그인 상태이면 로그인 화면 진입 전후로 홈 탭 선택 상태와 화면은 팔로잉 탭 선택 전 상태를 유지한다.
  • 성인 콘텐츠 여부를 판단할 수 있는 홈 이동 지점이 있으면 성인 콘텐츠 가드도 함께 적용한다.
  • 현재 Unit으로 남아 있는 클릭 handler는 화면 이동이 아니므로 신규 이동을 만들지 않는다.

Edge Cases

  • route 또는 id가 유효하지 않아 기존에 return하던 경우에는 로그인 가드 호출 전에 그대로 return한다.
  • ChatRoomType.AI, ChatRoomType.DM 분기별 기존 Intent 생성을 유지한다.
  • 현재 홈 v2 모델에 성인 콘텐츠 여부 필드가 없는 이동은 로그인 가드만 적용하고, 임의로 adult 판정을 만들지 않는다.
  • 추천 탭과 랭킹 탭 전환은 로그인 가드 대상이 아니며 기존 동작을 유지한다.
  • 미로그인 사용자가 팔로잉 탭을 터치한 뒤 로그인하지 않고 돌아와도 추천/랭킹 등 이전 홈 탭 상태가 유지된다.

Feature C: ContentMainFragment 이동 가드 적용

ContentMainFragment의 실제 startActivity 이동 지점을 helper로 감싼다.

Requirements

  • onBannerClick
  • openAudioContentDetail
  • openSeriesDetail
  • 랭킹/카드 클릭은 위 함수로 위임되는 구조를 유지한다.
  • 기존 Intent extra(Constants.EXTRA_AUDIO_CONTENT_ID, Constants.EXTRA_SERIES_ID)를 유지한다.
  • ContentAudioCardUiModel, ContentCommentedAudioUiModel, MainContentAllTab audio/series model처럼 성인 배지 또는 isAdult에서 유래한 값을 가진 이동은 성인 콘텐츠 가드 대상이다.
  • 배너 이동은 성인 콘텐츠 여부를 판단할 수 있는 데이터가 없으면 로그인 가드만 적용한다.

Edge Cases

  • audioContentId <= 0L, seriesId <= 0L, invalid ranking content id는 기존처럼 무시한다.
  • 랭킹 아이템에서 성인 콘텐츠 여부를 판단할 수 없는 경우에는 로그인 가드만 적용하고, 상세 화면 자체 정책에 추가 판단을 위임한다.

8. UX / UI Expectations

  • 미로그인 사용자는 별도 Toast 없이 기존 로그인 화면으로 이동한다.
  • 한국 접속 미인증 사용자는 성인 콘텐츠 이동 시 기존 앱 패턴과 동일한 본인인증 안내를 받는다.
  • 성인 콘텐츠 표시 설정이 꺼진 사용자는 ContentSettingsActivity로 이동하며 민감 콘텐츠 안내 Toast가 표시될 수 있다.
  • 로그인 사용자의 화면 이동 UX는 기존과 동일하다.
  • 홈 팔로잉 탭 전환은 로그인 사용자 전용 콘텐츠 진입으로 간주해 로그인 가드 대상이다.
  • 홈 팔로잉 탭 로그인 가드에서 미로그인으로 차단되면, 팔로잉 탭이 선택된 것처럼 표시되지 않고 이전 탭 상태가 유지된다.
  • 그 외 탭 전환, 리스트 렌더링, 정렬 팝업, pagination 등 화면 이동이 아닌 동작은 로그인 가드 대상이 아니다.

9. Technical Constraints

  • 신규 helper는 kr.co.vividnext.sodalive.v2.main 패키지 하위에 작성한다.
  • BaseFragment, 레거시 MainActivity, 레거시 HomeFragment는 수정하지 않는다.
  • 기존 MainV2Activity.showLoginActivity()를 재사용한다.
  • 성인 콘텐츠 설정 이동은 기존 ContentSettingsActivityConstants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDE를 재사용한다.
  • 본인인증 가능 여부 판단은 SharedPreferenceManager.countryCode.ifBlank { "KR" }, SharedPreferenceManager.isAuth 기준을 따른다.
  • 한국 접속 미인증 사용자 본인인증 안내 흐름은 v2 helper에서 기존 SodaDialog + Auth.auth 패턴을 직접 재사용한다.
  • 성인 콘텐츠 설정 여부 판단은 SharedPreferenceManager.isAdultContentVisible 기준을 따른다.
  • 구현 시 source test로 helper 사용 여부, login/auth/adult-setting 분기, 레거시 파일 미수정 여부를 고정한다.
  • Android Gradle 명령은 저장소 루트에서 실행한다.

10. Metrics

  • 구현 후 HomeMainFragmentContentMainFragment의 모든 실제 startActivity 이동 지점이 v2 메인 이동 guard helper를 통과한다.
  • 구현 후 HomeMainFragment의 팔로잉 탭 선택은 팔로잉 탭 화면 전환 전에 v2 메인 이동 guard helper를 통과한다.
  • 성인 콘텐츠로 판별 가능한 이동은 login -> country/auth -> adult setting 순서로 guard를 통과한다.
  • source test가 helper 사용, token 기준, MainV2Activity.showLoginActivity() 호출, countryCode/isAuth/isAdultContentVisible 기준, ContentSettingsActivity 이동을 검증한다.

11. Open Questions

  • 없음. 한국 접속 미인증 사용자 본인인증 안내 흐름은 v2 helper에서 기존 SodaDialog + Auth.auth 패턴을 직접 재사용한다.