Skip to content

project-lyrics/app-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

Feelin - ๋ชจ๋‘์˜ ์ด์•ผ๊ธฐ๋กœ ์ฑ„์šฐ๋Š” ์šฐ๋ฆฌ์˜ ์Œ์•… ๊ณต๊ฐ„

swiftxcode tuistKingfisherFlexLayoutPinLayout

2024.02 ~ Now

์•ฑ์Šคํ† ์–ด ์ด๋ฏธ์ง€


๋ชฉ์ฐจ

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

Feelin์€ ์Œ์•… ๊ฐ€์‚ฌ์— ๋Œ€ํ•œ ์ž์‹ ์˜ ์ƒ๊ฐ๊ณผ ๊ฐ์ •์„ ๊ณต์œ ํ•˜๋Š” iOS ์•ฑ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋“ค์€ ์ข‹์•„ํ•˜๋Š” ์•„ํ‹ฐ์ŠคํŠธ์˜ ๋…ธ๋ž˜ ๊ฐ€์‚ฌ์— ๊ด€ํ•œ ์ž์‹ ๋งŒ์˜ ํ•ด์„์ด๋‚˜ ๊ฐ์ •์„ ๋…ธํŠธ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์˜ ๋…ธํŠธ์— ์ข‹์•„์š”, ๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ๋ถ๋งˆํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•œ ๊ธฐ์ˆ 

  • ์•„ํ‚คํ…์ฒ˜: CleanArchitecture + MVVM
  • ๋ชจ๋“ˆํ™”: Tuist
  • UI: FlexLayout, PinLayout
  • Network: Combine, Kingfisher
  • ๋กœ๊ทธ์ธ: ์†Œ์…œ ๋กœ๊ทธ์ธ (์นด์นด์˜ค, ์• ํ”Œ๋กœ๊ทธ์ธ)

Tuist ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„

graph

