9.7 KiB
9.7 KiB
PRD: 메인 홈/콘텐츠 페이지 로그인 및 성인 콘텐츠 가드
1. Overview
v2 메인 홈/콘텐츠 페이지에서 상세 화면, 외부 링크, 채팅방 등 화면 이동 전에 로그인 여부와 성인 콘텐츠 접근 가능 여부를 확인하는 가드를 추가한다.
2. Problem
비로그인 상태 또는 성인 콘텐츠 접근 조건을 만족하지 않은 상태에서도 HomeMainFragment와 ContentMainFragment의 일부 화면 이동이 바로 진행될 수 있다.
- 홈 추천/팔로잉/랭킹 영역에서 크리에이터 프로필, 오디오 상세, 커뮤니티 글, 채팅방, 라이브 목록 등으로 이동하기 전에 로그인 확인이 일관되게 적용되지 않는다.
- 콘텐츠 추천/랭킹/전체 영역에서 배너, 오디오 상세, 시리즈 상세 이동 전에 로그인 확인이 일관되게 적용되지 않는다.
- 성인 콘텐츠로 판별 가능한 콘텐츠 이동에서 접속 국가와 본인인증 여부, 성인 콘텐츠 표시 설정이 일관되게 확인되지 않는다.
- v2 메인 화면에서는 기존
MainV2Activity.showLoginActivity()진입점이 있으나 Fragment 이동 지점에서 공통으로 사용되지 않는다.
3. Goals
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_GUIDE를true로 전달한다.- 기존
AdultContentVisibilityPolicy와ContentSettingsActivity의 country/auth 정책을 확인해 중복 또는 충돌 없이 사용한다. - helper에는 레거시
MainActivity로직을 넣지 않는다.
Edge Cases
- Fragment가
MainV2Activity에 붙어 있지 않은 경우에는 안전하게 login call을 생략하고 이동도 실행하지 않는다. - 이미 유효성 검사를 통해 invalid id를 return하는 이동 지점은 기존 return 조건을 유지한다.
- 성인 콘텐츠 여부를 판단할 수 없는 이동은 로그인 가드만 적용한다.
Feature B: HomeMainFragment 이동 가드 적용
HomeMainFragment의 실제 startActivity 이동 지점을 helper로 감싼다.
Requirements
openHomeOnAirLiveopenFollowingChatonBannerClickonRecentActivityClickonAiCharacterClickopenCreatorProfileopenAudioContentDetailopenPopularCommunityPost- 위 이동 지점에 로그인 가드를 적용한다.
- 성인 콘텐츠 여부를 판단할 수 있는 홈 이동 지점이 있으면 성인 콘텐츠 가드도 함께 적용한다.
- 현재
Unit으로 남아 있는 클릭 handler는 화면 이동이 아니므로 신규 이동을 만들지 않는다.
Edge Cases
- route 또는 id가 유효하지 않아 기존에 return하던 경우에는 로그인 가드 호출 전에 그대로 return한다.
ChatRoomType.AI,ChatRoomType.DM분기별 기존 Intent 생성을 유지한다.- 현재 홈 v2 모델에 성인 콘텐츠 여부 필드가 없는 이동은 로그인 가드만 적용하고, 임의로 adult 판정을 만들지 않는다.
Feature C: ContentMainFragment 이동 가드 적용
ContentMainFragment의 실제 startActivity 이동 지점을 helper로 감싼다.
Requirements
onBannerClickopenAudioContentDetailopenSeriesDetail- 랭킹/카드 클릭은 위 함수로 위임되는 구조를 유지한다.
- 기존 Intent extra(
Constants.EXTRA_AUDIO_CONTENT_ID,Constants.EXTRA_SERIES_ID)를 유지한다. ContentAudioCardUiModel,ContentCommentedAudioUiModel,MainContentAllTabaudio/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()를 재사용한다. - 성인 콘텐츠 설정 이동은 기존
ContentSettingsActivity와Constants.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
- 구현 후
HomeMainFragment와ContentMainFragment의 모든 실제startActivity이동 지점이 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패턴을 직접 재사용한다.