kiwi1023 / iOS-Mongsil

๋ชฝ์‹ค - ๋‘๋ฃจ๋ญ‰์ˆ ํ•œ ํ•˜๋ฃจ์˜ ๊ฐ์ • ๊ธฐ๋ก, ํ•˜๋ฃจํ•œ์žฅ ๋ช…์–ธ iOS.ver
4 stars 2 forks source link

๐Ÿ“’ Mongsil

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

<2022-12-29 ~ 2023-01-30>

๐Ÿ“– ๋ชฉ์ฐจ

  1. ์†Œ๊ฐœ
  2. ์‹คํ–‰ ํ™”๋ฉด
  3. ๊ณ ๋ฏผํ•œ ์ 
  4. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
  5. ์ฐธ๊ณ  ๋งํฌ

๐ŸŒฑ ์†Œ๊ฐœ

๐Ÿ’ป ๊ฐœ๋ฐœํ™˜๊ฒฝ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

[swift]() [xcode]() [iOS]()

๐Ÿง‘ ํŒ€์›

Kiwi ๊ทธ๋ฃจํŠธ

๐Ÿ“ฑ ์‹คํ–‰ ํ™”๋ฉด

๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ๋‹ฌ๋ ฅ ๋ฆฌ์ŠคํŠธ
์ผ๊ธฐ ์ถ”๊ฐ€ ์ผ๊ธฐ ์ˆ˜์ •/์‚ญ์ œ ์ผ๊ธฐ ๋ฉ”๋‰ดํ™”๋ฉด
๊ด€์‹ฌ ์„ค์ •

๐Ÿ‘€ ๊ณ ๋ฏผํ•œ ์ 

**Clean Architecture๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.** - Testableํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด MVVM์„ ์•Œ์•„๋ณด๋˜ ์ค‘ Clean Architecture๋ฅผ ํ•จ๊ป˜ ์“ฐ๋Š” ๊ด€๋ จ ๊ธ€์ด ๋งŽ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - MVVM๊ณผ Clean Architecture๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ์ƒ๊ฒจ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. - Clean Architecture๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ MVVM์˜ Model ๋ถ€๋ถ„์„ ์„ธ๋ถ„ํ™”ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - ๊ฐ ํŠน์„ฑ์— ๋งž๋Š” ์—ญํ• ๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•ด์ฃผ๋ฉด ๋ชจ๋ธ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋“ค์ด ๋ณ€ํ™”์™€ ํ™•์žฅ์— ์—ด๋ ค์žˆ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. - ์ด๋Ÿฐ ์žฅ์ ์„ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด CoreData์™€ ์ƒˆ๋กญ๊ฒŒ Firebase๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋กœ์ปฌ๊ณผ ๋ฆฌ๋ชจํŠธ DB๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
**REST_API์˜ Get์„ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ ์…€์— ์ด๋ฏธ์ง€๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์…€ ์žฌ์‚ฌ์šฉ ์‹œ ๊ธฐ์กด Reqeust๋ฅผ ์ทจ์†Œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.** - CompletionHandler ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๋•Œ Task๋ฅผ cancelํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, Combine์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„  cancel์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. - Combine ํ•™์Šต์„ ํ†ตํ•ด AnyCancellable์„ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ๋…์ด ์ข…๋ฃŒ๋˜๊ณ  ๊ตฌ๋…์— ์˜ํ•œ ์š”์ฒญ์ด ์ทจ์†Œ๋จ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - Cell์˜ prepareForReuse()์—์„œ image๋ฅผ ์š”์ฒญํ•˜๋Š” AnyCancellable์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ reqeust ์ทจ์†Œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
**Controller์™€ View ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ง„ํ–‰ํ• ๋•Œ์— Combine์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.** - Controller ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ์ž์˜ Action์„ ์ž…๋ ฅ ๋ฐ›๋Š” ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฒƒ์— Combine์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. - ๊ทธ๋Ÿฌ๋‚˜ Controller ํ•˜์œ„ View์—์„œ๋Š” ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. - RxSwift๊ฐ™์€ ๊ฒฝ์šฐ RxCocoa์™€์˜ ํ˜ธํ™˜์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Combine์˜ ๊ฒฝ์šฐ SwiftUI์˜ ์‚ฌ์šฉ์„ ์ „์ œํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ธฐ ๋•Œ๋ฌธ์— UIkit์—์„œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. - ๊ฒฐ๊ตญ Delegate ๋ฐ ํด๋กœ์ €๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ์•ž์œผ๋กœ UIkit์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ Combine์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ•™์Šต์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

โ“ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

