/TodoCalendar

๐Ÿ“† iOS Todo calendar app

Primary LanguageSwiftMIT LicenseMIT

To-do Calendar

ํ• ์ผ ๋ชฉ๋ก์ด ์žˆ๋Š” iOS ๋‹ฌ๋ ฅ ์•ฑ

What is To-do Calendar?

To-do Calendar๋Š” ํ• ์ผ ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ฌ๋ ฅ ์•ฑ ์ž…๋‹ˆ๋‹ค. ์•ฑ์ด ์ œ๊ณตํ•˜๋Š” ๋‹ค์Œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์ผ์ • ๋ฐ ํ• ์ผ์„ ๊ด€๋ฆฌํ•˜์„ธ์š”.

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

Install

  1. ์ด repository๋ฅผ ํด๋ก  ๋ฐ›๊ณ  develop ๋ธŒ๋žœ์น˜๋ฅผ checkout ํ•ฉ๋‹ˆ๋‹ค.

  2. clone ๋ฐ›์€ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ./install/install.sh๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”. ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๋”๋ฏธ ํŒŒ์ผ๋“ค์ด ํ•„์š”ํ•œ ์œ„์น˜๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค.

  3. Tuist๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. v3 ๋ฒ„์ „์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ dependency๋ฅผ fetchํ•˜๊ณ  Xcode project๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”

    tuist fetch
    tuist generate --no-open
  5. ์ƒ์„ฑ๋œ TodoCalendar.xcworkspace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Xcode๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

  6. TodoCalendarApp Scheme ์„ ์„ ํƒํ•˜๊ณ  ์•ฑ์„ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค

ํด๋ก ๋ฐ›์€ ์•ฑ์€ ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ๋กœ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.(๋กœ๊ทธ์ธ ๋ฐ ๊ณ„์ • ๊ด€๋ จ ๊ธฐ๋Šฅ ์ •์ƒ๋™์ž‘ x) ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ๋นŒ๋“œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฌธ์˜ํ•ด์ฃผ์„ธ์š”

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

Domain

Domain
โ”œโ”€โ”€ Models
โ”œโ”€โ”€ Repositories
โ”œโ”€โ”€ Usecases
โ””โ”€โ”€ Utils

์„œ๋น„์Šค ๊ตฌํ˜„์„ ์œ„ํ•œ Model๊ณผ Usecase ๊ตฌํ˜„์ฒด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Usecase์˜ ๊ฒฝ์šฐ ์ „์ฒด ์„œ๋น„์Šค๋ฅผ ์„œ๋ธŒ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ์—ญํ• ์ด ๋‚˜๋‰˜์–ด์ ธ์žˆ๊ณ , ์•ฑ ๋‚ด์—์„œ ์žฌ์‚ฌ์šฉ๋˜๊ธฐ ์œ„ํ•œ ๋กœ์ง๋“ค์ด ๊ตฌํ˜„๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Usecase ๊ตฌํ˜„์„ ์œ„ํ•œ Repository ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

Repository

Repository
โ”œโ”€โ”€ Extensions
โ”œโ”€โ”€ Local
โ”œโ”€โ”€ Remote
โ””โ”€โ”€ Repository+Imple

Repository ๊ตฌํ˜„์ฒด๋“ค์„ ํฌํ•˜ํ•จํ•˜๋ฉฐ, ์ด๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ/์กฐํšŒ ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์ฒด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ, ์˜จ๋ผ์ธ(๋กœ๊ทธ์ธ)/์˜คํ”„๋ผ์ธ ์œ ์ €์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Remote, Local ๊ตฌํ˜„์ฒด๋กœ ๋ถ„๋ฆฌ๋˜์–ด ๊ตฌํ˜„๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Presentations

Presentations
โ”œโ”€โ”€ CalendarScenes
โ”œโ”€โ”€ CommonPresentation
โ”œโ”€โ”€ EventDetailScene
โ”œโ”€โ”€ EventListScenes
โ”œโ”€โ”€ MemberScenes
โ”œโ”€โ”€ Scenes
โ””โ”€โ”€ SettingScene

Presentation group์—๋Š” ui๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” framework๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์‘์ง‘๋„๊ฐ€ ๋†’์€ ํ™”๋ฉด๋“ค์„ ๋ฌถ์–ด ํ•˜๋‚˜์˜ framework๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ framework๋“ค์€ ๋‹ค์Œ ํ™”๋ฉด๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • CalendarScenes: ๋‹ฌ๋ ฅ ๋ฐ ํ•ด๋‹น ๋‚ ์งœ์— ์†ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ™”๋ฉด์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • EventDetailScene: ์ด๋ฒคํŠธ ์ƒ์„ธ ๋ฐ ์ˆ˜์ •/์„ ํƒ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ™”๋ฉด๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • EventListScenes: ๋‹ฌ๋ ฅ๊ณผ ์ƒ๊ด€์—†์ด ์ด๋ฒคํŠธ ๋ชฉ๋ก์„ ๋…ธ์ถœํ•˜๋Š” ํ™”๋ฉด์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํ• ์ผ ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • MemberScenes: ํšŒ์›๊ณผ ๊ด€๋ จ๋œ ํ™”๋ฉด์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›์ •๋ณด ๊ด€๋ จ๋œ ํ™”๋ฉด์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • SettingScene: ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ํ™”๋ฉด๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์„œ๋กœ ๋ถ„๋ฆฌ๋œ framework ๊ฐ„ ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์ง€๋งŒ ํ•œ framework์— ์†ํ•œ ํ™”๋ฉด์—์„œ ๋‹ค๋ฅธ framework์— ์†ํ•œ ํ™”๋ฉด์œผ๋กœ์˜ ์ „ํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Scenes framework์— ์ •์˜๋œ Sceene protocol์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ui๊ตฌํ˜„์„ ์œ„ํ•œ ๊ณตํ†ต ๋กœ์ง์€ CommonPresentation framework์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

TodoCalendarApp

TodoCalendarApp/Sources
โ”œโ”€โ”€ AppDelegate.swift
โ”œโ”€โ”€ AppEnvironment.swift
โ”œโ”€โ”€ Factories
โ”œโ”€โ”€ Main
โ”œโ”€โ”€ Root
โ””โ”€โ”€ SceneDelegate.swift

TodoCalendarApp Target์€ To-do calendar ์•ฑ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ ๊ตฌํ˜„์„ ์œ„ํ•ด ์œ„์— ๋‚˜์—ด๋œ framework ๋ฐ ๋‹ค๋ฅธ framework๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ์™ธ ์•„๋ž˜์™€ ๊ฐ™์€ ํŒŒ์ผ/ํด๋”๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • AppEnvironment.swift: ์•ฑ ์‹คํ–‰ ํ™˜๊ฒฝ์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • Factories: Scenes framework์— ์ •์˜๋œ usecaseFactory ๊ตฌํ˜„์ฒด๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์ฒด๋Š” ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ NonLoginUsecaseFactoryImple, LoginUsecaseFactoryImple ์œผ๋กœ ๋‚˜๋ˆ ์ง€๊ฒŒ๋˜๋ฉฐ, ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋ ์ง€๋Š” ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ์‹œ์ ์— ๋ถ„๊ธฐ๋ฉ๋‹ˆ๋‹ค.
  • Main: ์•ฑ ๋ฉ”์ธํ™”๋ฉด์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ํด๋”์ž…๋‹ˆ๋‹ค.
  • Root: ์•ฑ ๋ฃจํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋”์ž…๋‹ˆ๋‹ค. AppDelegate, SceneDelegate์—์„œ ํ•ด๋‹น ํด๋”์— ๊ตฌํ˜„๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ™”๋ฉด๋‹จ์œ„ ๊ตฌ์กฐ

์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ™”๋ฉด๋‹จ์œ„๊ตฌ์กฐ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.