Skip to content

TodayTab 화면 구현을 React Native로 대체한다 #701

Description

@opficdev

목적

TodayTab의 실제 서비스 화면 구현을 SwiftUI에서 React Native로 대체한다.

이번 작업의 목표는 성능 개선이나 성능 측정 실험이 아니다. 기존 SwiftUI TodayView를 탭 진입점에서 더 이상 사용하지 않고, React Native로 구현한 Today 화면을 실제 탭 화면으로 사용한다.

다만 기존 Swift Today 로직은 보존한다. TodayFeature가 가진 fetch, 섹션 분류, display option, 완료 처리, 중요 표시 토글, 상세 진입 흐름은 재사용하고, RN 화면은 native bridge를 통해 실제 Today 상태를 렌더링하고 사용자 액션을 기존 Swift 로직으로 전달한다.

배경

현재 TodayTab은 SwiftUI TodayViewTodayFeature 상태를 직접 렌더링하는 구조다.

이번 변경은 TodayFeature 자체를 RN/JS로 재작성하는 작업이 아니라, Today 탭의 UI 구현체를 RN으로 바꾸는 작업이다. 따라서 비즈니스 로직과 use case 호출은 Swift 쪽에 남기고, React Native는 실제 서비스 화면 렌더링과 사용자 입력 전달을 담당한다.

또한 현재 프로젝트는 Tuist/SPM 기반으로 의존성을 관리하므로, root Podfile을 추가하지 않는다. React Native 의존성은 main app 밖의 prebuild 기반으로 준비하고, 앱 쪽에서는 prebuilt package/framework 형태로 연결하는 방향을 따른다.

작업 계획

  1. React Native prebuild 기반 추가
    • root Podfile은 추가하지 않는다.
    • RN 의존성 준비와 native 산출물 생성을 main app 밖의 prebuild 영역으로 분리한다.
    • 중간 커밋에서는 RN binary/package 산출물이 없어 앱 빌드가 실패할 수 있다.
  2. TodayTab RN 상태 브리지 추가
    • TodayFeature.State를 RN 화면에 전달할 payload로 변환한다.
    • summary, section, todo item, display option, loading, error 표시 상태를 포함한다.
    • mock 데이터는 사용하지 않는다.
  3. TodayTab RN 액션 브리지 추가
    • RN에서 발생한 refresh, section 선택, display option 변경, 완료 처리, 중요 표시 토글, 상세 진입 요청을 Swift 쪽 액션으로 매핑한다.
    • 기존 TodayFeature.ActionTodayViewCoordinator 흐름을 재사용한다.
  4. TodayTab RN host 추가
    • UIViewControllerRepresentable 기반으로 RN host controller를 SwiftUI 계층에 붙인다.
    • RN host는 moduleName과 실제 Today 상태 payload를 전달한다.
    • RN SDK import와 host 구현은 TodayTab 경계 안에 둔다.
  5. RN Today 서비스 화면 추가
    • RN TodayScreen은 native bridge에서 받은 실제 Today 상태를 렌더링한다.
    • summary, section list, empty state, loading, refresh, pin/complete 액션을 구현한다.
    • 대량 mock 리스트 화면은 만들지 않는다.
  6. TodayTab 진입점 RN 전환
    • MainView.todayContentView에서 기존 TodayView 대신 RN Today view를 사용한다.
    • feature flag나 fallback switch는 두지 않는다.
    • 기존 SwiftUI Today 관련 파일은 삭제하지 않는다.
  7. 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 계열 배포 구성

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions