Skip to content

Latest commit

Β 

History

History
85 lines (53 loc) Β· 4.23 KB

Paging.md

File metadata and controls

85 lines (53 loc) Β· 4.23 KB

Android Paging Library

1. λ“€μ–΄κ°€κΈ°μ „...

νŽ˜μ΄μ§•μ€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터λ₯Ό μΌμ •ν•œ λ©μ–΄λ¦¬λ‘œ λ‚˜λˆ μ„œ μ œκ³΅ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
μ„œλ²„-ν΄λΌμ΄μ–ΈνŠΈ λͺ¨λΈμ—μ„œλŠ” 주둜 μ„œλ²„μ—μ„œ νŽ˜μ—μ§•μ„ κ΅¬ν˜„ν•œ λ’€, ν΄λΌμ΄μ–ΈνŠΈλ₯Ό 톡해 μ‚¬μš©μžκ°€
μ—΄λžŒν•œ νŽ˜μ΄μ§€μ˜ 정보λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.

λ§Œμ•½ νŽ˜μ΄μ§•μ„ μ•ˆν•˜κ³  μ‚¬μš©μžν•œν…Œ 데이터λ₯Ό 보여주면 μ–΄λ–»κ²Œ λ κΉŒμš”?
Google 에 Android λ₯Ό κ²€μƒ‰ν•˜λ©΄ 검색결과가 μ•½ 28 μ–΅κ°œλ‚˜ λœλ‹€κ³  ν•©λ‹ˆλ‹€.

그리고 28 μ–΅κ°œμ˜ 검색결과λ₯Ό λ‹€ 보여쀄 λ•Œ, 1개의 검색 κ²°κ³Ό 1byte 의 크기λ₯Ό μ°¨μ§€ν•œλ‹€κ³  κ°€μ •ν•˜λ©΄ μ‚¬μš©μžλŠ”
μ•½ 2.8 Gbyte 의 크기λ₯Ό 읽어와야 λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

κ²°κ΅­ μ‚¬μš©μžκ°€ ν•œλ²ˆ 검색할 λ•Œλ§ˆλ‹€ μ•„μ£Ό 큰 λ„€νŠΈμ›Œν¬ λΉ„μš©μ„ λ“€κ²Œ λ©λ‹ˆλ‹€.
μ΄λ ‡κ²Œ 큰 λΉ„μš©μ„ κ°μˆ˜ν•˜κ³  검색을 ν•˜λŠ” μ‚¬μš©μžλŠ” 없을 κ²ƒμž…λ‹ˆλ‹€.

κ·Έλž˜μ„œ νŽ˜μ΄μ§•μ„ 톡해 데이터λ₯Ό λ‚˜λˆ„μ–΄μ„œ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ£ΌλŠ” μ΄μœ μž…λ‹ˆλ‹€.

자, κ·Έλ ‡λ‹€λ©΄ λͺ¨λ°”일 μ•±μ—μ„œμ˜ νŽ˜μ΄μ§•μ€ μ–΄λ–¨κΉŒμš”?

2-1. Android μ—μ„œμ˜ μ „ν˜•μ μΈ νŽ˜μ΄μ§• 기법

λͺ¨λ°”일 μ•±μ—μ„œ νŽ˜μ΄μ§•μ€ κ·Έλ ‡κ²Œ μƒμ†Œν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 기법은 μ•„λ‹™λ‹ˆλ‹€.
이미 λ¬΄ν•œ 슀크둀링 κ³Ό 지연 λ‘œλ”© 기법 이라 λΆˆλ¦¬λŠ” λ°©λ²•μœΌλ‘œ λͺ¨λ°”일 μ•± μ‹œμž₯μ—μ„œ 많이 μ‚¬μš©λ˜λŠ” νŒ¨ν„΄λ“€μ΄ 있으며,

이 νŒ¨ν„΄λ“€μ„ κ΅¬ν˜„ν•˜λŠ” 방법은 널리 μ•Œλ €μ§„μ§€ μ˜€λž˜μž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ λ¬΄ν•œ 슀크둀링과 지연 λ‘œλ”© 기법은 λ¬΄μ—‡μΌκΉŒμš”?

λ¬΄ν•œ 슀크둀링

λ¬΄ν•œ μŠ€ν¬λ‘€λ§μ— λŒ€ν•΄ κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•˜λ©΄ OnScrollListener λ₯Ό μ΄μš©ν•΄ 슀크둀이 ν•˜λ‹¨μ— λ„λ‹¬ν•˜κ²Œ 될 λ•Œ,
데이터듀을 μ μ§„μ μœΌλ‘œ κ°€μ Έμ˜€λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

λ¬΄ν•œ μŠ€ν¬λ‘€λ§μ€ 페이슀뢁과 같이 전체 리슀트λ₯Ό λ³΄μ—¬μ£ΌλŠ”κ²Œ μ€‘μš”ν•œκ²Œ μ•„λ‹Œ μ•±μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

지연 λ‘œλ”© 기법

지연 λ‘œλ”© 기법은
μ—°λ½μ²˜ μ•±κ³Ό 같이 μ²˜μ›€μ— λͺ¨λ“  데이터듀을 가져와 리슀트λ₯Ό λ§Œλ“œλŠ” 방법을 λ§ν•©λ‹ˆλ‹€.
μ΄λŠ” 패슀트 슀크둀이 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

2-2. 문제점

λͺ°λ‘  κΈ°μ‘΄ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ν•˜λŠ”λ°μ—λŠ” λ¬Έμ œμ λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

λ¬΄ν•œ 슀크둀링

  • RecylerView 슀크둀 μ‹œ μ•„μ΄ν…œμ„ λ‹€λ£¨λŠ” 방법이 ν•„μš”
  • 슀크둀 λ°©ν–₯, 이미 νŽ˜μ΄μ§€κ°€ λ‘œλ”© 쀑인지, 더 이상 뢈러올 데이터가 없을 λ•Œ 같은 상황을 λͺ¨λ‘ κ³ λ € 해야됨.
  • λ‹€μŒ νŽ˜μ΄μ§€ 호좜 μ‹œμ μ„ μ•Œμ•„λ‚΄κΈ° μœ„ν•œ UI μ²˜λ¦¬μ—λ„ 집쀑이 ν•„μš”
  • 무엇보닀 곡식적인 κ°€μ΄λ“œκ°€ λΆ€μž¬...

지연 λ‘œλ”© 기법

  • 뢈러올 데이터가 클 수둝 지연이 컀지고 말 것이닀.
  • κ²°κ΅­ μ‚¬μš©μžλŠ” κ·Έλ™μ•ˆ 아무것도 λͺ»ν•˜κ²Œ λœλ‹€...

κ°œλ°œμžκ°€ μ΄λŸ¬ν•œ λ¬Έμ œμ λ“€μ„ κ³ λ €ν•΄μ„œ κ΅¬ν˜„ν•˜κΈ°μ—λŠ” κ½€ λ§Žμ€ λΉ„μš©κ³Ό μ‹œκ°„μ΄ λ“­λ‹ˆλ‹€.

3. Paging Library

2017λ…„ 9μ›”, Google μ—μ„œ Android Paging Libaray λ₯Ό λ°œν‘œλ₯Ό ν–ˆμŠ΅λ‹ˆλ‹€.

Paging LibraryλŠ” λŒ€λŸ‰μ˜ 데이터 셋을 청크 λ‹¨μœ„λ‘œ RecyclerView 에 μ‰½κ²Œ λ‘œλ“œν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
무엇보닀 μœ„μ— μ–ΈκΈ‰ν–ˆλ˜ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•΄μ£ΌλŠ” μƒˆλ‘œμš΄ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Paging LibraryλŠ” Room 이 λŒ€λŸ‰μ˜ 쿼리 κ²°κ³Όλ₯Ό μ–΄λ–»κ²Œ λ‹€λ£°μ§€μ—μ„œ λΉ„λ‘― λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
SQLiteCursor λŠ” λ‚΄λΆ€μ μœΌλ‘œ CusorWindow λ₯Ό 톡해 2MB의 κ³ μ •λœ νŽ˜μ΄μ§•μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

쿼리의 κ²°κ³Όκ°€ 10MB 라고 ν•  λ•Œ, 쿼리 κ²°κ³Όλ₯Ό ν•œλ²ˆμ— μ μž¬ν•˜μ§€ μ•Šκ³  이쀑 일뢀인 2MB λ§Œμ„
CursorWindow 에 λ‘œλ“œν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

λ§Œμ•½ SQLiteCursor κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 행을 μš”μ²­ν•˜κ²Œ 되면
CusorWindow λŠ” ν•΄λ‹Ή 행이 μ‘΄μž¬ν•˜λŠ” 청크λ₯Ό λΆˆλŸ¬μ™€ μœˆλ„μš°λ₯Ό λ‹€μ‹œ λ‘œλ“œν•˜λŠ” ν˜•νƒœλ‘œ νŽ˜μ΄μ§•μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ CusorWindow λ₯Ό μ΄μš©ν•œ λ‚΄λΆ€ νŽ˜μ΄μ§•μ€ λͺ‡ 가지 이유둜 μ„±λŠ₯ 문제λ₯Ό μΌμœΌν‚¬ 수 있고
예츑 λΆˆκ°€λŠ₯ν•œ 뢀뢄이 μžˆλ‹€κ³  ν•©λ‹ˆλ‹€.

κ·Έλž˜μ„œ Paging Library λŠ” 단일 CursorWindow λ‚΄μ—μ„œ λ™μž‘ν•˜λŠ” (SQLiteCursor 의 λ‚΄λΆ€νŽ˜μ΄μ§•μ΄ λ™μž‘ν•˜μ§€ μ•Šλ„λ‘)
슀λͺ° 쿼리λ₯Ό 지ν–₯ν•˜λŠ” 것이 핡심이라고 ν•©λ‹ˆλ‹€.

Paging Library λŠ” PagedList, DataSource, PagedListAdapter 둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.