Skip to content

TodoListView를 CollectionUI로 전환하고 성능을 측정한다 #815

Description

@opficdev

배경

TodoListView의 기본 목록은 페이지네이션으로 item이 계속 누적되고, 각 행에서 상대 시간, tag layout, 고정·완료·삭제 action과 Todo 상세 이동을 처리함.

기존 List의 동작을 유지하면서 #814의 공용 CollectionUI를 적용하고 동일 조건에서 성능 차이를 측정할 필요가 있음.

선행 이슈

작업 범위

  • PresentationShared target에 Libraries/CollectionUI 직접 의존성 추가
  • todoListContent의 기본 ListCollectionUI 기반 collection으로 전환
  • UICollectionViewDiffableDataSource 사용
  • UICollectionViewCompositionalLayout 사용
  • item identifier는 전체 모델이 아닌 안정적인 todo.id 사용
  • feature가 소유하는 순수 UIKit Todo cell과 UICollectionView.CellRegistration 구현
  • section별 layout provider로 plain list section과 filter header 구성
  • filter header의 가로 scroll, safe-area 배치, iOS 17~26 동작 보존
  • 다음 페이지 추가는 snapshot item append로 반영
  • 고정·완료·표시 내용 변경은 reconfigureItems(_:)로 해당 ID만 갱신
  • 삭제는 snapshot에서 해당 ID만 제거
  • UICollectionViewDataSourcePrefetching으로 다음 페이지 요청
  • hasMoreisLoading 조건을 유지하고 중복 loadNextPage 요청 방지
  • 여러 행의 RelativeTimeText 갱신을 하나의 화면 단위 scheduler로 통합하되 표시 결과 보존
  • cell은 화면 표현에 필요한 값과 callback만 수신하고 Store·Coordinator를 보관하지 않도록 구성
  • #812의 렌더링 입력 축소 원칙 준수

기존 동작 보존

  • Todo 선택과 compact/non-compact routing
  • todoDetailPreview 기반 길게 누르기 미리보기
  • 좌측 swipe의 고정·완료 전환
  • 우측 swipe의 삭제와 ToastPresenter 삭제 취소
  • filter 초기화, 정렬, 완료 상태 filter
  • pull-to-refresh, loading overlay, 빈 상태
  • 현재 검색 mode와 검색 결과 ScrollView는 이번 전환 대상에서 제외하고 동작만 회귀 검증

성능 측정

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

  • 데이터 건수: 20, 100, 500, 1,000
  • 시나리오
    • 최초 표시
    • 60초 연속 scroll
    • 다음 페이지 append
    • 고정·완료 reconfigureItems(_:)
    • 삭제와 삭제 취소
  • 기록
    • CPU
    • 최대·안정 상태 memory
    • hitch 수와 누적 시간
    • 최초 표시와 page append 반영 시간
    • 기기, OS, build configuration, 반복 횟수
  • 각 시나리오 5회 반복 후 중앙값과 최대값을 이슈 댓글 또는 PR 본문에 표로 기록
  • 개선·동일·악화 판정과 UIKit 구현 유지 여부 기록

완료 조건

  • 기본 목록에서 SwiftUI List가 제거됨
  • UICollectionViewDiffableDataSourceUICollectionViewCompositionalLayout이 모두 적용됨
  • 페이지네이션, filter, swipe, refresh, routing, 미리보기 동작이 기존과 동일함
  • 순수 UIKit cell이 Store·Coordinator 없이 좁은 입력으로 구성됨
  • 관련 feature/unit test와 회귀 test가 통과함
  • changed-file SwiftLint, Tuist 생성, build-only 검증이 통과함
  • 동일 조건의 전후 성능 수치와 결론이 기록됨

제외 범위

  • Todo fetch·search·pagination Domain/Data 계약 변경
  • 검색 결과 container의 UIKit 전환
  • 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