배경
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이 소유
UIHostingConfiguration과 AnyView를 사용하지 않는 순수 UIKit 셀 경로 제공
작업 범위
Workspace.swift에 Libraries/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 생성·갱신·해제 수명주기 검증
완료 조건
제외 범위
TodoListView, PushNotificationListView, TodayView 실제 전환
- feature reducer, Store, Domain, Firebase 계약 변경
- 소규모 설정·편집·상세
List 전환
- 앱 실행 및 성능 측정 결과 생성
연관 이슈
배경
TodoListView,PushNotificationListView,TodayView는 대량 데이터를 SwiftUIList로 표시하며 페이지네이션, 실시간 변경, 여러 섹션 구성을 각각 처리함.세 화면을 독립적으로 UIKit으로 전환하면 snapshot 적용, layout 생성, 셀 등록, 선택·새로고침·prefetch 연결이 중복되므로 공용 렌더링 기반을 먼저 구축할 필요가 있음. 성능 개선은 사전에 단정하지 않고 동일 조건의 전후 측정으로 판단함.
아키텍처 결정
Libraries/CollectionUIFoundation,SwiftUI,UIKit등 system frameworkCore,Domain,Data,Infra,Presentation, TCA, FirebaseUIHostingConfiguration과AnyView를 사용하지 않는 순수 UIKit 셀 경로 제공작업 범위
Workspace.swift에Libraries/CollectionUI프로젝트 추가Libraries/CollectionUI/Project.swift, Sources, Tests, SwiftLint 설정 추가UIViewControllerRepresentable기반 collection container 제공Hashable기반 section/item identifier와NSDiffableDataSourceSnapshot적용 경로 제공UICollectionViewDiffableDataSource사용 필수화UICollectionViewCompositionalLayout과 section별 layout provider 사용 필수화reconfigureItems(_:)경로 제공UICollectionView.CellRegistration과 supplementary registration을 선택할 수 있는 cell provider 제공willDisplay, prefetch/cancel, scroll event callback 제공MainActor에서 관리성능 측정 공통 절차
List구현을 적용 전 기준선으로 측정테스트
완료 조건
CollectionUIframework와 test target이 Tuist workspace에 포함됨UICollectionViewDiffableDataSource와UICollectionViewCompositionalLayout이 공용 구현에 필수로 사용됨제외 범위
TodoListView,PushNotificationListView,TodayView실제 전환List전환연관 이슈