Skip to content

yeahg-dev/Chajabwa

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์ฐพ์•„๋ด๐Ÿ”Ž

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-01-27 แ„‹แ…ฉแ„’แ…ฎ 3 53 04

๊ฐœ๋ฐœ, ๊ธฐํš, ๋””์ž์ธ: @yeaghdev


๊ธฐํš ์˜๋„

  • ์•„์ดํฐ์—์„œ ๋‹ค๋ฅธ ๊ตญ๊ฐ€์˜ ์•ฑ์Šคํ† ์–ด๋ฅผ ๊ตฌ๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 8๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ''์ „ ์„ธ๊ณ„ ์•ฑ์Šคํ† ์–ด์˜ ์•ฑ์„ ์ข€ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๋ชจ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ์•ฑ์ด ์žˆ๋‹ค๋ฉด ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋œ์–ด์ค„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค!''์—์„œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ตญ๊ฐ€, OS(iPhone, iPad,) ์„ ํƒ -> ๊ฒ€์ƒ‰, 2๋‹จ๊ณ„๋งŒ ๊ฑฐ์น˜๋ฉด ๋ฐ”๋กœ ๋‚ด๊ฐ€ ๋ณด๊ณ ์‹ถ์€ ๊ตญ๊ฐ€์˜ ์•ฑ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ถ”ํ›„ ์•ฑ ์Šคํ† ์–ด ๋ฐฐํฌ๋ฅผ ๋ชฉํ‘œ๋กœ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ฐ ๋ณด์™„ ์ค‘์ž…๋‹ˆ๋‹ค.


์ฐพ์•„๋ด์˜ ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
๊ตญ๊ฐ€, OS๋ฅผ ์„ค์ •ํ•œ ํ›„, ์„ค์ •ํ•œ ๋‚˜๋ผ์˜ OS๋ณ„ ์•ฑ ์Šคํ† ์–ด์—์„œ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”
์ด๋ฆ„๊ณผ ID ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ด์š”
search
๊ฒ€์ƒ‰ํ•œ ์•ฑ์˜ ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š” appDetail
์ตœ๊ทผ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์š”
๋ฌผ๋ก , ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ณ , ์ €์žฅ ์—ฌ๋ถ€๋Š” ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์š”
searchkeyword
ํด๋”๋ฅผ ๋งŒ๋“ค์–ด ์ „์„ธ๊ณ„ ๊ตญ๊ฐ€์˜ ์•ฑ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์š”
๊ฒ€์ƒ‰ํ•œ ์•ฑ์˜ ๊ตญ๊ฐ€์™€ ์ง€์› ๊ธฐ๊ธฐ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”
appFolderCreate
ํด๋”๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด์š” appFolderEdit

์‚ฌ์šฉ API


Tech Stack

  • Swift

  • UI : UIKit(code base UI), AutoLayout

  • Network : URLSession, RESTAPI

  • Database : RealmSwfit

  • Reacive Programming: Combine

  • ์˜์กด์„ฑ ๊ด€๋ฆฌ ํˆด : SPM


code style


์•„ํ‚คํ…์ฒ˜ ์†Œ๊ฐœ

Clean-MVVM

๋„์ž… ์ด์œ 

  • Mssive ViewController์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด MVVM ์‚ฌ์šฉ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ญํ• ์„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๋ฐ์ดํ„ฐ Repository, Database, API๋กœ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ , ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํด๋ฆฐ์•„ํ‚คํ…์ฒ˜๋ฅผ ์—ญํ•  ๋ถ„๋ฆฌ ๋ชจ๋ธ๋กœ ์„ ํƒ
  • ๋ ˆ์ด์–ด์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์€ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์— ์šฉ์ด
  • ๊ฐ€์žฅ ๋งŽ์ด ๋ณ€๊ฒฝ๋˜๋Š” View๋Š” ๋ ˆ์ด์–ด์˜ ์ตœ์™ธ๊ณฝ์— ์œ„์น˜ํ•˜๋ฏ€๋กœ UI ๋ณ€๊ฒฝ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€์‘ํ•˜๊ธฐ ์‰ฌ์›€

์—ญํ•  ์ •์˜

CleanMVVM

  • View : UI, ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑ, ViewModel์œผ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œ, ์‚ฌ์šฉ์ž ์•ก์…˜์„ ViewModel์— ์ „๋‹ฌ
  • ViewModel : Usecase๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ UI์— ํ‘œ์‹œํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜, ์‚ฌ์šฉ์ž ์•ก์…˜์— ๋”ฐ๋ฅธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ Usecase๋ฅผ ์‚ฌ์šฉํ•ด ์‹คํ–‰
  • Usecase : ์•ฑ์˜ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„, Repositry Layer๋กœ๋ถ€ํ„ฐ ์–ป์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฌ์šฉ
  • Repository : APIService ๋˜๋Š” Realm์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์น˜, ์ˆ˜์ •, ์‚ญ์ œ, ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ๊ตฌํ˜„

๊ฒฐ๊ณผ

  • ์žฅ์ 

    • ์—ญํ• ์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•จ์œผ๋กœ์„œ ๊ธฐ๋Šฅ์˜ ํ™•์žฅ, ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ด
    • ๊ฐ ๋ ˆ์ด์–ด๋ณ„ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์šฉ์ด
    • ์ฝ”๋“œ์˜ ์‘์ง‘์„ฑ์€ ๋†’๊ฒŒ, ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ๊ฒŒ ์„ค๊ณ„๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ์ ์€ ์–‘์˜ ์ฝ”๋“œ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ
  • ๋‹จ์ 

    • ๊ฐœ๋ฐœ ๋น„์šฉ(์‹œ๊ฐ„, ํŒŒ์ผ ๊ฐœ์ˆ˜)์˜ ์ฆ๊ฐ€
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ž‘์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ๋ชจ๋“  ๋ ˆ์ด์–ด์— API๋ฅผ ์„ค๊ณ„ํ•ด์•ผํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ ๋น„์šฉ์ด ์ปค์ง
    • ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌํ˜„ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด RepositoryLayer์™€ Repository๊ตฌํ˜„์ฒด ๋ถ„๋ฆฌ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Œ

Coordinator Pattern

๋„์ž… ์ด์œ 

  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์— ๋ทฐ ์ƒ์„ฑ ๋ฐ ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์ด ๋ถ„์‚ฐ๋˜์–ด ์žˆ์–ด ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€
  • ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ„์— ๊ฒฐํ•ฉ์ด ์ƒ๊น€

๊ฒฐ๊ณผ

  • ์žฅ์ 

    • ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ์—ฌ๋Ÿฌ ํ™”๋ฉด์ „ํ™˜์„ ํ•œ๊บผ๋ฒˆ์— ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ๋‹จ์ 

    • ๋ทฐ์ปจ ๊ฐ„์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋ณต์žกํ•ด์ง
    • ๊ฐ„๋‹จํ•œ ์ „ํ™˜์„ ์œ„ํ•ด์„œ๋„ ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ผ๋“ค์ด ๋งŽ์Œ

ํ”„๋กœ์ ํŠธ์—์„œ ๋„์ „ํ•œ ๊ณผ์ œ์™€ ๋ฐฐ์šด์ 

โœ… Realm ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰์‹œํ‚ค๊ธฐ

๋„์ „ ๊ณผ์ œ

  • Realm์˜ CRUD ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ mainQueue์—์„œ ์ž‘์—…์„ ํ•˜๋„๋ก ์ง€์ •ํ•˜์ง€๋งŒ, mainQueue๋Š” UI์ž‘์—…์„ ํ•˜๋„๋ก ๊ณต๊ฐ„์„ ๋‚จ๊ฒจ์ฃผ๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • serialQueue๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ํ์—์„œ ๋น„๋™๊ธฐ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ๋กœ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ๋‹ค์Œ ํ›„์† ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒˆ์ถœํด๋กœ์ €๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•˜์œผ๋‚˜, ์ด๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ—ค์น˜๊ณ  ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • withCheckedThrowingContinuation ์„ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ฐ์‹ธ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์—์„œ๋Š” async/await ์„ ์‚ฌ์šฉํ•ด ๋™๊ธฐ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  • RealmObject๋Š” ์ƒ์„ฑ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์œ ํšจํ•˜๋ฏ€๋กœ, Repository์—์„œ ๋‚ด๋ณด๋‚ผ ๋•Œ๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ(๊ตฌ์กฐ์ฒด)๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

  • DB์˜ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ์กฐ์ฒด๋กœ ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ Concurrency ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • UI์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด Task๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ๋Š” ์ฝ”๋“œ ์ธ๋ดํŠธ๊ฐ€ ๊นŠ์–ด์กŒ์ง€๋งŒ, ํƒˆ์ถœ ํด๋กœ์ € ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ๊ฐ€๋…์„ฑ ์ €ํ•ด๋ณด๋‹ค๋Š” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

โœ… Repository Layer Test

๋„์ „ ๊ณผ์ œ

  • Usecase์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ „, DB์ž‘์—…์ด ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • Realm๊ณผ serialQueue ๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ€์ง€๋Š” RealmStore๋ฅผ ์ฃผ์ž…๋ฐ›์•„ RealmAppFolderRepository ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Test์—์„œ๋Š” InMemory Realm์œผ๋กœ ์„ค์ •ํ•œ RealmStore๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… CALayer๋กœ ํ‰์  ๋ณ„ ๋ชจ๋“ˆ ๊ตฌํ˜„

๋„์ „ ๊ณผ์ œ

  • ์•ฑ ์‚ฌ์šฉ์ž ํ‰์ ์„ ๋‚˜ํƒ€๋‚ผ ๋ณ„5๊ฐœ์˜ ๋ทฐ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ‰์ ์— ๋”ฐ๋ผ ๋ณ„์„ ์ฑ„์šธ ์ˆ˜ ์žˆ๋„๋ก ๋ทฐ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-01-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 51 49

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ๋ณ„ 5๊ฐœ๋ฅผ ๊ฐ๊ฐ UIView๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ UIView๋Š” Mainthread์—์„œ CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , CALayer ๋Š” GPU๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— CALayer๊ฐ€ CPUํ™œ์šฉ, ์‘๋‹ต์„ฑ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด์— ์žˆ๋Š” Cosmos ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, StarRatingView ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณ„์˜ ํฌ๊ธฐ, ์ƒ‰์ƒ, ๋ณ„์‚ฌ์ด ๊ฐ„๊ฒฉ์„ Configuration์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋ณ„์ ์„ ๊ทธ๋ ค๋ƒ…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

  • ๋ณ„์˜ ํฌ๊ธฐ, ์ƒ‰์ƒ, ๋ณ„ ์‚ฌ์ด ๊ฐ„๊ฒฉ์„ Configuration์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋ณ„๋“ค์„ ๊ทธ๋ฆฌ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ„์˜ ๋””์ž์ธ์  ์š”์†Œ๋Š” ์บก์Šํ™”ํ•˜๊ณ , ๋“œ๋กœ์ž‰ ๋กœ์ง์€ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€ ๋ณด์ˆ˜์˜ ์šฉ์ด์„ฑ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… ๊ธฐ๊ธฐ ์‚ฌ์ด์ฆˆ์— adaptableํ•œ ํ™”์‚ดํ‘œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„

๋„์ „ ๊ณผ์ œ

  • ๋‹ค์–‘ํ•œ ์‚ฌ์ด์ฆˆ์˜ ์Šคํฌ๋ฆฐ์—์„œ ์›์˜ ๋‘˜๋ ˆ๋ฅผ ๋”ฐ๋ผ ์›€์ง์ด๋Š” ํ™”์‚ดํ‘œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • UIBezierPath ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๊ณ , CAKeyframeAnimation ์„ ์‚ฌ์šฉํ•ด ํ˜ธ๋ฅผ ๋”ฐ๋ผ ์›€์ง์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • CAShapeLayer๋ฅผ ์ƒ์†ํ•œ AnimatableArrowLayer ๋ฅผ ๊ตฌํ˜„ํ•ด, ๋‹ค์–‘ํ•œ ์‚ฌ์ด์ฆˆ์˜ ์›์—์„œ๋„ ๋™์ผํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋™์ž‘ํ•˜๋„๋ก ํƒ€์ž…ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์š”์†Œ๋ฅผ ํƒ€์ž…ํ™”ํ•จ์œผ๋กœ์จ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ• ์„ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์‘์ง‘์„ฑ์ด ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค

๊ณผ์ •์„ ์ •๋ฆฌํ•œ ๋ธ”๋กœ๊ทธ


โœ… ๋‹ค์–‘ํ•œ ์„น์…˜ ์Šคํƒ€์ผ์˜ ์ปฌ๋ ‰์…˜๋ทฐ ๊ตฌํ˜„

๋„์ „ ๊ณผ์ œ

  • ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ๋…ธํŠธ, ์•ฑ ์Šคํฌ๋ฆฐ ์ƒท, ์•ฑ ์„ค๋ช…, ์•ฑ ์ •๋ณด๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด์™€ ๊ทธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ์˜ Cell์„ ํ•˜๋‚˜์˜ ๋ทฐ์— ๊ตฌ์„ฑํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-01-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 51 00

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • CompositionalLayout์„ ํ•™์Šตํ•ด ์„น์…˜๋ณ„๋กœ CustomCell, layout์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ CustomCell๋‚ด๋ถ€์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋ทฐ๋Š” CustomView๋กœ ํƒ€์ž…์„ ๋ถ„๋ฆฌํ•ด ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋œ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Custom Section Header๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด UICollectionReusableView๋ฅผ ์ƒ์†ํ–ˆ์Šต๋‹ˆ๋‹ค.

โœ… ์‚ฌ์šฉ์ž ๋ฐ˜์‘ํ˜• UI Combine์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

๋„์ „ ๊ณผ์ œ

  • ํ…์ŠคํŠธ ํ•„๋“œ์˜ input ์‚ฌ์ด์ฆˆ์— ๋”ฐ๋ผ ๋ฒ„ํŠผ์˜ isEnabled ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ๋ฐ˜์‘ํ˜• UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Combine์„ ์‚ฌ์šฉํ•ด UserEvent -> Input -> ViewModel -> Output -> UI์—…๋ฐ์ดํŠธ ๋‹จ๋ฐฉํ–ฅ ํ”Œ๋กœ์šฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

  • UI๋ฅผ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€์— ๋Œ€ํ•œ ๋กœ์ง์€ ๋ทฐ๋ชจ๋ธ์ด ์ฒ˜๋ฆฌ, ๋ทฐ๋Š” ์ˆ˜๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… Realm + iTunes API ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„ ๋ผ์ธ ๊ตฌ์ถ•ํ•˜๊ธฐ

๋„์ „ ๊ณผ์ œ

  • AppFolder์— ์ €์žฅ๋œ SavedApp์˜ ๋ฐ์ดํ„ฐ๋กœ iTunes SearchAPI๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋ฐ›์€ Response์™€ SavedApp ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ฐ ์…€์— ํ‘œ์‹œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ๋ชจ๋“  SavedApp์— ๋Œ€ํ•œ API ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•œ ๋’ค reloadData๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๊ณ , ๊ธด ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ดˆ๋ž˜ํ•˜๊ธฐ์— ์ข‹์ง€ ์•Š์€ ์‚ฌ์šฉ์„ฑ์„ ์ค„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • Combine์˜ operator๋ฅผ ํ™œ์šฉํ•ด โ€œ SavedApp์œผ๋กœ iTunesAPI ํ˜ธ์ถœ โžก๏ธ SavedApp๊ณผ Response๋ฅผ ๋ณ‘ํ•ฉํ•ด CellModel๋กœ ๋ณ€ํ™˜ โžก๏ธ Cell์—์„œ ๊ตฌ๋…โ€ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  • cellForRowAt์—์„œ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•œ ํ›„ cell์—์„œ ๊ตฌ๋…ํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์…€ ๋‚ด๋ถ€์—์„œ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-01-30 แ„‹แ…ฉแ„’แ…ฎ 5 14 13

๊ฒฐ๊ณผ

  • ์…€์ด ๋””ํ๋˜์–ด ํ‘œ์‹œ๋  ๋•Œ ์ŠคํŠธ๋ฆผ์ด ์‹œ์ž‘๋˜๋ฏ€๋กœ ์…€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Šฆ๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ์ง€์—ฐ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • UITableViewDataSourcePrefetching์œผ๋กœ ์…€์ด ๋””ํ๋˜๊ธฐ์ „ ๋ฏธ๋ฆฌ ์ŠคํŠธ๋ฆผ์„ ์‹คํ–‰์‹œ์ผœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. (#24)


๊ตฌํ˜„ ๋ฐ ๋ณด์™„ ์˜ˆ์ • ๊ธฐ๋Šฅ

  • ๋‹ค๊ตญ์–ด ์ง€์›(ํ•œ๊ตญ์–ด/์˜์–ด)
  • ๊ณต์œ  ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (์•ฑ ์Šคํ† ์–ด ๋งํฌ ๋‚ด๋ณด๋‚ด๊ธฐ)
  • ๋„คํŠธ์›Œํฌ ์ฒด์ปค
  • ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝ

Releases

No releases published

Packages

No packages published

Languages