๊ตฌ์กฐ๋„
โ”œโ”€โ”€ Projects
โ”‚   โ”œโ”€โ”€ App
โ”‚   โ”œโ”€โ”€ Coordinator
โ”‚   โ”‚   โ”œโ”€โ”€ App
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Root
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Home
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Main
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Derived
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”œโ”€โ”€ MyPage
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Onboarding
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ SearchNote
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ””โ”€โ”€ TabBar
โ”‚   โ”‚       โ”œโ”€โ”€ Derived
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚       โ”œโ”€โ”€ Interface
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚       โ”œโ”€โ”€ Sources
โ”‚   โ”‚       โ”œโ”€โ”€ Testing
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚       โ””โ”€โ”€ Tests
โ”‚   โ”‚           โ””โ”€โ”€ Sources
โ”‚   โ”œโ”€โ”€ Core
โ”‚   โ”‚   โ”œโ”€โ”€ LocalStorage
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Example
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Error
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ StorageInterface
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Storage
โ”‚   โ”‚   โ”œโ”€โ”€ Network
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ API
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ DTO
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ Request
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ Response
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ EndPoint
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Error
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ EndPoint
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Extensions
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”œโ”€โ”€ DependencyInjection
โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚       โ””โ”€โ”€ DIContainer
โ”‚   โ”‚           โ””โ”€โ”€ Inject
โ”‚   โ”œโ”€โ”€ Domain
โ”‚   โ”‚   โ”œโ”€โ”€ Artist
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Errors
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Services
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ UseCase
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”œโ”€โ”€ Note
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Errors
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Model
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Models
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Services
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ UseCases
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Notification
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Errors
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Models
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Services
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ UseCases
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ NotificationRoot
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ OAuth
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Error
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Helpers
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Model
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Service
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ UseCase
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Service
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ PostTextUseCase
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”œโ”€โ”€ Report
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Errors
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Model
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Services
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ UseCases
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Shared
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Errors
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Models
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Protocols
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Services
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ UseCasess
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Tests
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ””โ”€โ”€ UserProfile
โ”‚   โ”‚       โ”œโ”€โ”€ Derived
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚       โ”œโ”€โ”€ Interface
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚       โ”‚       โ”œโ”€โ”€ Errors
โ”‚   โ”‚       โ”‚       โ”œโ”€โ”€ Models
โ”‚   โ”‚       โ”‚       โ”œโ”€โ”€ Services
โ”‚   โ”‚       โ”‚       โ””โ”€โ”€ UseCase
โ”‚   โ”‚       โ”œโ”€โ”€ Sources
โ”‚   โ”‚       โ”œโ”€โ”€ Testing
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚       โ””โ”€โ”€ Tests
โ”‚   โ”‚           โ””โ”€โ”€ Sources
โ”‚   โ”œโ”€โ”€ Feature
โ”‚   โ”‚   โ”œโ”€โ”€ Home
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Example
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Errors
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Models
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Protocols
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ ViewControllers
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ Note
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ Notification
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ UserLink
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ WritingNote
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ ViewModels
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ Notification
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Views
โ”‚   โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ Cells+SupplementaryViews
โ”‚   โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ Components
โ”‚   โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ Report
โ”‚   โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ SearchNote
โ”‚   โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ UserLink
โ”‚   โ”‚   โ”‚   โ”‚           โ””โ”€โ”€ WritingNote
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ HomeRoot
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Main
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Example
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Resources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ MyPage
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Example
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Resources
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Models
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ ViewControllers
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ PageControl
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ ViewModels
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Views
โ”‚   โ”‚   โ”‚   โ”‚           โ””โ”€โ”€ Cells
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”œโ”€โ”€ Onboarding
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Example
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Interface
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Components
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ Login
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ Profile
โ”‚   โ”‚   โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ UserAgreement
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ Models
โ”‚   โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ ViewControllers
โ”‚   โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ ViewModel
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ OnboardingRoot
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Testing
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Tests
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ Sources
โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ”œโ”€โ”€ LayoutUtil
โ”‚   โ”‚   โ”œโ”€โ”€ Derived
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚   โ””โ”€โ”€ Shared
โ”‚       โ”œโ”€โ”€ DesignSystem
โ”‚       โ”‚   โ”œโ”€โ”€ Derived
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ InfoPlists
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ Sources
โ”‚       โ”‚   โ”œโ”€โ”€ Resources
โ”‚       โ”‚   โ””โ”€โ”€ Sources
โ”‚       โ”‚       โ”œโ”€โ”€ Buttons
โ”‚       โ”‚       โ”œโ”€โ”€ Cells
โ”‚       โ”‚       โ”œโ”€โ”€ Extensions
โ”‚       โ”‚       โ”œโ”€โ”€ Models
โ”‚       โ”‚       โ”œโ”€โ”€ ViewControllers
โ”‚       โ”‚       โ””โ”€โ”€ Views
โ”‚       โ”‚           โ””โ”€โ”€ FeelinPagerTabStrip
โ”‚       โ”œโ”€โ”€ Sources
โ”‚       โ”œโ”€โ”€ ThirdPartyLib
โ”‚       โ””โ”€โ”€ Util
โ”‚           โ”œโ”€โ”€ Derived
โ”‚           โ”‚   โ””โ”€โ”€ InfoPlists
โ”‚           โ”œโ”€โ”€ Sources
โ”‚           โ”‚   โ”œโ”€โ”€ CombineCocoa
โ”‚           โ”‚   โ”œโ”€โ”€ Errors
โ”‚           โ”‚   โ”œโ”€โ”€ Extensions
โ”‚           โ”‚   โ”‚   โ””โ”€โ”€ Combine
โ”‚           โ”‚   โ”œโ”€โ”€ Keychain
โ”‚           โ”‚   โ”‚   โ””โ”€โ”€ Model
โ”‚           โ”‚   โ”œโ”€โ”€ Logger
โ”‚           โ”‚   โ”œโ”€โ”€ Models
โ”‚           โ”‚   โ”œโ”€โ”€ Preview
โ”‚           โ”‚   โ””โ”€โ”€ ViewControllers
โ”‚           โ”œโ”€โ”€ Tests
โ”‚           โ”‚   โ””โ”€โ”€ Sources
โ”‚           โ””โ”€โ”€ Util.xcodeproj

๐Ÿ“ฑ App Version

๋‚ ์งœ ๋ฒ„์ „
24.12 v1.0.0
25.01 v1.0.1
25.01 v1.0.2
25.04 v1.0.3

