Skip to content

TodayView를 CollectionUI로 전환하고 성능을 측정한다 #817

Description

@opficdev

배경

TodayView는 전체 미완료 Todo를 조회한 뒤 요약 카드와 focused, overdue, dueSoon, later, unscheduled 섹션으로 분류해 표시함.

가로 summary와 여러 세로 Todo section을 하나의 collection에서 구성하고, filter·고정·완료 변경에 따른 section/item 이동을 #814의 공용 CollectionUI로 반영한 뒤 List 대비 성능을 측정할 필요가 있음.

선행 이슈

작업 범위

  • TodayTab target에 Libraries/CollectionUI 직접 의존성 추가
  • TodayView의 root ListCollectionUI 기반 collection으로 전환
  • UICollectionViewDiffableDataSource 사용
  • UICollectionViewCompositionalLayout 사용
  • section identifier를 summary와 각 SectionCategory로 구분
  • item identifier를 summary scope와 todo.id가 충돌하지 않는 feature 전용 값으로 구성
  • summary는 orthogonalScrollingBehavior를 사용하는 가로 section으로 구성
  • Todo는 section header를 가진 세로 list section으로 구성
  • feature가 소유하는 순수 UIKit summary cell, Today Todo cell, supplementary header registration 구현
  • store.sections, summaryCounts, selectedSectionScope, displayOptions를 rendering 입력으로 사용
  • 고정 변경에 따른 section 이동은 snapshot move/insert/delete와 필요한 reconfigureItems(_:)로 반영
  • 완료 처리는 snapshot에서 해당 Todo ID 제거로 반영
  • filter와 scope 변경은 기존 Store 계산 결과로 새 snapshot을 생성해 반영
  • cell은 화면 표현에 필요한 값과 callback만 수신하고 Store·Coordinator를 보관하지 않도록 구성
  • #812의 렌더링 입력 축소 원칙 준수

기존 동작 보존

  • summary 카드 수치, 선택 표시와 scope 전환
  • due date·focused filter
  • focused, overdue, dueSoon, later, unscheduled 분류와 순서
  • compact의 navigation과 non-compact의 router 이동
  • todoDetailPreview 기반 길게 누르기 미리보기
  • 좌측 swipe의 고정 전환
  • 우측 swipe의 완료 처리
  • pull-to-refresh, loading overlay, 빈 상태, alert
  • TodayFeature의 조회·분류·수정 계약

성능 측정

#814의 공통 절차에 따라 기존 List와 적용 후 collection을 비교함.

  • 데이터 건수: 20, 100, 500, 1,000
  • 모든 Todo가 한 section에 몰린 경우와 다섯 section에 분산된 경우를 각각 측정
  • 시나리오
    • 최초 표시
    • 60초 연속 scroll
    • summary scope 전환
    • due date·focused filter 변경
    • 고정 변경에 따른 section 이동
    • 완료에 따른 item 제거
  • 기록
    • CPU
    • 최대·안정 상태 memory
    • hitch 수와 누적 시간
    • scope/filter 변경부터 snapshot 반영까지의 시간
    • section 이동과 item 제거 반영 시간
    • 기기, OS, build configuration, 반복 횟수
  • 각 시나리오 5회 반복 후 중앙값과 최대값을 이슈 댓글 또는 PR 본문에 표로 기록
  • 개선·동일·악화 판정과 UIKit 구현 유지 여부 기록

완료 조건

  • TodayView에서 SwiftUI List가 제거됨
  • UICollectionViewDiffableDataSourceUICollectionViewCompositionalLayout이 모두 적용됨
  • summary 가로 section과 Todo 세로 section이 하나의 collection으로 구성됨
  • scope/filter, section 이동, 완료 제거, swipe, refresh, routing, 미리보기가 기존과 동일함
  • TodayFeature의 조회·분류 계약 변경 없이 Presentation rendering만 전환됨
  • 순수 UIKit cell이 Store·Coordinator 없이 좁은 입력으로 구성됨
  • 관련 feature/unit test와 회귀 test가 통과함
  • changed-file SwiftLint, Tuist 생성, build-only 검증이 통과함
  • 동일 조건의 전후 성능 수치와 결론이 기록됨

제외 범위

  • Today Todo 조회 query와 fetchAllPages 계약 변경
  • Todo 분류·summary 계산 규칙 변경
  • Todo 생성·수정·상세 흐름 변경
  • 다른 화면의 List 전환

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