Skip to content

bdrsky2010/LookForRealBurger

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ” LookForRealBurger - ์ง„์งœ ๋ง›์žˆ๋Š” ๋ฒ„๊ฑฐ๋ฅผ ์ฐพ์•„์„œ




์•ฑ ํ•œ ์ค„ ์†Œ๊ฐœ

๐Ÿ” ์ง„์งœ ๋ง›์žˆ๋Š” ํ–„๋ฒ„๊ฑฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์œ ์ €๋“ค๊ณผ ํ•จ๊ป˜ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ง€๋„๋ฅผ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ์•ฑ


์ฃผ์š”๊ธฐ๋Šฅ

  • ์ง€๋„ ๊ธฐ๋ฐ˜ ๋ฆฌ๋ทฐ ํ™•์ธ

    • ์‚ฌ์šฉ์ž๋Š” ์ง€๋„๋ฅผ ํ†ตํ•ด ์ฃผ๋ณ€ ํ–„๋ฒ„๊ฑฐ ๋ง›์ง‘์„ ํƒ์ƒ‰ํ•˜๊ณ , ํ•ด๋‹น ์‹๋‹น์— ์ž‘์„ฑ๋œ ๋ฆฌ๋ทฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‹๋‹น ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•€์„ ์„ ํƒํ•˜๋ฉด, ๋ฆฌ๋ทฐ์™€ ํ•จ๊ป˜ ์ด๋ฏธ์ง€๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๋ฐ ์ƒํ˜ธ์ž‘์šฉ

    • ์‚ฌ์šฉ์ž๋Š” ํ…์ŠคํŠธ์™€ ์ด๋ฏธ์ง€๋กœ ๋ฆฌ๋ทฐ๋ฅผ ๋‚จ๊ธฐ๋ฉฐ, ๋ฆฌ๋ทฐ์— ๋Œ€ํ•ด ์ข‹์•„์š” ํ˜น์€ ๋ถ๋งˆํฌ๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ž‘์„ฑ๋œ ๋ฆฌ๋ทฐ์— ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๊ณผ ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ”๋กœ์šฐ ๋ฐ ์œ ์ € ํ”ผ๋“œ

    • ์›ํ•˜๋Š” ์œ ์ €๋ฅผ ํŒ”๋กœ์šฐํ•  ์ˆ˜ ์žˆ๊ณ , ํŒ”๋กœ์šฐํ•œ ์œ ์ €๋“ค์˜ ํ”„๋กœํ•„์„ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ตœ์‹  ๋ฆฌ๋ทฐ๋ฅผ ํ”ผ๋“œ์—์„œ ์†์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๊ตญ์–ด ์ง€์›

    • ํ•œ๊ตญ์–ด, ์˜์–ด, ์ผ๋ณธ์–ด๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ์— ์„ค์ •๋œ ์–ธ์–ด์— ๋งž์ถฐ ์ž๋™์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š”๊ธฐ์ˆ 

  • ์ง€๋„ ๊ธฐ๋ฐ˜ ๋ฆฌ๋ทฐ

    • Mapkit์˜ MKMapViewDelegate ํ™œ์šฉํ•ด ์‚ฌ์šฉ์ž ๋ฆฌ๋ทฐ๊ฐ€ ์žˆ๋Š” ํ–„๋ฒ„๊ฑฐ ์‹๋‹น ์œ„์น˜๋ฅผ ์ง€๋„์— ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
    • Custom MKAnnotationView๋ฅผ ์‚ฌ์šฉํ•ด Pin์˜ ๋ชจ์–‘์„ ํ–„๋ฒ„๊ฑฐ ์•„์ด์ฝ˜์œผ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜์—ฌ
      ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ๋ˆˆ์— ์œ„์น˜๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ

    • ์ „์ฒด ๋ฆฌ๋ทฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ, Cursor Based Pagination์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋“œํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ

    • ๋ฆฌ๋ทฐ ์ž‘์„ฑ ์‹œ ์ด๋ฏธ์ง€์™€ ํ…์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์„œ๋ฒ„์— ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด HTTP Request(Post)์˜ Content-type์„
      multipart/form-data๋กœ ์„ค์ •ํ•˜์˜€์œผ๋ฉฐ, ์ด๋ฏธ์ง€๋ฅผ JPEG๋กœ ์••์ถ• ํ›„ HTTP Request์˜ Body์— ํฌํ•จํ•˜์—ฌ
      ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ

  • ์ธ์›
    • iOS 1๋ช…
  • ๊ธฐ๊ฐ„
    • 2024.08.14 - 2024.09.01 (์•ฝ 19์ผ)
  • ๋ฒ„์ „
    • iOS 15.0 +

