onBan

Stack: Caching, MVP, Network, UIKit, UserDefault, iOS Team: 1์ธ Role: ๊ฐœ๋ฐœ ์ง„ํ–‰ ๊ธฐ๊ฐ„: 2021/09/27 โ†’ 2021/10/08 About: ๋ฐ˜์ฐฌ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

๊ตฌ์กฐ

๊ธฐ๋Šฅ

  • ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ
  • ์ƒํ’ˆ ๋ชฉ๋ก ๊ธฐ๋Šฅ
  • ์„ธ๋ถ€ํ™”๋ฉด ๊ธฐ๋Šฅ
  • ์ฃผ๋ฌธ ๊ธฐ๋Šฅ
  • ์—ฐ๊ฒฐ์„ฑ์— ๋”ฐ๋ผ ํ™”๋ฉด ํ‘œํ˜„์„ ๋ณ€๊ฒฝํ•จ
  • Dynamic Framework๋กœ ๋„คํŠธ์›Œํฌ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ถ”๊ฐ€ํ•จ
  • ์Šคํฌ๋กค๋ทฐ pagenation ๊ตฌํ˜„
  • ๋‹คํฌ๋ชจ๋“œ ๋Œ€์‘

๋™์ž‘

ํšŒ์› ๊ฐ€์ž…

  • ์•„๋ž˜ ์ด๋ฆ„์„ ๋ˆŒ๋ €์„ ๋–„, ๋Œ€์‘๋˜์ง€ ์•Š๋Š” ๊ธฐ๊ธฐ(5s)๊ฐ€ ์žˆ์–ด, ๋ˆŒ๋ €์„๋•Œ ํ™”๋ฉด์ด ์˜ฌ๋ผ์˜ค๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฉ”์ธ ํ™”๋ฉด

  • ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์‹œ FileCache๋กœ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
  • DispatchGroup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ฐจ์ ์ธ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋ชจ๋‘ ๋ฐ›์€ ํ›„์— ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์žฅ๋ฐ”๊ตฌ๋‹ˆ

๊ณ ๋ฏผ๊ณผ ๋ฐฐ์šด์ 

  • ๋น„๋™๊ธฐ ํ†ต์‹ ์— ์žˆ์–ด์„œ ๋ณด์—ฌ์ง€๋Š” ์ด๋ฏธ์ง€์˜ ์ˆœ์„œ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. DisPatchGroup์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์„ธ๋ถ€ ๋ทฐ๊ฐ€ ๋ชจ๋‘ ๋ฐ›์•„์ง„ ๊ฒฝ์šฐ์— ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•˜์˜€๋Š”๋ฐ, ์ด๋Ÿด ๊ฒฝ์šฐ ๋จผ์ € ๋ฐ›์•„์ง„ ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์—ฌ์ง€์ง€ ์•Š์•„ UX ์ธก๋ฉด์—์„œ ์ข‹์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ถ”ํ›„ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ˆœ์„œ๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.
  • UseCase ๊ฐ์ฒด์—์„œ๋Š” ๊ฐ ๊ธฐ๋Šฅ๋“ค์„ ์กฐํ•ฉํ•ด์„œ ์ „์ฒด ํ๋ฆ„์„ ๊ด€์žฅํ•˜๋Š” ๊ฐ์ฒด๋กœ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์š”์ฒญ์˜ ํ๋ฆ„์ด View โ†’ Presenter โ†’ Usecase๋กœ ๊ฐ€๋ฉด์„œ ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜๋“ค์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • ๋กœ์ง์ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ Notification์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ญ”๊ฐ€ ์ „์—ญ์ ์œผ๋กœ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋“ฏ ํ•˜์—ฌ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , Delegate ํŒจํ„ด์œผ๋กœ ๋ณ€ํ™”์‚ฌํ•ญ์„ ์ „์†กํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • CollectionView๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, header๋ฅผ ํด๋ฆญ์‹œ ํฌ๊ธฐ๋ฅผ ๊ฐ€๋ณ€์ ์œผ๋กœ ๋ณ€ํ™”ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ Model์•ˆ์— ํ•ด๋‹น Header๊ฐ€ ํ„ฐ์น˜๋˜์—ˆ๋Š”์ง€ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • ์ดํ›„ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Diffable DataSource, compositionalDataSource๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • Cache๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ FileCache๋ฅผ ํ•  ๋•Œ, ํŠน์ •ํ•œ ์ •์ฑ…์ด ์žˆ๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ ์šฉํ•˜์ง€ ๋ชปํ•ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ƒํƒœ์— ๋”ฐ๋ผ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€์žฅ ์ž๋ฆฌ์— ์ƒ‰์„ ํ‘œํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด, ๊ธฐ์กด์— ์ €์žฅํ•ด๋‘” json์œผ๋กœ๋ถ€ํ„ฐ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์—ฌ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ, ๋„คํŠธ์›Œํฌ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐํ•˜์—ฌ ํ™”๋ฉด์„ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์Šคํ† ๋ฆฌ๋ณด๋“œ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ดํ›„ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ชจ๋‘ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. (snapKit)
  • ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  URLSession์„ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ถ”ํ›„์—๋Š” Alamofire, KingFisher๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.