목적
TodayTab의 실제 서비스 화면 구현을 SwiftUI에서 React Native로 대체한다.
이번 작업의 목표는 성능 개선이나 성능 측정 실험이 아니다. 기존 SwiftUI TodayView를 탭 진입점에서 더 이상 사용하지 않고, React Native로 구현한 Today 화면을 실제 탭 화면으로 사용한다.
다만 기존 Swift Today 로직은 보존한다. TodayFeature가 가진 fetch, 섹션 분류, display option, 완료 처리, 중요 표시 토글, 상세 진입 흐름은 재사용하고, RN 화면은 native bridge를 통해 실제 Today 상태를 렌더링하고 사용자 액션을 기존 Swift 로직으로 전달한다.
배경
현재 TodayTab은 SwiftUI TodayView가 TodayFeature 상태를 직접 렌더링하는 구조다.
이번 변경은 TodayFeature 자체를 RN/JS로 재작성하는 작업이 아니라, Today 탭의 UI 구현체를 RN으로 바꾸는 작업이다. 따라서 비즈니스 로직과 use case 호출은 Swift 쪽에 남기고, React Native는 실제 서비스 화면 렌더링과 사용자 입력 전달을 담당한다.
또한 현재 프로젝트는 Tuist/SPM 기반으로 의존성을 관리하므로, root Podfile을 추가하지 않는다. React Native 의존성은 main app 밖의 prebuild 기반으로 준비하고, 앱 쪽에서는 prebuilt package/framework 형태로 연결하는 방향을 따른다.
작업 계획
- React Native prebuild 기반 추가
- root
Podfile은 추가하지 않는다.
- RN 의존성 준비와 native 산출물 생성을 main app 밖의 prebuild 영역으로 분리한다.
- 중간 커밋에서는 RN binary/package 산출물이 없어 앱 빌드가 실패할 수 있다.
- TodayTab RN 상태 브리지 추가
TodayFeature.State를 RN 화면에 전달할 payload로 변환한다.
- summary, section, todo item, display option, loading, error 표시 상태를 포함한다.
- mock 데이터는 사용하지 않는다.
- TodayTab RN 액션 브리지 추가
- RN에서 발생한 refresh, section 선택, display option 변경, 완료 처리, 중요 표시 토글, 상세 진입 요청을 Swift 쪽 액션으로 매핑한다.
- 기존
TodayFeature.Action과 TodayViewCoordinator 흐름을 재사용한다.
- TodayTab RN host 추가
UIViewControllerRepresentable 기반으로 RN host controller를 SwiftUI 계층에 붙인다.
- RN host는
moduleName과 실제 Today 상태 payload를 전달한다.
- RN SDK import와 host 구현은
TodayTab 경계 안에 둔다.
- RN Today 서비스 화면 추가
- RN
TodayScreen은 native bridge에서 받은 실제 Today 상태를 렌더링한다.
- summary, section list, empty state, loading, refresh, pin/complete 액션을 구현한다.
- 대량 mock 리스트 화면은 만들지 않는다.
- TodayTab 진입점 RN 전환
MainView.todayContentView에서 기존 TodayView 대신 RN Today view를 사용한다.
- feature flag나 fallback switch는 두지 않는다.
- 기존 SwiftUI Today 관련 파일은 삭제하지 않는다.
- RN Today 브리지 검증 추가
- RN runtime 자체를 테스트하지 않는다.
- Swift 쪽 상태 payload 변환과 RN action payload 매핑처럼 pure하게 검증 가능한 영역을 테스트한다.
완료 조건
- Today 탭 진입 시 SwiftUI
TodayView가 아니라 RN Today 화면이 표시됨
- 기존
TodayView.swift, TodayFeature.swift, TodayViewCoordinator.swift는 삭제되지 않음
- feature flag 없이 RN Today 화면이 기본 진입점으로 사용됨
- RN 화면은 mock 데이터가 아니라 실제
TodayFeature 상태를 렌더링함
- RN 사용자 액션이 기존 Swift Today 로직으로 전달됨
- root
Podfile이 추가되지 않음
- RN bridge 상태 변환 또는 액션 매핑에 대한 테스트가 추가됨
제외 범위
- 성능 개선을 목표로 한 최적화 작업
- 대량 mock 데이터 기반 성능 측정 화면
- Swift
TodayFeature 로직의 JS 재작성
- 기존 SwiftUI Today 파일 삭제
- feature flag 또는 SwiftUI fallback route 추가
- Android 대응
- RN bundle 배포 자동화
- OTA/CodePush 계열 배포 구성
목적
TodayTab의 실제 서비스 화면 구현을 SwiftUI에서 React Native로 대체한다.이번 작업의 목표는 성능 개선이나 성능 측정 실험이 아니다. 기존 SwiftUI
TodayView를 탭 진입점에서 더 이상 사용하지 않고, React Native로 구현한 Today 화면을 실제 탭 화면으로 사용한다.다만 기존 Swift Today 로직은 보존한다.
TodayFeature가 가진 fetch, 섹션 분류, display option, 완료 처리, 중요 표시 토글, 상세 진입 흐름은 재사용하고, RN 화면은 native bridge를 통해 실제 Today 상태를 렌더링하고 사용자 액션을 기존 Swift 로직으로 전달한다.배경
현재
TodayTab은 SwiftUITodayView가TodayFeature상태를 직접 렌더링하는 구조다.이번 변경은
TodayFeature자체를 RN/JS로 재작성하는 작업이 아니라, Today 탭의 UI 구현체를 RN으로 바꾸는 작업이다. 따라서 비즈니스 로직과 use case 호출은 Swift 쪽에 남기고, React Native는 실제 서비스 화면 렌더링과 사용자 입력 전달을 담당한다.또한 현재 프로젝트는 Tuist/SPM 기반으로 의존성을 관리하므로, root
Podfile을 추가하지 않는다. React Native 의존성은 main app 밖의 prebuild 기반으로 준비하고, 앱 쪽에서는 prebuilt package/framework 형태로 연결하는 방향을 따른다.작업 계획
Podfile은 추가하지 않는다.TodayFeature.State를 RN 화면에 전달할 payload로 변환한다.TodayFeature.Action과TodayViewCoordinator흐름을 재사용한다.UIViewControllerRepresentable기반으로 RN host controller를 SwiftUI 계층에 붙인다.moduleName과 실제 Today 상태 payload를 전달한다.TodayTab경계 안에 둔다.TodayScreen은 native bridge에서 받은 실제 Today 상태를 렌더링한다.MainView.todayContentView에서 기존TodayView대신 RN Today view를 사용한다.완료 조건
TodayView가 아니라 RN Today 화면이 표시됨TodayView.swift,TodayFeature.swift,TodayViewCoordinator.swift는 삭제되지 않음TodayFeature상태를 렌더링함Podfile이 추가되지 않음제외 범위
TodayFeature로직의 JS 재작성