ํ”„๋กœ์ ํŠธ ๊ธฐ์ˆ ์Šคํƒ

  • ํ™œ์šฉ๊ธฐ์ˆ 

    • UIKit, Mapkit
    • MVVM, Input-Output, Clean Architecture
    • CodeBasedUI
    • Cursor Based Pagination
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ชฉ์ 
RxSwift ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ ๋ฐ ์ผ๊ด€์„ฑ ์œ ์ง€
RxCocoa UI์™€ ๊ด€๋ จ๋œ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ ๋ฐ ์ผ๊ด€์„ฑ ์œ ์ง€
RxDataSources RxSwift ๋ฐ RxCocoa์™€ ํ•จ๊ป˜ ์ผ๊ด€์„ฑ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ
RxGesture RxSwift ๋ฐ RxCocoa์™€ ํ•จ๊ป˜ ์ผ๊ด€์„ฑ์žˆ๋Š” Gesture ์ฒ˜๋ฆฌ
RxCoreLocation RxSwift ๋ฐ RxCocoa์™€ ํ•จ๊ป˜ ์ผ๊ด€์„ฑ์žˆ๋Š” ์œ„์น˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
Snapkit CodeBasedUI๋ฅผ ์ข€ ๋” ํŽธํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๊ตฌ์„ฑ
Moya ์ถ”์ƒํ™”๋œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ™œ์šฉ
Toast ๊ฐ„ํŽธํ•œ ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€UI ๊ตฌ์„ฑ
Lottie ๊ฐ„ํŽธํ•˜๋ฉด์„œ ์ ์ ˆํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ
Tabman ๊ฐ„ํŽธํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ Paging ํƒญ๋ฐ”๋ฅผ ๊ตฌ์„ฑ
iamport-ios WebView ๊ธฐ๋ฐ˜์˜ ๊ฐ„ํŽธ๊ฒฐ์ œ ์ ์šฉ
IQKeyboardManagerSwift ํ‚ค๋ณด๋“œ ์ฒ˜๋ฆฌ ํ™œ์šฉ
Kingfisher API ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ

์•ฑ ์•„ํ‚คํ…์ณ

MVVM(Input/Output) + Clean Architecture

์„ค๋ช…

1. ๊ณ„์ธต๊ตฌ์กฐ

  • ViewModel (๊ด€๋ จ์ฝ”๋“œ)

    • RxSwift์™€ RxCocoa๋ฅผ ํ™œ์šฉํ•˜์—ฌ ViewController์™€์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต
    • Input๊ณผ Output์„ ์ •์˜ํ•˜์—ฌ View์™€ ํ†ต์‹ ์„ ๊ด€๋ฆฌ
    • UseCase๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ , UI ์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณต
  • UseCase (๊ด€๋ จ์ฝ”๋“œ)

    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต์œผ๋กœ, ํŠน์ • ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ๋ฐ ์ œ๊ณตํ•˜๋Š” ์—ญํ• 
    • Repository๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ๋ฐ ์ œ๊ณต
    • ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์‹œ, RxSwift์˜ Single trait์„ ํ™œ์šฉ ๋ฐ Result ํƒ€์ž…์œผ๋กœ
      ํ•œ ๋ฒˆ ๋” ๋ž˜ํ•‘ํ•˜์—ฌ error๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๊ตฌ๋…์ด ๋Š๊ธฐ์ง€ ์•Š๊ณ  Stream์ด ์œ ์ง€๋˜๋„๋ก ๊ตฌํ˜„
  • Repository (๊ด€๋ จ์ฝ”๋“œ)

    • Network์— API๋ฅผ ์š”์ฒญํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์—ญํ• ์„ ๋‹ด๋‹น
    • ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ DTO๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ API์— ์š”์ฒญ
    • ์‘๋‹ต์— ๋Œ€ํ•œ DTO ๋ฐ์ดํ„ฐ๋ฅผ Entity๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ UseCase์— ์ „๋‹ฌ
  • Network (Manager ๊ด€๋ จ์ฝ”๋“œ / Router ๊ด€๋ จ์ฝ”๋“œ)

    • Network Manager์™€ Network Router๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹ค์งˆ์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต
    • Network Manager: Moya์˜ MoyaProvider๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด ์‘๋‹ต์„ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด
    • Network Router: Moya์˜ TargetType์„ ๋” ์ถ”์ƒํ™”ํ•œ ํ˜•ํƒœ์˜ TargetType์„ ์ƒˆ๋กœ ์ •์˜ํ•˜์—ฌ ์ฑ„ํƒํ•œ
      enum์˜ case์™€ ์—ฐ๊ด€๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ API์˜ BaseURL, HTTPMethod, Parameter, Header ๋“ฑ์„ ์„ค์ •
    • RequestDTO์™€ ResposeDTO๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ๋ฐ ์‘๋‹ต
  • Data Storage (๊ด€๋ จ์ฝ”๋“œ)

    • UserDefaults๋ฅผ ํ™œ์šฉํ•˜์—ฌ Local DB๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณ„์ธต
    • ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์กฐํšŒ

