iOS 도서 검색 앱에 무한 스크롤 구현하기

호씨·2025년 1월 2일
2

iOS 도서 검색 앱에 무한 스크롤 구현하기 🔄

프로젝트 배경 📝

카카오 도서 검색 API를 활용한 도서 검색 애플리케이션에 무한 스크롤 페이징 기능을 구현한 과정을 정리하였다.

기존 앱의 한계점 🚧

검색 결과의 제한

  • 한 번의 검색으로 최대 10개의 결과만 표시
  • 추가 결과를 보기 위해서는 새로운 검색 필요
  • 사용자 경험 저하

페이징 기능 구현 💻

ViewModel 개선

페이지네이션을 위한 상태 관리 속성 추가:

private var currentQuery = ""
private var currentPage = 1
private var isLastPage = false
private var isFetching = false

검색 로직 개선

func searchBooks(query: String) {
    if query != currentQuery {
        books = []
        currentPage = 1
        isLastPage = false
        currentQuery = query
    }
    
    guard !isFetching, !isLastPage else { return }
    fetchBooks(query: query, page: currentPage)
}

API 호출 최적화

private func fetchBooks(query: String, page: Int) {
    guard let encodedQuery = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
          let url = URL(string: "https://dapi.kakao.com/v3/search/book?query=\(encodedQuery)&page=\(page)&size=10") else {
        return
    }
    
    isFetching = true
    var request = URLRequest(url: url)
    request.allHTTPHeaderFields = ["Authorization": "KakaoAK \(apiKey)"]
    
    URLSession.shared.dataTask(with: request) { [weak self] data, response, error in
        // 응답 처리 및 상태 업데이트
    }.resume()
}

스크롤 기반 페이징 구현 📱

스크롤 감지

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let position = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height
    let screenHeight = scrollView.bounds.height
    
    if position > contentHeight - screenHeight - 100 {
        viewModel.loadNextPageIfNeeded()
    }
}

구현 시 고려사항 ⚙️

메모리 관리

  • 페이지 단위 데이터 로딩으로 메모리 사용 최적화
  • 불필요한 데이터 보관 방지
  • 메모리 누수 방지를 위한 weak self 사용

네트워크 최적화

  • 중복 요청 방지 로직 구현
  • 적절한 페이지 크기 설정
  • 네트워크 상태 고려

사용자 경험

  • 끊김 없는 스크롤 구현
  • 로딩 상태 표시
  • 오류 처리 및 재시도 기능

결론 💫

무한 스크롤 페이징 기능 구현을 통해 앱의 성능과 사용자 경험을 크게 개선하였다. 메모리 관리와 네트워크 최적화를 통해 안정적이고 효율적인 데이터 로딩을 실현하였으며, 앞으로도 지속적인 모니터링과 개선을 통해 더 나은 서비스를 제공할 예정이다.

profile
이것저것 많이 해보고싶은 사람

0개의 댓글

관련 채용 정보