본문 바로가기
감정일기(가칭)

🚀 현실적인 iOS 데이터 로딩 전략 — Core Data와 Pagination(페이징) 이야기

by 밤새는 탐험가89 2025. 10. 17.
728x90
SMALL

앱에서 데이터를 불러올 때,
한 번에 모든 데이터를 전부 가져오는 방식
생각보다 앱 성능에 큰 영향을 줍니다.

 

예를 들어, 감정일기 앱을 만든다고 할 때
사용자가 쓴 일기가 100개 이상이라면,
앱을 실행하자마자 100개의 데이터를 전부 Core Data에서 불러오면
스크롤이 끊기거나, 첫 로딩이 지연될 수 있습니다.

 

그럼 어떻게 해야 할까요?


바로 “페이징(Pagination)”이라는 개념을 활용하는 겁니다.


📖 Pagination(페이징)이란?

 

데이터를 한 번에 전부 불러오지 않고,
일정 단위로 나눠서(fetchLimit) 점진적으로 불러오는 방식을 말합니다.

 

예를 들어

1. 한 화면에는 최대 10개의 일기만 보이고,

2. Core Data에서는 한 번에 20개만 가져온 뒤,

3. 사용자가 스크롤할 때마다 다음 20개를 “미리” 불러오는 구조죠.

 

이렇게 하면
앱이 훨씬 가볍고, 스크롤도 부드러워집니다.


⚙️ 페이징 로직의 기본 개념

1. Core Data Fetch 시 제한 걸기

let request: NSFetchRequest<EmotionDiaryEntity> = EmotionDiaryEntity.fetchRequest()
request.fetchLimit = 20
request.fetchOffset = 0 // 다음 페이지에서는 20, 40, 60 ...

 

fetchLimit은 “한 번에 가져올 데이터 수”,
fetchOffset은 “가져올 시작 위치”를 뜻합니다.

 

 

2. 화면에 먼저 보이는 데이터만 표시

예를 들어 20개를 가져왔더라도
한 화면에 보이는 건 10개 정도만.

나머지 10개는 미리 캐시(Preload) 형태로 보관.

 

3.스크롤이 일정 위치에 도달하면 다음 페이지 요청

UICollectionViewDataSourcePrefetching 기능을 활용
스크롤이 끝나기 전에 다음 데이터를 미리 fetch.

extension DiaryListViewController: UICollectionViewDataSourcePrefetching {
    func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
        let threshold = diaryList.count - 5
        if indexPaths.contains(where: { $0.item > threshold }) {
            loadNextBatch() // 다음 데이터 로드
        }
    }
}

 

 

이렇게 하면
사용자는 “데이터가 미리 준비된 상태”로 스크롤하기 때문에
화면이 끊기지 않고 자연스럽게 넘어갑니다.


🧠 비동기(async) 로딩은 보조 수단일 뿐

많은 분들이 성능 개선을 위해
async/await를 먼저 떠올리지만,
사실 중요한 건 데이터를 얼마나 효율적으로 나누어 불러오느냐입니다.

 

예를 들어,
1개의 감정일기에 최대 8장의 이미지를 불러온다면
비동기를 쓰지 않아도 충분히 빠릅니다.

하지만 “20개의 일기를 한 번에 로드”한다면
이미지가 160장 이상 될 수 있으므로
이때는 async로 백그라운드에서 이미지 로딩을 처리하는 게 좋습니다.

 

"async는 “필수”가 아니라 “UX를 부드럽게 만들어주는 보조 장치”입니다."


💡 실제 구현 시 권장 순서

단계 내용
1️⃣ Core Data에서 fetchLimit과 fetchOffset을 이용해 데이터 나누기
2️⃣ 한 화면에는 최대 10개 정도만 먼저 표시
3️⃣ UICollectionViewDataSourcePrefetching으로 다음 데이터 미리 로드
4️⃣ 필요 시 async/await으로 이미지 로드 백그라운드 처리

 

이 순서로 구현하면
성능, UX, 코드 복잡도 세 마리 토끼를 모두 잡을 수 있습니다 🐇🐇🐇


🧩 정리하자면

항목 설명
📚 Pagination(페이징) 데이터를 일정 단위로 나누어 점진적으로 가져오는 방식
⚙️ 중요 포인트 fetchLimit / fetchOffset, prefetch 구현
async의 역할 보조적 성능 개선 (대량 이미지, 다중 fetch 시 유용)
🎯 핵심 전략 “부분 로딩”을 먼저, 비동기는 나중에

✨ 요약하자면

지금 단계에서 가장 중요한 건 “데이터를 얼마나 효율적으로 잘라서 불러오느냐”입니다.
async를 도입하기 전에, Pagination(페이징) 구조를 먼저 안정적으로 설계하는 게
Core Data 앱 성능을 개선하는 가장 현실적이고 강력한 방법입니다 💪

728x90
LIST