24 KiB
V2 공통 접근 가드와 도메인 액션 Plan/Task
Assumptions
- 작업 범위는
kr.co.vividnext.sodalive.v2하위 신규/기존 코드와 이를 조립하는AppDI.kt로 제한한다. - 화면별 최초 집계 API와 Response는 feature가 계속 소유할 수 있다.
- 공통화 대상은 최소 두 호출부에서 반복되거나 모든 화면에서 동일해야 하는 정책과 사용자 행동이다.
- 기존 UX, API, Intent extra, Activity result, 화면 새로고침 동작을 보존한다.
- 직접적인 하위 Activity 결과는
ActivityResult -> 명시적 도메인 결과 -> feature 단일 handler를 기본 전달 방식으로 사용한다. - 현재 화면 안에서 Action/Repository가 직접 반환하는 결과에는 불필요하게
ActivityResult를 도입하지 않고 같은 handler를 호출한다. SharedFlow/observer는 Activity 밖의 독립 소비자가 다수 존재하거나 백그라운드 변경 전파 요구가 확인될 때만 사용한다.- 레거시 기능은 수정하지 않고
v2adapter/wrapper에서 호출한다. - 구현은 Access부터 도메인별 Phase로 진행하며 각 Phase를 독립적으로 검증한다.
- 모든 도메인에 동일한 형식의 클래스를 강제하지 않고 실제 중복과 정책이 확인된 최소 단위만 추출한다.
Success Criteria
v2로그인/성인 접근 판단의 단일 소유자가 존재한다.- Activity와 Fragment가 동일한 Access 공개 진입점을 사용한다.
- 합의된 도메인별 반복 동작이 단일 Action 공개 진입점을 사용한다.
- Action 입력은 화면 전용 UI model/DTO가 아닌 ID, 값 또는 명시적 command다.
- 화면별 최초 query와 UI composition은 유지된다.
- Community mutation은 명시적 변경 결과를 반환하고 Creator Channel의 단일 composition handler가 Home/Community projection 갱신을 결정한다.
- Activity result를 사용하는 도메인 흐름은 raw result를 화면마다 해석하지 않고 명시적 결과와 단일 handler를 사용한다.
- feature 간 직접 Activity/Coordinator 의존은 공통 Action 또는 navigation 계약으로 대체된다.
- 각 Phase의 테스트, 컴파일, ktlint, whitespace 검증 결과가 문서에 누적된다.
Phase 0: 기준선과 Action 카탈로그 확정
-
Task 0.1:
v2구조와 중복 접근 구현 기준선 조사- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/app/src/test/java/kr/co/vividnext/sodalive/v2/
- 확인 내용:
- 운영 Kotlin 258개, 약 25,294줄
- 테스트 Kotlin 127개, 약 23,809줄
SharedPreferenceManager직접 참조 29개 파일, 92곳- API 11개, Repository 11개, ViewModel 22개, Activity/Fragment 20개
- 검증 기준: 전체 재배치가 아닌 반복 동작별 점진 전환이 필요한 근거를 기록한다.
- 검증 기록:
- 2026-07-14:
find,wc,rg로v2운영/테스트 코드 규모와 직접 의존을 확인했다.widget64개는 UI 재사용 컴포넌트이므로 초기 도메인 Action 전환 대상에서 제외한다.
- 2026-07-14:
- 파일:
-
Task 0.2: 초기 Action 카탈로그 작성
- 파일:
docs/20260714_V2_공통_접근_가드와_도메인_액션/prd.mddocs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md
- 작업: Access, Content, Live, Creator, Community, Chat의 초기 공통 동작과 호출 화면을 기록한다.
- 검증 기준: 화면별 집계 query와 공통 action을 구분하고, FanTalk/Donation/Schedule은 실제 재사용 수요 확인 전 추출 대상에서 제외한다.
- 검증 기록:
- 2026-07-14: 기존 호출부 조사 결과 Access, 오디오/시리즈 진입, Live 상세/입장, Creator Channel 진입, Community 상세, Chat/DM 진입을 초기 후보로 확정했다.
- 파일:
-
Task 0.3: 구현 직전 호출부 및 동작 차이 상세 목록 확정
- 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/app/src/main/java/kr/co/vividnext/sodalive/v2/live/docs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md
- 작업: 각 Action별 호출 함수, 접근 조건, Intent extra, Activity result, callback/refresh 차이를 기록한다.
- 검증 기준:
- 공통 계약으로 보존할 동작과 화면에 남길 후처리가 구분된다.
- Activity result 흐름은 adapter에서 만들 명시적 결과와 feature 단일 handler 후보가 기록된다.
- observer가 필요한 흐름은 Activity 밖의 소비자 수, lifecycle, replay 요구사항이 함께 기록된다.
- 파일:
Phase 1: V2 공통 Access 정책과 실행기
-
Task 1.1: Access 판단 단위 테스트 작성
- 생성 예정 파일:
app/src/test/java/kr/co/vividnext/sodalive/v2/access/AccessPolicyTest.kt
- 검증 대상:
- 로그인 필요 요구사항의 로그인/미로그인 결과
- 성인 콘텐츠 요구사항의 미로그인 결과
- 국내 미인증 사용자의 본인인증 필요 결과
- 국외 사용자의 본인인증 생략
- 성인 콘텐츠 표시 설정 비활성 결과
- 모든 조건 충족 시 허용 결과
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.access.AccessPolicyTest" - 기대 결과: 구현 전 RED, 구현 후 GREEN.
- 생성 예정 파일:
-
Task 1.2: Access 입력·출력 계약과 순수 정책 구현
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/access/AccessRequirement.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/access/AccessDecision.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/access/AccessState.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/access/AccessPolicy.kt
- 작업: 로그인, 국가/본인인증, 성인 콘텐츠 표시 설정을 명시적 입력과 결과로 판단한다.
- 검증 기준: Android, Activity, Fragment, Dialog, Retrofit 의존 없이 Task 1.1 테스트가 통과한다.
- 생성 예정 파일:
-
Task 1.3: Activity/Fragment 공용 Access 실행기 구현
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/access/V2AccessGuard.kt
- 수정 가능 파일:
app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt
- 작업:
AccessDecision을 로그인, 본인인증, 콘텐츠 설정 UX로 연결한다.- 기존
LoginActivity,V2ModalDialog,Auth.auth,MyPageViewModel.authVerify,ContentSettingsActivity를 재사용한다. - Activity와 Fragment에서 같은 공개 함수를 호출할 수 있게 한다.
- 검증 기준:
Allowed에서만 원래 action을 한 번 실행한다.- 거부 결과에서 원래 action을 실행하지 않는다.
- 기존 Intent flag/extra와 인증 완료 후 흐름을 유지한다.
- 생성 예정 파일:
-
Task 1.4: 기존 Access 구현을 공통 실행기로 전환
- 수정 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt
- 작업:
- 기존 호출부를
V2AccessGuard로 전환한다. - 화면 진입 guard와 클릭 action guard의 기존 종료/후처리 차이를 보존한다.
- 모든 호출부 전환 후 중복
ensureLoginAndAdultAuth구현을 제거한다.
- 기존 호출부를
- 검증 기준:
CreatorChannelActivity,HomeOnAirLiveActivity에 별도 로그인/성인 판단 함수가 남지 않는다.- 대상 클릭 handler에 직접 token 조건문이 남지 않는다.
- 수정 예정 파일:
-
Task 1.5: 기존 Access source test를 새 계약에 맞게 전환
- 수정 예정 파일:
app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentLoginGuardSourceTest.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt
- 작업: 이전 함수명 고정 assertion을 새 공통 Access 사용 및 기존 UX 보존 검증으로 최소 수정한다.
- 검증 기준: 정책은
AccessPolicyTest, 호출 연결은 필요한 source test가 담당한다.
- 수정 예정 파일:
-
Task 1.6: Access Phase 검증 및 문서 반영
- 파일:
docs/agent-guides/build-test-style.mddocs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.access.*" ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.*" ./gradlew :app:compileDebugKotlin ./gradlew :app:ktlintCheck git diff --check - 기대 결과: 신규 Access 테스트와 영향받은 기존 테스트, 컴파일, ktlint, whitespace 검증 통과.
- 파일:
Phase 2: Content 공통 Action
-
Task 2.1: 오디오/시리즈 진입 호출부와 계약 확정
- 확인 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivity.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
- 작업: ID, 성인 여부, Activity result, route source, 기존 extra 차이를 목록화하고 Action 계약을 확정한다.
- 검증 기준:
- 화면 전용 UI model을 받지 않는 최소 command/result 계약이 정해진다.
- Activity result 또는 호출 화면 후처리가 있는 경로는 Content result adapter와 단일 handler 필요 여부가 결정된다.
- 확인 예정 파일:
-
Task 2.2: Content Action 순수 계약 테스트 및 구현
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/content/action/ContentAction.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/content/action/ContentActionCommand.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/content/action/ContentActionTest.kt
- 검증 대상: invalid ID, audio/series route, 성인 Access 요구사항 전달, 허용/차단 결과.
- 검증 기준: feature UI model과 DTO 의존 없이 입력·출력이 테스트된다.
- 생성 예정 파일:
-
Task 2.3: Content navigation adapter 구현 및 전체 호출부 전환
- 생성/수정 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/content/action/ContentActionHandler.kt- Task 2.1에서 확정한 Home/Content/Overview/Creator Channel 호출 파일
- 작업: 기존 extra와 Access UX를 보존하면서 오디오/시리즈 상세 진입을 한 곳으로 통합한다.
- 검증 기준: 대상 UI에서 상세 Activity Intent 직접 생성이 제거되고 Content Action을 사용한다.
- 생성/수정 예정 파일:
-
Task 2.4: Content Phase 회귀 검증
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.content.action.*" ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*" ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*" ./gradlew :app:compileDebugKotlin ./gradlew :app:ktlintCheck git diff --check - 수동 확인: Home, Content, Content Overview, Creator Channel에서 audio/series 상세 진입과 성인 차단 UX가 기존과 동일하다.
- 실행 명령:
Phase 3: Live 공통 Action
-
Task 3.1: 기존 Live 흐름 차이와 레거시 의존 목록 확정
- 확인 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveCoordinator.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt
- 작업: 상세, 입장, 예약, 결제, 비밀번호, 오디오 중단, Activity result, refresh callback, navigation 차이를 기록한다.
- 검증 기준:
- Live 공통 정책과 화면별 후처리가 구분된다.
- 라이브 생성 결과를 포함한 raw Activity result의 Live 결과 변환과 feature 단일 handler가 확정된다.
- 확인 예정 파일:
-
Task 3.2: Live 입장 결정 계약과 단위 테스트 작성
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryDecision.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryPolicy.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryPolicyTest.kt
- 검증 대상: 관리자, 무료/결제 완료, 비밀번호, 유료, 상세 표시 분기.
- 검증 기준: Activity/Dialog 없이 기존 분기 순서를 순수 입력·출력으로 검증한다.
- 생성 예정 파일:
-
Task 3.3: Live Action/Coordinator 단일 구현과 호환 adapter 구성
- 생성/이동/수정 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActions.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinator.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveCoordinator.kt
- 작업:
- 기존 Coordinator 동작을 Live 소유 진입점으로 옮기고 필요한 동안 기존 이름은 얇은 adapter로 유지한다.
- 하위 Activity가 반환하는 Live 결과는 명시적 result로 변환하고 호출 feature의 단일 handler로 전달한다.
- 검증 기준: 새 구현이 Creator Channel feature를 import하지 않고 레거시 Live 기능만 adapter로 호출한다.
- 생성/이동/수정 예정 파일:
-
Task 3.4: Home/Creator Channel/On-air 호출부 전환과 중복 제거
- 수정 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt
- 검증 기준: 세 화면이 동일 Live Action을 사용하고 On-air의 중복 입장 조건이 제거된다.
- 수정 예정 파일:
-
Task 3.5: Live Phase 회귀 검증
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.*" ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.*" ./gradlew :app:compileDebugKotlin ./gradlew :app:ktlintCheck git diff --check - 수동 확인: 무료, 유료, 비밀번호, 관리자, 상세 표시, 예약/취소 흐름과 화면별 refresh 동작이 기존과 동일하다.
- 실행 명령:
Phase 4: Creator와 Community 공통 Action
-
Task 4.1: Creator Channel 진입 호출부와 계약 확정
- 확인 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/home/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/
- 검증 기준:
creatorId, 로그인 요구 여부, route source, 기존 extra 차이가 정리된다.
- 확인 예정 파일:
-
Task 4.2: Creator Action 구현과 호출부 전환
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/creator/action/CreatorActions.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/creator/action/CreatorActionsTest.kt
- 검증 기준: 유효 ID와 Access를 한 곳에서 처리하고 feature UI model을 입력받지 않는다.
- 생성 예정 파일:
-
Task 4.3: Community 게시글 진입 계약 구현과 호출부 전환
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/community/action/CommunityActions.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/community/action/CommunityActionsTest.kt
- 수정 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
- 검증 기준: 로그인, ID 검사, Activity result 차이를 보존하고 공통 게시글 진입점을 사용한다.
- 생성 예정 파일:
-
Task 4.4: Community 변경 결과와 레거시 ActivityResult adapter 구현
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/community/action/CommunityChange.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/community/action/CommunityActivityResultMapper.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/community/action/CommunityChangeTest.kt
- 작업:
- 작성, 수정, 삭제, 고정 변경을
Created,Updated,Deleted,PinChanged로 표현한다. - 레거시 작성/수정 Activity의
RESULT_OK를 명시적인 Community 변경 결과로 변환한다. - 결과 계약에는 Home/Community 탭 refresh callback 또는 Fragment 참조를 포함하지 않는다.
- 작성, 수정, 삭제, 고정 변경을
- 검증 기준: result code, 유효/누락 post ID, 변경 종류가 화면 의존 없이 테스트된다.
- 생성 예정 파일:
-
Task 4.5: Creator Channel Community 변경 composition handler 통합
- 수정 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
- 작업:
handleCommunityChange(change)단일 함수에서 Home/Community projection 갱신을 조합한다.- Community 작성, 수정, 삭제, 고정 변경 성공 경로가 위 함수를 사용하도록 전환한다.
- 기존
ActivityResultLauncher, Activity result 수신 시점, Fragment initial load 동작은 유지한다.
- 검증 기준:
- Community Action/결과가 Creator Channel Home 또는 Community Fragment를 알지 않는다.
- Activity 내부의 개별 성공 경로에
refreshHome()과refreshCreatorChannelCommunity()조합이 반복되지 않는다. - 현재 Activity 내부 전파를 위해 전역 EventBus/observer singleton을 추가하지 않는다.
- 수정 예정 파일:
-
Task 4.6: Creator/Community Phase 회귀 검증
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.action.*" ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.community.action.*" ./gradlew :app:compileDebugKotlin ./gradlew :app:ktlintCheck git diff --check
- 실행 명령:
Phase 5: Chat 공통 Action
-
Task 5.1: Chat/DM 진입 유형과 결과 계약 확정
- 확인 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
- 작업: 기존 room 진입, creator 기반 DM 생성, AI/DM 타입, owner/non-owner, Activity result 차이를 구분한다.
- 검증 기준:
- 서로 다른 동작을 하나의 nullable/boolean 다목적 함수로 합치지 않는다.
- 호출 화면 후처리가 필요한 Activity result는 명시적 Chat 결과와 feature 단일 handler로 연결한다.
- 확인 예정 파일:
-
Task 5.2: Chat Action 계약과 단위 테스트 작성
- 생성 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/chat/action/ChatActions.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/chat/action/ChatActionCommand.ktapp/src/test/java/kr/co/vividnext/sodalive/v2/chat/action/ChatActionsTest.kt
- 검증 기준: room/creator 식별자와 진입 유형이 명시적이고 Home/Creator UI model에 의존하지 않는다.
- 생성 예정 파일:
-
Task 5.3: Home/Chat/Creator Channel 호출부 전환
- 수정 예정 파일:
app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.ktapp/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
- 검증 기준: 기존 login guard, room 생성 API, 성공 후 이동, owner/non-owner 분기가 유지된다.
- 수정 예정 파일:
-
Task 5.4: Chat Phase 회귀 검증
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.chat.action.*" ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*" ./gradlew :app:compileDebugKotlin ./gradlew :app:ktlintCheck git diff --check
- 실행 명령:
Phase 6: 의존 방향과 이전 구현 정리
-
Task 6.1: feature 간 직접 navigation/Coordinator 의존 재검사
- 확인 범위:
app/src/main/java/kr/co/vividnext/sodalive/v2/**/*.kt - 실행 명령:
rg -n '^import kr\.co\.vividnext\.sodalive\.v2\.(main|creator|live)\..*(Activity|Fragment|Coordinator)' app/src/main/java/kr/co/vividnext/sodalive/v2 --glob '*.kt' - 검증 기준: composition에 필요한 부모-자식 Fragment 연결을 제외하고 도메인 Action으로 대체할 직접 의존이 남지 않는다.
- 확인 범위:
-
Task 6.2: 이전 helper와 중복 함수 제거
- 삭제/수정 대상: 각 Phase에서 호환을 위해 남긴 adapter, 이전
ensure..., 중복open..., 직접 route helper. - 검증 기준: 모든 호출부가 새 공개 진입점을 사용하는 것이 확인된 구현만 제거한다.
- 삭제/수정 대상: 각 Phase에서 호환을 위해 남긴 adapter, 이전
-
Task 6.3: 미추출 도메인 재평가
- 확인 대상: FanTalk, Donation, Schedule, Ranking, Discovery.
- 작업: 실제 반복 호출과 동일 정책이 생겼는지 확인하고 추출 또는 현행 유지 근거를 기록한다.
- 검증 기준: 형식적 Action 추가 없이 단일 사용 기능은 기존 feature에 유지한다.
-
Task 6.4: 결과 전달 방식과 observer 필요성 재검사
- 확인 대상: Content, Live, Community, Chat 및 후속 mutation 흐름.
- 작업:
- 하위 Activity 결과가
ActivityResult -> 명시적 결과 -> feature 단일 handler로 연결되는지 확인한다. - 동일한 raw result 해석과 refresh 조합이 여러 호출부에 남아 있는지 확인한다.
SharedFlow/observer 도입 지점이 있다면 Activity 밖의 독립 소비자, lifecycle, replay, 중복 처리 근거를 기록한다.
- 하위 Activity 결과가
- 검증 기준: 직접 결과 전달로 충분한 흐름에 전역 EventBus 또는 singleton observer가 추가되지 않는다.
-
Task 6.5: 통합 회귀 검증
- 실행 명령:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.*" ./gradlew :app:compileDebugKotlin ./gradlew :app:ktlintCheck git diff --check - 수동 확인:
- 로그인/본인인증/성인 설정 차단과 허용 흐름
- Home, Content, Creator Channel, On-air의 오디오/시리즈/라이브 진입
- Creator Channel 및 Community 상세 진입
- Chat/DM 생성과 기존 room 진입
- 기존 Activity result와 새로고침 동작
- 기대 결과:
v2전체 관련 테스트와 컴파일, ktlint, whitespace 검증 통과.
- 실행 명령:
Verification Log
- 2026-07-14: 사용자 요청에 따라 이번 단계에서는 PRD와 구현 계획 문서만 작성했다. 운영 코드, 테스트 코드, DI는 아직 변경하지 않았고 Gradle 검증은 실행하지 않았다.
- 2026-07-14: 문서 범위는 Access부터 도메인별로 순차 전환하는 하나의 연속 작업으로 정의했다. 화면별 최초 집계 API는 유지하고 반복 action만 단일 소유 진입점으로 통합한다.
- 2026-07-14: 문서 작성 후
./gradlew tasks --all을 실행해 계획에 사용하는:app:testDebugUnitTest,:app:compileDebugKotlin,:app:ktlintCheck작업이 존재함을 확인했으며 명령은BUILD SUCCESSFUL로 종료되었다.git diff --check도 whitespace 오류 없이 통과했다. - 2026-07-14: Community 업로드 후 Home/Community 탭 갱신 설계를 구체화했다. 초기 구현은 전역 observer 대신
CommunityChange결과와 Creator Channel의 단일handleCommunityChangecomposition handler를 사용하며, 레거시ActivityResult는v2adapter에서 변경 결과로 변환한다. - 2026-07-14: 사용자 확인에 따라 Activity result가 필요한 모든 도메인 Action에 공통 결과 전달 원칙을 확장했다. 기본 방식은
ActivityResult -> 명시적 도메인 결과 -> feature 단일 handler이며, Action/Repository 직접 결과도 동일 handler로 합류한다.SharedFlow/observer는 Activity 밖의 독립 소비자와 lifecycle/replay 요구가 확인될 때만 도입한다.