docs(v2): 공통 접근 가드 계획을 기록한다
This commit is contained in:
365
docs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md
Normal file
365
docs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md
Normal file
@@ -0,0 +1,365 @@
|
||||
# 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 밖의 독립 소비자가 다수 존재하거나 백그라운드 변경 전파 요구가 확인될 때만 사용한다.
|
||||
- 레거시 기능은 수정하지 않고 `v2` adapter/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 카탈로그 확정
|
||||
- [x] **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` 운영/테스트 코드 규모와 직접 의존을 확인했다. `widget` 64개는 UI 재사용 컴포넌트이므로 초기 도메인 Action 전환 대상에서 제외한다.
|
||||
|
||||
- [x] **Task 0.2: 초기 Action 카탈로그 작성**
|
||||
- 파일:
|
||||
- `docs/20260714_V2_공통_접근_가드와_도메인_액션/prd.md`
|
||||
- `docs/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`
|
||||
- 검증 대상:
|
||||
- 로그인 필요 요구사항의 로그인/미로그인 결과
|
||||
- 성인 콘텐츠 요구사항의 미로그인 결과
|
||||
- 국내 미인증 사용자의 본인인증 필요 결과
|
||||
- 국외 사용자의 본인인증 생략
|
||||
- 성인 콘텐츠 표시 설정 비활성 결과
|
||||
- 모든 조건 충족 시 허용 결과
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/access/AccessDecision.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/access/AccessState.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentLoginGuardSourceTest.kt`
|
||||
- `app/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.md`
|
||||
- `docs/20260714_V2_공통_접근_가드와_도메인_액션/plan-task.md`
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivity.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/content/action/ContentActionCommand.kt`
|
||||
- `app/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 회귀 검증**
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveEntryPolicy.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/action/LiveActionCoordinator.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt`
|
||||
- 검증 기준: 세 화면이 동일 Live Action을 사용하고 On-air의 중복 입장 조건이 제거된다.
|
||||
|
||||
- [ ] **Task 3.5: Live Phase 회귀 검증**
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./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.kt`
|
||||
- `app/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.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/community/action/CommunityActionsTest.kt`
|
||||
- 수정 예정 파일:
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/community/action/CommunityActivityResultMapper.kt`
|
||||
- `app/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 회귀 검증**
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./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.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/chat/action/ChatActionCommand.kt`
|
||||
- `app/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.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt`
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||
- 검증 기준: 기존 login guard, room 생성 API, 성공 후 이동, owner/non-owner 분기가 유지된다.
|
||||
|
||||
- [ ] **Task 5.4: Chat Phase 회귀 검증**
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./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`
|
||||
- 실행 명령:
|
||||
```bash
|
||||
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.
|
||||
- 검증 기준: 모든 호출부가 새 공개 진입점을 사용하는 것이 확인된 구현만 제거한다.
|
||||
|
||||
- [ ] **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, 중복 처리 근거를 기록한다.
|
||||
- 검증 기준: 직접 결과 전달로 충분한 흐름에 전역 EventBus 또는 singleton observer가 추가되지 않는다.
|
||||
|
||||
- [ ] **Task 6.5: 통합 회귀 검증**
|
||||
- 실행 명령:
|
||||
```bash
|
||||
./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의 단일 `handleCommunityChange` composition handler를 사용하며, 레거시 `ActivityResult`는 `v2` adapter에서 변경 결과로 변환한다.
|
||||
- 2026-07-14: 사용자 확인에 따라 Activity result가 필요한 모든 도메인 Action에 공통 결과 전달 원칙을 확장했다. 기본 방식은 `ActivityResult -> 명시적 도메인 결과 -> feature 단일 handler`이며, Action/Repository 직접 결과도 동일 handler로 합류한다. `SharedFlow`/observer는 Activity 밖의 독립 소비자와 lifecycle/replay 요구가 확인될 때만 도입한다.
|
||||
Reference in New Issue
Block a user