๐Ÿก ์„ค๊ณ„ ๊ณผ์ •

1. ์„œ๋น„์Šค์˜ ๋ณธ์งˆ ํŒŒ์•…

๊ธฐํš์„œ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„

๊ธฐํš์„œ๊ฐ€ ์™„์ „ํ•˜๊ฒŒ ํ™•์ •๋˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณธ์งˆ์  ์š”๊ตฌ์‚ฌํ•ญ์„ ํ™•์ธํ–ˆ๋‹ค:

  • ๋ชจ๋“  ํ™”๋ฉด์—์„œ ํšŒ์›/๋น„ํšŒ์› ์—ฌ๋ถ€์™€ ํ† ํฐ ๋งŒ๋ฃŒ ์ƒํƒœ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ
  • ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…/์ž๋™๋กœ๊ทธ์ธ/๋”ฅ๋งํฌ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™”๋ฉด ์ „ํ™˜ ํ”Œ๋กœ์šฐ๊ฐ€ ์กด์žฌ
  • ๋…ธํŠธ ์ž‘์„ฑยท์ˆ˜์ •ยท์‚ญ์ œ, ์Œ์•… ํ”Œ๋ ˆ์ด์–ด ๋“ฑ ์žฌ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์Œ
  • ์—ฌ๋Ÿฌ ๋ช…์ด ๋ณ‘๋ ฌ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ ์ข‹์€ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”

2. ์•„ํ‚คํ…์ฒ˜ ์„ ์ •

์•„ํ‚คํ…์ฒ˜ ๊ฒ€ํ†  ๋ฐ ์„ ์ • ๊ณผ์ • ์Šคํฌ๋ฆฐ์ƒท 2025-01-30 16 50 44

ํ•˜๋ฃจ์ข…์ผ ๊ณ ๋ฏผํ•œ ํ”์ 

์ฒ˜์Œ์—๋Š” Clean Swift๋ฅผ ๊ฒ€ํ† ํ–ˆ์ง€๋งŒ, ์‹ค์ œ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๋งž์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค.

Clean Swift์˜ ํ•œ๊ณ„

  • Router๋Š” ํ™”๋ฉด ๋‹จ์œ„ ๋„ค๋น„๊ฒŒ์ด์…˜๋งŒ ๋‹ด๋‹น โ†’ ์•ฑ ์ „์ฒด ํ”Œ๋กœ์šฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ ๋ถ€์žฌ
  • SceneDelegate/AppDelegate์—์„œ rootViewController๋ฅผ ์ง์ ‘ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ €ํ•˜, ์ƒ์œ„-ํ•˜์œ„ ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ์ฆ๊ฐ€
  • PopToViewController ๋ฐฉ์‹์€ ํ™”๋ฉด ์ˆ˜ ์ฆ๊ฐ€ ์‹œ ๊ด€๋ฆฌ ๋ณต์žก๋„ ๊ธ‰์ฆ
  • Storyboard ๊ธฐ๋ฐ˜ ์˜ˆ์ œ๊ฐ€ ๋งŽ์•„, ์ฝ”๋“œ ๊ธฐ๋ฐ˜ UI ๊ตฌ์„ฑ๊ณผ ๊ถํ•ฉ์ด ๋‚˜์จ

๊ฒฐ๊ณผ์ ์œผ๋กœ, Clean Swift๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์„ ํƒ์ด ์•„๋‹Œ, ์•„ํ‚คํ…์ฒ˜์— ํ”„๋กœ์ ํŠธ๋ฅผ ๋ผ์›Œ ๋งž์ถ”๋Š” ๋ชจ์–‘์ƒˆ๊ฐ€ ๋จ.

์ตœ์ข… ๊ฒฐ๋ก  - MVVM-C ๊ธฐ๋ฐ˜ Clean Architecture