2. ์˜์กด์„ฑ ์—ญ์ „ ์›์น™

ํ•˜์œ„ ๋ชจ๋“ˆ์„ ํ”„๋กœํ† ์ฝœ ํƒ€์ž…์œผ๋กœ์„œ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜์—ฌ ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ์—ญ์ „์‹œ์ผฐ์œผ๋ฉฐ,
๊ทธ๋กœ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ, Testableํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ

  • DIP๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์ธต ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋„๋ก SOLID ์›์น™์„ ๊ณ ๋ คํ•˜๋ฉฐ ๋ชจ๋“ˆ์„ ๊ตฌํ˜„
    • ๋‹จ์ผ ์ฑ…์ž„์˜ ์›์น™: ์—ญํ• ์— ๋”ฐ๋ฅธ ๊ธฐ๋Šฅ ๋ถ„๋ฆฌ๋กœ ์ธํ•œ ๊ณ„์ธต ๋ชจ๋“ˆํ™”
      (์˜ˆ: ์•ก์…˜์„ ๋‹ด๋‹นํ•˜๋Š” ViewModel, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” UseCase, ์ธ์ฆ์— ๋Œ€ํ•œ API๋ฅผ ๋‹ด๋‹นํ•˜๋Š” Repository ๋“ฑ๋“ฑ)

    • ๊ฐœ๋ฐฉ-ํ์‡„์˜ ์›์น™: ์ถ”์ƒํ™”๋œ protocol์„ ์ฑ„ํƒํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋Š” Class ๋‚ด๋ถ€์—์„œ privateํ•˜๊ฒŒ ๊ตฌํ˜„

    • ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™: ViewController๋ฅผ ์ž์‹ Class๋กœ ๋ฐ”๋ผ๋ณด๋ฉฐ ๊ณตํ†ต์ ์œผ๋กœ ํ•„์š”ํ•œ View(Navigation, Hierarchy, Layout, UI ๋“ฑ) ์„ค์ • ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ViewDidLoad์—์„œ ํ˜ธ์ถœํ•ด ์ž์‹ Class์ธ ViewController์—์„œ
      ์žฌ์ •์˜ํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ

    • ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™: Input, Output, UseCase, Repository ๋“ฑ ์—ญํ• ์— ๋”ฐ๋ฅธ ์ƒ์œ„ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋ฐ
      ํ”„๋กœํผํ‹ฐ๋งŒ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ์„œ ํ”„๋กœํ† ์ฝœ์— ์ •์˜

    • ์˜์กด์„ฑ ์—ญ์ „ ์›์น™: ์ƒ์œ„ ๋ชจ๋“ˆ์ด ํ•˜์œ„ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”, ์ถ”์ƒํ™”๋œ ํ”„๋กœํ† ์ฝœ์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“ˆ์„ ๊ตฌํ˜„

3. Input/Output ํŒจํ„ด

  • ์ถ”์ƒํ™”๋œ ํ˜•ํƒœ์˜ ํ”„๋กœํ† ์ฝœ๋กœ Input๊ณผ Output์„ ๊ตฌ์„ฑํ•˜์˜€์œผ๋ฉฐ, ๋‘ ํ”„๋กœํ† ์ฝœ์„ ๋ณ‘ํ•ฉํ•œ ํ˜•ํƒœ๋กœ typealias๋ฅผ ํ†ตํ•ด ๋ณ„์นญ์„ ViewModel๋กœ ์„ค์ •
  • View์—์„œ ์ผ์–ด๋‚˜๋Š” ์•ก์…˜์„ Input์„ ํ†ตํ•ด ViewModel์— ์ „๋‹ฌ
  • ViewModel์—์„œ ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Output์„ ํ†ตํ•ด View๋กœ ์ „๋‹ฌํ•˜์—ฌ UI๋ฅผ ์—…๋ฐ์ดํŠธ
  • Input/Output ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ MVVM ๊ตฌ์กฐ์—์„œ View์™€ ViewModel ๊ฐ„์— ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„
    ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•… ๋ฐ ๊ด€๋ฆฌ

4. DTO(Data Transfer Object)๊ตฌ์กฐ ๋ฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„

API ํ˜ธ์ถœ๋กœ ์ธํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹œ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ RequestDTO๋กœ ์š”์ฒญ, ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ
ResponseDTO๋กœ ๋ฐ›์œผ๋ฉฐ, ResposeDTO๋ฅผ Entity๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ด€๋ฆฌ

  • RequestDTO: API ํ˜ธ์ถœ ์‹œ ViewModel๊ณผ UseCase๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜จ Query ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ Repository ๊ณ„์ธต์—์„œ
    RequestDTO ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Network Manager์— ์ „๋‹ฌ

  • ResponseDTO: ์„œ๋ฒ„ API๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ JSON ๋ฐ์ดํ„ฐ๋ฅผ ResponseDTO ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ ํ›„ ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š”
    ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋กœ ๊ฐ€๊ณต๋œ Entity ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ UseCase๋กœ ์ „๋‹ฌ

  • Entity: ์•ฑ ๋‚ด ๋„๋ฉ”์ธ ์ฆ‰, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋กœ, ResposeDTO์—์„œ ๋ณ€ํ™˜๋œ ํ›„ UseCase๋กœ ์ „๋‹ฌ๋˜์–ด
    UI ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ViewModel๋กœ ์ „๋‹ฌ

  • ๋ชฉ์  ๋ฐ ์„ค๊ณ„: Input/Output์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์„ฑ๊ณต/์‹คํŒจ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธ

  • ๊ธฐ๋Œ€ ํšจ๊ณผ: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์„ฑ๊ณต๊ณผ ์—๋Ÿฌ์— ๋Œ€ํ•œ ํ•ธ๋“ค๋ง์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ์ž‘๋™ ํ™•์ธ์„ ํ†ตํ•ด ์‹ ๋ขฐ์„ฑ ํ™•์ธ

  • ํ…Œ์ŠคํŠธ ์ง„ํ–‰: Mock ๊ฐ์ฒด(UseCase, LocalStorge)๋ฅผ ํ†ตํ•œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ฐ Local DB ์ ‘๊ทผ์„ ํ•˜์˜€์œผ๋ฉฐ,
    Protocol ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ViewModel์— ์‹ค์ œ ์‚ฌ์šฉ๋˜๋Š” ViewModel ๊ฐ์ฒด๋ฅผ ๋Œ€์ž…ํ•˜์—ฌ ์‹ค์งˆ์ ์ธ
    Input/Output์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ.

6. ์•„ํ‚คํ…์ณ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์˜ˆ์‹œ


ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

Unit Test - Mock ๊ฐ์ฒด ๋ฉ”์„œ๋“œ ๋‚ด ๋ถ„๊ธฐ์ฒ˜๋ฆฌ

Unit Test - Mock ๊ฐ์ฒด ๋ฉ”์„œ๋“œ ๋‚ด ๋ถ„๊ธฐ์ฒ˜๋ฆฌ

๋ณธ์ธ์€ ์•ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๋Œ€ํ•œ ์‹ ๋ขฐ์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด Unit Test๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

ViewController์˜ Input/Output ์•ก์…˜์„ ๋‹ด๋‹นํ•˜๋Š” ViewModel์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” UseCase๋ฅผ ํ…Œ์ŠคํŠธ์šฉ Mock ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž… ํ›„, ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜์˜€๋‹ค.



ํ•˜์ง€๋งŒ ์‹œ์ž‘ํ•˜์ž๋งˆ์ž ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ, protocol์— ์š”๊ตฌ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Mock ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ API ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ์„ฑ๊ณต๊ณผ ์‹คํŒจ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์—†์–ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ์— ์–ด๋ ค์šด ์ƒํ™ฉ์— ์ง๋ฉดํ–ˆ๋‹ค.

์ด ์ƒํ™ฉ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์€ Flag์— ๋Œ€ํ•œ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด์„œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋Š” protocol์„ ํ†ตํ•ด์„œ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— class ๊ตฌํ˜„์ฒด ๋‚ด๋ถ€์˜ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†์—ˆ๊ณ  ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์˜ ์„ ํƒ์€ protocol์˜ extension ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค

protocol์—์„œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ํ•  ๋•Œ๋Š” ๋ฉ”์„œ๋“œ ๋ฐ ํ”„๋กœํผํ‹ฐ์˜ ์„ ์–ธ๋งŒ ์ด๋ค„์ง€๋Š”๋ฐ protocol extension์„ ํ†ตํ•ด ํ™•์žฅํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

UseCase protocol์˜ extension์„ ํ†ตํ•ด API ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ณผ์ •์—์„œ ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๋Œ€ํ•œ ๋ถ„๊ธฐ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” bool ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ setter ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ ํ›„, ํ•ด๋‹น protocol์„ ์ฑ„ํƒํ•˜๋Š” Mock ๊ฐ์ฒด์—์„œ ์‹ค์งˆ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.




๋•๋ถ„์— ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๋Œ€ํ•œ ์ผ€์ด์Šค ๋‘˜๋‹ค ์„ฑ๊ณต์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.



Access Token ์ž๋™๊ฐฑ์‹ 

Access Token ์ž๋™๊ฐฑ์‹ 

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  API(๊ฒŒ์‹œ๋ฌผ, ํŒ”๋กœ์ž‰/ํŒ”๋กœ์šฐ ๋“ฑ๋“ฑ)๋Š”
๋กœ๊ทธ์ธ API๋ฅผ ํ†ตํ•ด ๋ฐœ๊ธ‰๋ฐ›์€ Access Token์„ ์š”๊ตฌํ•œ๋‹ค.

์ด Access Token์˜ ์œ ํšจ ์‹œ๊ฐ„์€ ์•ฝ 5๋ถ„์œผ๋กœ ์งง์•˜๋Š”๋ฐ
๊ทธ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๋Š” ๊ณ„์† Access Token์ด ๋งŒ๋ฃŒ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์ง๋ฉดํ•˜๊ฒŒ ๋œ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  1. Access Token์ด ๋งŒ๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ์žฌ๋กœ๊ทธ์ธ์„ ํ•˜๋Š” ๋ฐฉ์‹
  2. Refresh Token์„ ํ†ตํ•ด Access Token์„ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹

์ด ๋‘ ๋ฐฉ์‹์ด ๊ณ ๋ฏผ์ด ๋๋˜ ์ด์œ ๋Š” Access Token์„ ๊ฐฑ์‹ ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ Refresh Token๋„ ๋งŒ๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ
๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์žฌ๋กœ๊ทธ์ธ์„ ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–จ๊นŒ ๋ผ๋Š” ๊ณ ๋ฏผ์„ ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์—์„œ ๋˜ ๊ณ ๋ฏผ์„ ํ•ด์•ผํ–ˆ๋˜ ๋ถ€๋ถ„์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ๋” ์กด์žฌํ–ˆ๋‹ค.

  1. ์ง์ ‘ ๋กœ๊ทธ์ธ ๋ฐฉ์‹: Access Token์ด ๋งŒ๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋กœ๊ทธ์ธํ•˜๊ฒŒ ํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์ด ๋งค์šฐ ๋‚˜๋น ์งˆ ๊ฒƒ์ด๋‹ค.
  2. ์ž๋™ ๋กœ๊ทธ์ธ ๊ตฌํ˜„: ์ž๋™ ๋กœ๊ทธ์ธ์˜ ๊ฒฝ์šฐ ์œ ์ €์˜ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ ์ด๋ฅผ UserDefaults์ธ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์ƒ์œผ๋กœ ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ํŒ๋‹จ์ด ๋๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ์žฌ๋กœ๊ทธ์ธ์„ ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— Access Token์ด ๋งŒ๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค
์žฌ๋กœ๊ทธ์ธ์„ ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—„์ฒญ๋‚œ ๋ถˆํŽธํ•จ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
Refresh Token์„ ํ†ตํ•œ Access Token ์ž๋™ ๊ฐฑ์‹  ๋ฐฉ์‹์„ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์žฌ๋กœ๊ทธ์ธํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Refresh Token์„ ํ†ตํ•œ ์ž๋™ ๊ฐฑ์‹  ๋ฐฉ์‹์„ ์„ ํƒํ•˜์˜€๋‹ค.
์ฆ‰, Refresh Token์ด ๋งŒ๋ฃŒ๋  ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žฌ๋กœ๊ทธ์ธ์„ ์š”๊ตฌํ•จ์œผ๋กœ์จ ๋ณด์•ˆ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ฒŒ ๋˜์—ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ์ž‘์„ฑ๋œ ๋กœ์ง์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.

ํ•˜์œ„ ViewController ๋ชจ๋‘ ๋ทฐ ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ์‚ฌ๋ผ์ง€๋Š” ์ƒํ™ฉ

ํ•˜์œ„ ViewController ๋ชจ๋‘ ๋ทฐ ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ์‚ฌ๋ผ์ง€๋Š” ์ƒํ™ฉ

  • TabBarController ์˜ ์„ธ๋ฒˆ์งธ ํƒญ์„ ํƒญํ•˜๊ฒŒ ๋˜๋ฉด EmptyViewContoller ์ฆ‰ ๋นˆ ViewController๊ฐ€ load ๋˜๊ณ 
    ํ•ด๋‹น ViewController๊ฐ€ ๋กœ๋“œ๋˜๋ฉด Modal์ด Present ๋˜๋Š” ์ƒํ™ฉ
  • Modal์ด Present ๊ฐ€ ๋œ ์ƒํ™ฉ์—์„œ ๋ทฐ์˜ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ Xcode Hierarchy๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋‹ˆ ํ•˜์œ„ ViewController ๋ชจ๋‘
    ๋ทฐ์˜ ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ์‚ฌ๋ผ์ง„ ์ƒํ™ฉ
  • ๊ทธ๋ฆฌ๊ณ  ์œ„ ๊ฒฝ๊ณ  message๊ฐ€ Console ์— ์ถœ๋ ฅ
  • ๊ฒฝ๊ณ  message
    • ๋จผ์ € EmptyPresentViewController ๊ฐ€ ๋ทฐ์˜ ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค!
    • ์ด ๋ถ„๋ฆฌ๋œ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์—์„œ UINavigationController ๋ฅผ Present ํ•˜๋Š” ๊ฒƒ์„ ์ข€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.
    • ์†์ƒ๋œ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‹ˆ EmptyViewController๊ฐ€ ๋ณด์—ฌ์ง€๊ธฐ ์ „์— ๋ทฐ์˜ ๊ณ„์ธต๊ตฌ์กฐ์— ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ผ
    • ์•ˆ๊ทธ๋Ÿฌ๋ฉด ๋จผํ›—๋‚  ์–ธ์  ๊ฐ€ hard exception์ด ์ผ์–ด๋‚˜ ์•ฑ์ด crash ๋  ์ˆ˜ ์žˆ๋‹ค.


์œ„ ๊ฒฝ๊ณ  message๋ฅผ ํ•ด์„ํ•œ ํ›„ Modal์ด Present ๋˜๋Š” ์œ„์น˜๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ

viewWillAppear(_ animated: Bool) ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ๋‚ด์— ์ž‘์„ฑ

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ,

viewWillAppear(_ animated: Bool) ์—์„œ ViewController ๋ฅผ Present ํ•˜๊ฒŒ๋˜๋ฉด ๋ทฐ๊ฐ€ ๋‹ค ๋ณด์—ฌ์ง€์ง€ ์•Š์€ ์ƒํƒœ์—์„œ Modal์—์„œ ๋ณด์—ฌ์ง€๋Š”ViewController๊ฐ€ ๊ณ„์ธต๊ตฌ์กฐ์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค๋ฉฐ

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ EmptyViewController ๊ฐ€ ๋ทฐ์˜ ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ์‚ฌ๋ผ์ง„ ๊ฒƒ์ด ์•„๋‹Œ ๋ทฐ์˜ ๊ณ„์ธต๊ตฌ์กฐ์— ์˜ฌ๋ผ๊ฐ€๊ธฐ๋„ ์ „์— ๋ถ„๋ฆฌ๊ฐ€ ๋˜์–ด ๋ฒ„๋ฆฐ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จ



๊ทธ๋ ‡๋‹ค๋ฉด ViewController ๊ฐ€ ๋‹ค ๋ณด์—ฌ์ง„ ์ƒํƒœ์—์„œ Modal ์„ Present ํ•˜๊ฒŒ๋˜๋ฉด ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๋Š” ํ™•์‹ ์ด ๋“ค์—ˆ์œผ๋ฉฐ

Modal ์ด Present ๋˜๋Š” ์ฝ”๋“œ๋ฅผ viewDidAppear(_ animated: Bool) ๋‚ด์— ์ž‘์„ฑ

๊ทธ ํ›„, ๋นŒ๋“œํ•ด์„œ ํ™•์ธํ•ด๋ณด๋‹ˆ ์—๋Ÿฌ message๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ๋ทฐ์˜ ๊ณ„์ธต๊ตฌ์กฐ๋„ ์ž˜ ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋Š๋‚€์ 
ViewController์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•  ๋•, ์ƒ๊ฐ์„ ์ข€ ํ•˜๋ฉด์„œ ํ•ด์•ผ๊ฒ ๋‹ค ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.


Pull To Refresh

Pull To Refresh



  • ์ „์ฒด ๋ฆฌ๋ทฐ ๊ฒŒ์‹œ๊ธ€์„ ํ™•์ธํ•˜๋Š” ํ™”๋ฉด์—์„œ Pull To Refresh ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•ด๋†“์€ ์ƒํ™ฉ
  • ์ด ๊ธฐ๋Šฅ์„ ๋‚ด๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์œผ๋กœ๋Š” ๊ฒŒ์‹œ๊ธ€์ด Refresh ๊ฐ€ ๋˜๊ณ  ์žˆ๋Š” ์ง€ ์•„๋‹Œ ์ง€
    ๊ตฌ๋ถ„์ด ๋˜์ง€ ์•Š์„ ์ •๋„๋กœ ๋„ˆ๋ฌด ๋น ๋ฅด๊ฒŒ ์‚ฌ๋ผ์กŒ์œผ๋ฉฐ
  • ์ด ๋ถ€๋ถ„์ด ๋‚ด ์ž…์žฅ์—์„œ๋Š” ์–ด์ƒ‰ํ•จ๊ณผ ๋‹ต๋‹ตํ•จ์ด ๋Š๊ปด์กŒ๋‹ค.


  • ๋ฌผ๋ก  ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ๊ตฌํ˜„์„ ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ฆ‰, ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํŒจ์น˜๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ”๋กœ Refreshing์„ ๋๋‚ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ API ํ†ต์‹ ์ด ์™„๋ฃŒ๋˜๋ฉด end Refreshing ๋˜๋„๋ก ๋กœ์ง์„ ์ˆ˜์ •ํ•ด๋ด๋„ ๋ฐ์ดํ„ฐ ํŒจ์น˜ ์†๋„๊ฐ€ ๋นจ๋ผ
    ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚˜๋Š” ์‹œ์ ์ด ๊ฑฐ์˜ ์œ ์‚ฌํ–ˆ๋‹ค.


  • ๊ฒฐ๊ตญ์—๋Š” refreshing ์„ ๋๋‚ด๋ผ๋Š” Output Action ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋˜๋ฉด 2์ดˆ Delay ๋ฅผ ์ฃผ๊ณ 
    End Refreshing ๋˜๋„๋ก ๋ณ€๊ฒฝ
  • ๋ฌผ๋ก  ์ด๊ฑด ๋„ˆ๋ฌด ์–ต์ง€๋ผ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ๊ฐœ๋ฐœ์ž๋„ ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐ์„ ํ•ด๋ด์•ผ ํ•œ๋‹ค๊ณ 
    ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ ์ด๊ฒŒ ๋” ๋‚˜์€ ์„ ํƒ์ด๋ผ๊ณ  ๋Š๊ปด์กŒ๋‹ค.


  • ์‹ค ๊ธฐ๊ธฐ์— ๋นŒ๋“œํ•ด ๋ณธ ๊ฒฐ๊ณผ ์–ด์ƒ‰ํ•จ๊ณผ ๋‹ต๋‹ตํ•จ์€ ํ•ด์†Œ๊ฐ€ ๋˜์—ˆ๋‹ค.

ํšŒ๊ณ 

๋ธ”๋กœ๊ทธ ์ฐธ๊ณ 


About

Look for real burger

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages