Skip to content

UICollectionView 기반 공용 CollectionUI Library를 추가한다 #814

Description

@opficdev

배경

TodoListView, PushNotificationListView, TodayView는 대량 데이터를 SwiftUI List로 표시하며 페이지네이션, 실시간 변경, 여러 섹션 구성을 각각 처리함.

세 화면을 독립적으로 UIKit으로 전환하면 snapshot 적용, layout 생성, 셀 등록, 선택·새로고침·prefetch 연결이 중복되므로 공용 렌더링 기반을 먼저 구축할 필요가 있음. 성능 개선은 사전에 단정하지 않고 동일 조건의 전후 측정으로 판단함.

아키텍처 결정

  • 새 경로와 target: Libraries/CollectionUI
  • 지원 범위: iOS 17 이상
  • 허용 의존성: Foundation, SwiftUI, UIKit 등 system framework
  • 금지 의존성: Core, Domain, Data, Infra, Presentation, TCA, Firebase
  • feature의 Store를 단일 상태 원본으로 유지
  • 공용 Library는 section/item 식별자와 rendering callback만 수신
  • feature별 모델, action, cell type, layout 의미는 각 feature target이 소유
  • UIHostingConfigurationAnyView를 사용하지 않는 순수 UIKit 셀 경로 제공

작업 범위

  • Workspace.swiftLibraries/CollectionUI 프로젝트 추가
  • Libraries/CollectionUI/Project.swift, Sources, Tests, SwiftLint 설정 추가
  • SwiftUI에서 사용할 수 있는 generic UIViewControllerRepresentable 기반 collection container 제공
  • Hashable 기반 section/item identifier와 NSDiffableDataSourceSnapshot 적용 경로 제공
  • UICollectionViewDiffableDataSource 사용 필수화
  • UICollectionViewCompositionalLayout과 section별 layout provider 사용 필수화
  • 초기 snapshot과 후속 snapshot 적용 구분
  • 동일 item의 내용 변경에 대한 reconfigureItems(_:) 경로 제공
  • feature가 여러 UICollectionView.CellRegistration과 supplementary registration을 선택할 수 있는 cell provider 제공
  • 선택, 좌·우 swipe action, 새로고침, willDisplay, prefetch/cancel, scroll event callback 제공
  • snapshot 적용 시 가능한 범위에서 현재 scroll position과 selection 보존
  • UIKit 수명주기와 snapshot 적용을 MainActor에서 관리
  • feature별 로딩·빈 상태·오류 문구는 공용 Library가 아닌 호출 feature가 소유
  • 최소 사용 예시와 성능 측정 공통 절차 문서화

성능 측정 공통 절차

  • 기존 List 구현을 적용 전 기준선으로 측정
  • 동일 기기, 동일 OS, 동일 Release 구성, 동일 데이터 건수와 동일 조작 순서 사용
  • 20건, 100건, 500건, 1,000건의 재현 가능한 고정 데이터 사용
  • 최초 표시, 60초 연속 scroll, item 추가·삭제·재구성 시나리오 측정
  • CPU, 최대·안정 상태 memory, hitch 수와 누적 시간, item 변경 반영 시간 기록
  • 각 시나리오를 5회 반복하고 중앙값과 최대값 기록
  • 세 적용 이슈의 전체 결과를 보존하고 가장 큰 개선 사례를 대표 근거로 별도 표시
  • 개선이 없거나 악화된 화면도 누락하지 않고 원인과 유지 여부 기록

테스트

  • section/item snapshot 추가·삭제·이동·재구성 검증
  • 여러 cell registration 선택과 callback 전달 검증
  • selection과 scroll position 보존 검증
  • prefetch/cancel 중복 호출 방지 검증
  • UIKit container 생성·갱신·해제 수명주기 검증

완료 조건

  • CollectionUI framework와 test target이 Tuist workspace에 포함됨
  • UICollectionViewDiffableDataSourceUICollectionViewCompositionalLayout이 공용 구현에 필수로 사용됨
  • feature/domain/TCA/Firebase 의존성 없이 임의의 UIKit cell type을 등록할 수 있음
  • snapshot, selection, swipe, refresh, prefetch, supplementary view 연결이 공개 API로 제공됨
  • 단위 테스트, SwiftLint, Tuist 생성, build-only 검증이 통과함
  • 공통 성능 측정 절차와 최소 사용 예시가 문서화됨

제외 범위

  • TodoListView, PushNotificationListView, TodayView 실제 전환
  • feature reducer, Store, Domain, Firebase 계약 변경
  • 소규모 설정·편집·상세 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