**์ดˆ๊ธฐ์— ์„ค์ •ํ•œ useCase์˜ read ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ํƒ€์ž…์ด [Diary] ํƒ€์ž…์ด์˜€์œผ๋‚˜, ์ถ”ํ›„์— Remote DB ์‚ฌ์šฉ ์‹œ ๋น„๋™๊ธฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ „๋‹ฌ ํƒ€์ž…์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.** - ์‹œ๋„ - Combine์„ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Combine์˜ ์–ด๋–ค ํƒ€์ž…์œผ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•  ์ง€ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. - ํ•ด๊ฒฐ - Repository์—์„œ ๊ฐ’์„ ๋ณด๋‚ผ ๋•Œ ๊ฐ’์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ Error ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ Future ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. - ์‹ค์ œ๋กœ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ˜•์‹์€ ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ณ , ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋กœ์ง๋ณ€๊ฒฝ ์—†์ด ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” AnyPublisher ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
**textView์˜ ๋†’์ด๋ฅผ ๋‚ด์šฉ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•  ๋•Œ constraint์˜ ์ถฉ๋Œ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.** - ์‹œ๋„ - textView์˜ ๋†’์ด๋ฅผ ์ผ์ •ํ•œ ๋†’์ด๊นŒ์ง€๋งŒ ๋Š˜๋ฆฌ๊ณ  ๊ทธ ํ›„์—” ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค. - ์ตœ๊ณ ๋†’์ด ๋„๋‹ฌ ํ›„ ๊ณ ์ •ํ•˜๊ธฐ ์œ„ํ•ด constraint๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๋‹ค์‹œ ์ค„์ด๊ณ  ๋Š˜์ด๋Š” ๊ณผ์ • ๋ฐ˜๋ณต ์‹œ ์ƒˆ๋กœ์šด constraint์™€ ๊ธฐ์กด constraint์˜ ์ถฉ๋Œ๋กœ ์ธํ•ด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - ํ•ด๊ฒฐ - ์ตœ๊ณ ๋†’์ด ๋„๋‹ฌ ์‹œ ๋งˆ์ง€๋ง‰ constraints์„ ํ™•์ธ, firstAttribute๊ฐ€ height์ผ ์‹œ ๊ธฐ์กด constraint์„ ์ง€์šฐ๊ณ  ์ƒˆ๋กญ๊ฒŒ ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ![](https://i.imgur.com/x76PMTg.png)
**๋น„๋ฐ€ ๋ฒˆํ˜ธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ foreGround ์ง„์ž…์‹œ ์ด์ „ ๋ทฐ์™€ ์ƒ๊ด€์—†์ด ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฐฝ์„ ๋„์›Œ์•ผ ํ•˜๋Š” ๋ฌธ์ œ** - ์‹œ๋„ - ์•ฑ์ด Foreground ์ƒํƒœ ์ง„์ž…์‹œ SceneDelegate(sceneWillEnterForeground)์—์„œ NotificationCenter๋ฅผ ์ด์šฉํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ์ฐฝ์„ ๋„์›Œ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ ๋ชจ๋“  ViewController์—์„œ ํ•ด๋‹น NotificationCenter๋ฅผ observeํ•˜๊ณ  ์žˆ์–ดํ•˜๋Š”๋ฐ ๋งŒ์•ฝ viewcontroller์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ˆ˜๋ฐฑ๊ฐœ๋ผ๋ฉด ๋ชจ๋“  viewcontroller์—์„œ observe ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋‚˜ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. - ํ•ด๊ฒฐ - ์šฐ๋ ค์™€๋Š” ๋‹ฌ๋ฆฌ ์ตœ์ƒ์œ„ viewController์—์„œ๋งŒ notificationCenter๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด ํ•˜์œ„ ํ”Œ๋กœ์šฐ์˜ ๋ชจ๋“  ๋ทฐ๋“ค์€ ํ•ด๋‹น noti๋ฅผ ๊ตฌ๋…ํ•˜๊ฒŒ ๋˜์–ด ํ•œ๋ฒˆ๋งŒ ๊ตฌ๋… ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ![](https://i.imgur.com/unGX1YA.png) (์บ˜๋ฆฐ๋” ๋ทฐ ์ดํ•˜ ํ”Œ๋กœ์šฐ ๋ทฐ๋Š” ์ž๋™์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์ฐฝ์„ ๋„์šฐ๊ฒŒ ๋จ, ์ƒ์œ„ ํ”Œ๋กœ์šฐ ๋ทฐ๋Š” ์•ˆ๋„์›€)

๐Ÿ”— ์ฐธ๊ณ  ๋งํฌ

๐Ÿ” ๋งจ ์œ„๋กœ ์ด๋™ํ•˜๊ธฐ