์„ ํƒ ์ด์œ 

  1. ๋„ค๋น„๊ฒŒ์ด์…˜ ์ค‘์•™ ๊ด€๋ฆฌ

    • Coordinator๊ฐ€ ๋ชจ๋“  ํ”Œ๋กœ์šฐ๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐ ํ™”๋ฉด์€ ์ž์‹ ์˜ ๋กœ์ง์—๋งŒ ์ง‘์ค‘
    • Parent-Child ๊ตฌ์กฐ๋กœ ๋ณต์žกํ•œ ํ”Œ๋กœ์šฐ๋„ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  2. ๋ช…ํ™•ํ•œ ์ฑ…์ž„ ๋ถ„๋ฆฌ

    • ํ™”๋ฉด ์ „ํ™˜ ์ฑ…์ž„์€ Coordinator๊ฐ€, ํ™”๋ฉด ๋กœ์ง์€ ViewModel์ด ๋‹ด๋‹น
    • SceneDelegate, AppDelegate ์˜์กด ์ œ๊ฑฐ๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
  3. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๊ฐ•ํ™”

    • ViewModel์€ UI์™€ ๋ถ„๋ฆฌ๋˜์–ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์šฉ์ด
    • Coordinator ์—ญ์‹œ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ๋ฆ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  4. ์œ ์—ฐํ•œ ํ™•์žฅ์„ฑ

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

    • NavigationController ์žฌ์ƒ์„ฑ ์—†์ด ํ”Œ๋กœ์šฐ ์ „ํ™˜ ๊ฐ€๋Šฅ
    • ๋ฉ”๋ชจ๋ฆฌ ๋ฆด๋ฆฌ์ฆˆ ์‹œ์ ๋„ ๋ช…ํ™•ํ•ด์ ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์—๋„ ์œ ๋ฆฌ

๊ตฌ์กฐ์  ๊ธฐ๋Œ€ ํšจ๊ณผ

  • ํ”Œ๋กœ์šฐ ๋ณ€๊ฒฝ ์š”๊ตฌ์—๋„ ์ค‘์•™ Coordinator๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋Œ€์‘ ๊ฐ€๋Šฅ
  • ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์€ ํ™”๋ฉด์€ ์–ด๋””์„œ๋“  ๋™์ผ ํŒจํ„ด์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ์—๋Ÿฌ ํ•ธ๋“ค๋ง๋„ Coordinator์—์„œ ์ผ๊ด„ ์ฒ˜๋ฆฌํ•ด ์ผ๊ด€์„ฑ ํ™•๋ณด
  • Clean Architecture ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์ธต ๊ฐ„ ์—ญํ• ๊ณผ ์˜์กด์„ฑ ๋ช…ํ™•

3. ์„ค๊ณ„ KeyPoints

Modular Architecture

๋ชจ๋“ˆํ™” ์ „๋žต ๋ฐ Tuist ๋„์ž… ๋ฐฐ๊ฒฝ

๋ชจ๋“ˆํ™”์˜ ํ•„์š”์„ฑ

ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ชจ๋“ˆํ™”๊ฐ€ ํ•„์ˆ˜์ ์ด๋ผ ํŒ๋‹จํ–ˆ๋‹ค

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ์‹คํ˜„

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

์„œ๋น„์Šค ํ™•์žฅ์„ฑ ๋Œ€๋น„

  • ์ดˆ๊ธฐ MVP ์ดํ›„ ์œ ์ € ๋ฐ˜์‘์— ๋”ฐ๋ผ ์ง€์†์ ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ์˜ˆ์ƒ๋จ
  • ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์— ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋‹ด๊ธฐ๋ฉด, ํŒŒ์ผ์ด ๊ธ‰๊ฒฉํžˆ ๋งŽ์•„์ง€๊ณ , ๋นŒ๋“œ ์‹œ๊ฐ„ ์ฆ๊ฐ€ ๋ฐ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
  • ๊ธฐ๋Šฅ๋ณ„, ๋„๋ฉ”์ธ๋ณ„ ๋ชจ๋“ˆํ™”๋กœ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ณ , ๋นŒ๋“œ ์ตœ์ ํ™”๊นŒ์ง€ ๊ณ ๋ ค

๋น ๋ฅธ ๊ฐœ๋ฐœ ๋ฐ ๋””๋ฒ„๊น…

  • ๋ฐ๋ชจ ์•ฑ์ด๋‚˜ ๊ฐ ๋ชจ๋“ˆ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์šฉ AppTarget ๊ตฌ์„ฑ๋„ ์šฉ์ดํ•ด์ ธ, ๋น ๋ฅธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ฐ ๋””๋ฒ„๊น… ํ™˜๊ฒฝ ๊ตฌ์„ฑ์— ์œ ๋ฆฌ

๋ชจ๋“ˆํ™” ๋„๊ตฌ๋กœ Tuist ์„ ํƒ ์ด์œ 

์ฝ”๋“œ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ

  • ๊ฐ ๋ชจ๋“ˆ ๋‹จ์œ„ ์„ค์ •, App ์„ค์ •์„ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์‹œ์—๋„ .xcodeproj ์ถฉ๋Œ ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

์˜์กด์„ฑ ์‹œ๊ฐํ™” ๋ฐ ๊ด€๋ฆฌ

  • tuist graph ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ์„ ํ•œ๋ˆˆ์— ํŒŒ์•… ๊ฐ€๋Šฅ
  • ์˜์กด์„ฑ ์‚ฌ์ดํด์ด๋‚˜ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์œ ์ž…์„ ์‚ฌ์ „์— ๋ฐฉ์ง€

๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์ƒํ˜ธ ์ฐธ์กฐ ์ฒดํฌ

  • ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ๊ทœ์น™์„ Tuist ๋ ˆ๋ฒจ์—์„œ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์–ด, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒ์œ„-ํ•˜์œ„ ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ๊ผฌ์ž„ ๋ฐฉ์ง€

์ƒ์‚ฐ์„ฑ ๋„๊ตฌ ํ™œ์šฉ

  • Makefile, Tuist Template ๋“ฑ์„ ํ™œ์šฉํ•ด ๊ฐ ๋ชจ๋“ˆ๋ณ„ ํ•„์š” ํŒŒ์ผ ๋ฐ ํ…œํ”Œ๋ฆฟ์„ ์ž๋™ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ์‹ ๊ทœ ๋ชจ๋“ˆ ์ถ”๊ฐ€ ์‹œ ์ผ๊ด€๋œ ๊ตฌ์กฐ๋กœ ๋น ๋ฅด๊ฒŒ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

๊ธฐ๋Œ€ ํšจ๊ณผ

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

Coordinator

Coordinator ํŒจํ„ด ์ ์šฉ

๋ฌธ์ œ ์ƒํ™ฉ

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

์›์ธ ๋ถ„์„

  • Clean Swift์˜ Router๋Š” ๊ฐœ๋ณ„ ํ™”๋ฉด ๋‹จ์œ„์—์„œ๋งŒ ๋™์ž‘
  • ์•ฑ ์ „์ฒด์˜ ํ”Œ๋กœ์šฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” AppRouter ๊ฐ™์€ ๊ฐœ๋…์ด ๋ถ€์žฌ
  • SceneDelegate/AppDelegate์—์„œ rootViewController๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ €ํ•˜ ๋ฐ ์˜๋„์น˜ ์•Š์€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

์„ ํƒํ•œ ๋ฐฉ๋ฒ•

  • ํ™”๋ฉด ์ „ํ™˜ ํ๋ฆ„์„ ์ค‘์•™ Coordinator์—์„œ ์ผ๊ด„ ๊ด€๋ฆฌ
  • ๊ฐ ํ™”๋ฉด์€ ์ž์‹ ์˜ ๋กœ์ง๊ณผ UI์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ , ๋„ค๋น„๊ฒŒ์ด์…˜ ํ๋ฆ„์€ Coordinator์—๊ฒŒ ์œ„์ž„
  • ํ™”๋ฉด ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๋„ Coordinator๊ฐ€ ๋‹ด๋‹นํ•˜์—ฌ, ํ™”๋ฉด์˜ ๋…๋ฆฝ์„ฑ ์œ ์ง€

๊ธฐ๋Œ€ ํšจ๊ณผ

  • ๊ฐ ํ™”๋ฉด์ด ์ž์‹ ์˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ โ†’ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ๊ฐ•ํ™”
  • ๋ณต์žกํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ”Œ๋กœ์šฐ๋„ ๋‹จ์ผ ์ง„์ž…์ ์—์„œ ๊ด€๋ฆฌ โ†’ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐœ์„ 
  • ๊ธ€๋กœ๋ฒŒ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์—๋„ Coordinator์—์„œ ์ „์ฒด ํ”Œ๋กœ์šฐ๋ฅผ ์ œ์–ด โ†’ ์ผ๊ด€์„ฑ ์œ ์ง€

