๐Ÿ“„ Paging3 ๋ฅผ ์‚ฌ์šฉํ•œ Android Pagination 1

sery270ยท2021๋…„ 8์›” 12์ผ
2

Android

๋ชฉ๋ก ๋ณด๊ธฐ
12/13
post-thumbnail

1๏ธโƒฃ paging3๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?


paging3๋ž€ pagination, paging์œผ๋กœ ๋ถˆ๋ฆฌ๋Š” ๊ธฐ๋ฒ•(์ดํ•˜ ํŽ˜์ด์ง•)์„ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ข€ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋˜์–ด ์ œ๊ณต๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, Android Jetpack์˜ ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค.

ํŽ˜์ด์ง•์ด๋ž€ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ์–ด ํŽ˜์ด์ง€๋ผ๋Š” ๊ฐ€์ƒ์˜ ๋‹จ์œ„๋กœ ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

์™œ paging3๋ฅผ ์จ์•ผํ•˜๋Š”๊ฐ€ ?

๋กœ์ปฌ ์ €์žฅ์†Œ๋‚˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ , ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„  ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์™€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์€ ํ•œ์ •์ ์ธ ์ž์›์ด์ง€๋งŒ, ์ด์˜ ์‚ฌ์šฉ๋Ÿ‰์€ ๋ฐ›์•„์˜ฌ ๋ฐ์ดํ„ฐ์˜ ๊ทœ๋ชจ์— ๋น„๋ก€ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๋Š” ์ ์—์„œ ํŽ˜์ด์ง•์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

ํŽ˜์ด์ง• ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ฐ›์•„์˜ค๋Š” ๋Œ€์‹ , ๋‹น์žฅ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ทธ๋•Œ ๊ทธ๋•Œ ๋ฐ›์•„์˜จ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๋‹ค.

  • ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž์›์„ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค. ์ž์› ๋‚ญ๋น„ ์˜ˆ๋ฐฉ
  • ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํฐ ๋Œ€์—ญํญ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ง‰ํž˜์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ณ‘๋ชฉํ˜„์ƒ ์˜ˆ๋ฐฉ, ์ž‘์—… ๋ถ„๋ฐฐ)

์ด๋ฐ–์— paging3์€ Android์™€ ๊ด€๋ จํ•œ ๋‹ค์–‘ํ•œ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ํŽ˜์ด์ง•๋œ ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์บ์‹ฑ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฑ์ด ํŽ˜์ด์ง• ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์š”์ฒญ ์ค‘๋ณต ์ œ๊ฑฐ ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜์–ด ์•ฑ์—์„œ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ๊ณผ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ์˜ ๋๊นŒ์ง€ ์Šคํฌ๋กคํ•  ๋•Œ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ RecyclerView ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • Kotlin ์ฝ”๋ฃจํ‹ด ๋ฐ Flow๋ฟ๋งŒ ์•„๋‹ˆ๋ผ LiveData ๋ฐ RxJava๋ฅผ ์ตœ๊ณ  ์ˆ˜์ค€์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ๊ณ ์นจ ๋ฐ ์žฌ์‹œ๋„ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ paging3์™€ ์•„ํ‚คํ…์ฒ˜


์•„๋ž˜ ๊ทธ๋ฆผ์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ์ต์ˆ™ํ•  ์•ˆ๋“œ๋กœ์ด๋“œ ๊ถŒ์žฅ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ๋„์ด๋‹ค. MVVM์— ๊ธฐ๋ฐ˜ํ•œ ๊ตฌ์กฐ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. Android Jetpack์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ ๋งŒํผ Paging3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๊ถŒ์žฅ ์•„ํ‚คํ…์ฒ˜์— ๋งž๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ Android Jetpack์˜ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ฐฐ๋–ก๊ถํ•ฉ์„ ๋ณด์žฅํ•œ๋‹ค.

์ด๊ฒƒ์ด Paging3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์ด๋‹ค. Paging3๋Š” ๊ฐ๊ฐ์˜ ์—ญํ•  ๋ถ„๋ฆฌ์™€ ์—ญํ• ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ณ„์ธต ๋ถ„๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ ๊ณ„์ธต์„ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๋“ค์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

3๏ธโƒฃ Paging3์˜ ๊ณ„์ธต๊ณผ ์—ญํ• 


Repository ๊ณ„์ธต

PagingSource

  • Clean ์•„ํ‚คํ…์ฒ˜์—์„œ DataSource์— ํ•ด๋‹น๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ์† : PagingSource<Key, Value>
    • Key : ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
    • Value : ๊ฐ ๊ฐ์ฒด์˜ ์œ ํ˜•
  • ๊ตฌํ˜„ : load()๋Š” ์‹ค์งˆ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ณณ์ž„ (remote, local ๋“ฑ๋“ฑ)
    • suspend ํ•จ์ˆ˜๋กœ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ
    • load()๋Š” ๋กœ๋“œ ๊ฒฐ๊ณผ์ธ LoadResult<Key, Value>๋ฅผ ๋ฆฌํ„ดํ•จ
      • LoadResult<Key, Value>
    • load()๋Š” ๋กœ๋“œ ์ž‘์—…์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” LoadParams๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š”๋‹ค.
      • LoadParams
  • ๊ตฌํ˜„ : getRefreshKey()๋Š” ๋ฐ์ดํ„ฐ ์ƒˆ๋กœ๊ณ ์นจ์‹œ์— ์ ์ ˆํ•œ key ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์คŒ

RemoteMediator

  • ๋ฐ์ดํ„ฐ ์บ์‹œ ๊ด€๋ จ๋œ ์ผ์„ ํ•˜๋Š” ๊ณณ์œผ๋กœ ์ดํ•ด๋จ. ์•„์ง ๋” ๊ณต๋ถ€ ํ•„์š” ! ํ•„์ˆ˜์ ์ธ ๊ตฌํ˜„ ์š”์†Œ๋Š” ์•„๋‹Œ ๋“ฏํ•จ

ViewModel ๊ณ„์ธต

Pager

  • PagingData ์˜ ํŒฉํ† ๋ฆฌ, ์ƒ์„ฑ์ž๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Pager๋Š” PaginSource์™€ PagingConfig์˜ ์กฐํ•ฉ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
    • Pager = PagingSource + PagingConfig + initialKey + remoteMediator(optional)

UI ๊ณ„์ธต

PagingDataAdapter

  • Paging์— ํŠนํ™”๋œ RecyclerView Adapter๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • PagingDataAdapter๋Š” RecyclerView.Adapter ๋ฅผ ์ƒ์† ๋ฐ›๊ณ  ์žˆ๋‹ค. ์ผ๋ฐ˜ RecyclerView์— ๋Œ€ํ•œ ์ž‘์—…๊ณผ ๋˜‘๊ฐ™์ด ์ž‘์—…ํ•˜๋ฉด ๋œ๋‹ค.
    • DiffUtil.ItemCallback ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

4๏ธโƒฃ paging3 ์‚ฌ์šฉํ•˜๊ธฐ


  • ๋Š” ๋‹ค์Œ์ฃผ์ค‘ ์™„์„ฑ ์˜ˆ์ •

#๏ธโƒฃ Reference


profile
๊ฐœ๋ฐœ์„ธ๋ฆฌ์˜ ์„ฑ์žฅ๊ธฐ๐ŸŒฟ

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 8์›” 14์ผ

๊ทธ๋Ÿผ ์˜ค๋Š˜๋„ ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค ๐ŸŒฟ ๊ฐ€ ์—†์–ด์„œ ํ—ˆ์ „ํ•ด์š”

1๊ฐœ์˜ ๋‹ต๊ธ€