์‹ค์ œ ํšจ๊ณผ

  • ํ™”๋ฉด ์ „ํ™˜ ํ๋ฆ„์ด ๋ช…ํ™•ํ•ด์ง€๊ณ , Flow ๋ณ€๊ฒฝ ์‹œ์—๋„ Coordinator๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋Š” ๊ตฌ์กฐ ํ™•๋ณด
  • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ํ™”๋ฉด์€ ๋‹ค๋ฅธ Coordinator์—์„œ๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ โ†’ ์ค‘๋ณต ๋กœ์ง ๊ฐ์†Œ
  • Alert, ํŒ์—… ๊ฐ™์€ ๊ณตํ†ต UI ์ฒ˜๋ฆฌ๋„ ์ค‘์•™ Coordinator์—์„œ ํ†ตํ•ฉ ๊ด€๋ฆฌ

Dependency Injection

์˜์กด์„ฑ ์ฃผ์ž… ์ „๋žต ๋ฐ ๊ตฌํ˜„

๋ฌธ์ œ ์ƒํ™ฉ

  • ํ™”๋ฉด ์ƒ์„ฑ ์‹œ๋งˆ๋‹ค ํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค, ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ฐ์ฒด ๋“ฑ์„ ์ง์ ‘ ์ƒ์„ฑ
  • ๊ฐ ํ™”๋ฉด๋งˆ๋‹ค ์ค‘๋ณต ์ฝ”๋“œ ๋ฐœ์ƒ, ์ƒ์„ฑ ๋ฐฉ์‹์ด ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ
  • ํ…Œ์ŠคํŠธ ์‹œ์—๋„ ์‹ค์ œ ์„œ๋น„์Šค ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ฃผ์ž…ํ•ด์•ผ ํ•ด์„œ, ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์›€

์›์ธ ๋ถ„์„

  • ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ฐ์ฒด ์ƒ์„ฑ ์ฑ…์ž„์ด ํ™”๋ฉด ์ชฝ์— ์กด์žฌ
  • ํ™”๋ฉด๋ณ„๋กœ ํ•„์š”ํ•œ ์˜์กด์„ฑ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅด๋‹ค ๋ณด๋‹ˆ, ํ™”๋ฉด๋งˆ๋‹ค ์ƒ์„ฑ ๋กœ์ง์ด ๋‹ฌ๋ผ์ง
  • Mock ์ฃผ์ž… ๊ฐ™์€ ํ…Œ์ŠคํŠธ ์œ ์—ฐ์„ฑ ํ™•๋ณด๊ฐ€ ์–ด๋ ค์›€

์„ ํƒํ•œ ๋ฐฉ๋ฒ•

  • DIContainer๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ์ข… ์˜์กด์„ฑ์„ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ ๊บผ๋‚ด์“ฐ๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ
  • ํ™”๋ฉด์—์„œ๋Š” ํ•„์š”ํ•œ ์˜์กด์„ฑ๋งŒ ์ฃผ์ž…๋ฐ›๊ณ , ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •
  • ๊ณตํ†ต ์˜์กด์„ฑ์€ @Injected ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ

๊ธฐ๋Œ€ ํšจ๊ณผ

  • ํ™”๋ฉด์˜ ์ƒ์„ฑ ์ฑ…์ž„ ๋ถ„๋ฆฌ โ†’ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ๊ฐ•ํ™”
  • ํ…Œ์ŠคํŠธ ์‹œ Mock ๊ฐ์ฒด ์ฃผ์ž… ๊ฐ€๋Šฅ โ†’ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ํ–ฅ์ƒ
  • ์˜์กด์„ฑ ๊ด€๋ฆฌ ์ผ์›ํ™” โ†’ ์ƒ์„ฑ ๋ฐฉ์‹์˜ ์ผ๊ด€์„ฑ ์œ ์ง€ ๋ฐ ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ

์‹ค์ œ ํšจ๊ณผ

  • ์˜์กด์„ฑ ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ๋‹จ์ผํ™”๋˜์–ด, ์‹ ๊ทœ ์„œ๋น„์Šค ์ถ”๊ฐ€/๊ต์ฒด๊ฐ€ ๊ฐ„ํŽธํ•ด์ง
  • ์˜์กด์„ฑ ์ฃผ์ž… ํŒจํ„ด์ด ํ†ต์ผ๋˜์–ด, ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
  • ๋„คํŠธ์›Œํฌ ํ…Œ์ŠคํŠธ ๋“ฑ์—์„œ๋„ ์‹ค์ œ ๊ฐ์ฒด ๋Œ€์‹  Mock ๊ฐ์ฒด ์ฃผ์ž… ๊ฐ€๋Šฅ โ†’ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•์žฅ

๊ฒฐ๊ณผ์ ์œผ๋กœ ์˜์กด์„ฑ ๊ด€๋ฆฌ์™€ ๊ฐ์ฒด ์ƒ์„ฑ ์ฑ…์ž„์„ ํ™”๋ฉด์—์„œ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋„ ๋‚ฎ์ถ”๋Š” ํšจ๊ณผ๋ฅผ ์–ป์—ˆ๋‹ค.

Unit Test

ํ…Œ์ŠคํŠธ ์ „๋žต ๋ฐ ๊ตฌํ˜„

๋ฌธ์ œ ์ƒํ™ฉ

  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€๋งŒ ํ…Œ์ŠคํŠธํ•˜๋ฉด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Œ
  • ํ† ํฐ ๋งŒ๋ฃŒ, ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ ์‹คํŒจ ๋“ฑ ๋‹ค์–‘ํ•œ ์—๋Ÿฌ ์ผ€์ด์Šค๊ฐ€ ์กด์žฌ
  • ์™ธ๋ถ€ ํ™˜๊ฒฝ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ๋™์ž‘ ๋ณด์žฅ์„ ์œ„ํ•ด ์ •๊ตํ•œ ํ…Œ์ŠคํŠธ ํ•„์š”

์›์ธ ๋ถ„์„

  • ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด๊ฐ€ URLSession์— ์ง์ ‘ ์˜์กด
  • ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ๋งŒ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด, ๋„คํŠธ์›Œํฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ
  • ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ด ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•„, Mock ๊ตฌ์„ฑ ์–ด๋ ค์›€

์„ ํƒํ•œ ๋ฐฉ๋ฒ•

  • POP(Protocol Oriented Programming) ๊ธฐ๋ฐ˜์œผ๋กœ ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด ๊ตฌ์„ฑ
  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ”„๋กœํ† ์ฝœ๋กœ ์ •์˜ํ•˜๊ณ , ์‹ค์ œ ๊ตฌํ˜„๊ณผ Mock ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ
  • ํ…Œ์ŠคํŠธ ์‹œ Mock ๋„คํŠธ์›Œํฌ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ, ์›ํ•˜๋Š” ์‘๋‹ต๊ณผ ์—๋Ÿฌ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๊ธฐ๋Œ€ ํšจ๊ณผ

  • ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ , ๋‹ค์–‘ํ•œ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  • ์„œ๋น„์Šค ๋ ˆ์ด์–ด๋„ ์‹ค์ œ ๋„คํŠธ์›Œํฌ ๊ตฌํ˜„์ฒด๊ฐ€ ์•„๋‹Œ ํ”„๋กœํ† ์ฝœ์— ์˜์กด โ†’ ํ…Œ์ŠคํŠธ ์œ ์—ฐ์„ฑ ๊ทน๋Œ€ํ™”
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋กœ์ง์˜ ์•ˆ์ •์„ฑ ํ™•๋ณด

์‹ค์ œ ํšจ๊ณผ

  • ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์—๋Ÿฌ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
  • ์‹ ๊ทœ API ์ถ”๊ฐ€ ์‹œ์—๋„ ๋™์ผํ•œ ํŒจํ„ด์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ โ†’ ํ…Œ์ŠคํŠธ ํŒจํ„ด ์ •๋ฆฝ
  • ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด ์‹ ๋ขฐ์„ฑ ๊ฐ•ํ™” โ†’ ํด๋ผ์ด์–ธํŠธ ๋ ˆ์ด์–ด ๋กœ์ง๋„ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ฒ€์ฆ ๊ฐ€๋Šฅ

About

UIKit, Clean-Architecture, MVVM-C, Combine, FlexLayout, PinLayout, UnitTest, Kingfisher, Tuist

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages