Skip to content

Latest commit

ย 

History

History
89 lines (65 loc) ยท 4.94 KB

File metadata and controls

89 lines (65 loc) ยท 4.94 KB

Architecture Documentation

์ด ๋ฌธ์„œ๋Š” Codive-iOS ํ”„๋กœ์ ํŠธ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” SwiftUI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, MVVM (Model-View-ViewModel) ํŒจํ„ด๊ณผ Clean Architecture ์›์น™์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ DI Container๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ Router ํŒจํ„ด์„ ํ†ตํ•œ ํ™”๋ฉด ์ „ํ™˜ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.


๐Ÿ— Architectural Overview

์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋Š” Clean Architecture์˜ ๊ณ„์ธตํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

Core Principles

  1. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ (Separation of Concerns): ๊ฐ ๋ ˆ์ด์–ด๋Š” ๋ช…ํ™•ํ•œ ์—ญํ• ์„ ๊ฐ€์ง€๋ฉฐ ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜์กด์„ฑ ๊ทœ์น™ (Dependency Rule): ์˜์กด์„ฑ์€ ํ•ญ์ƒ **์•ˆ์ชฝ(Domain Layer)**์„ ํ–ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Presentation์ด๋‚˜ Data ๋ ˆ์ด์–ด๋Š” Domain ๋ ˆ์ด์–ด๋ฅผ ์•Œ์ง€๋งŒ, Domain ๋ ˆ์ด์–ด๋Š” ์™ธ๋ถ€ ๋ ˆ์ด์–ด๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  3. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ (Testability): ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Domain)์€ UI๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‚ Layer Structure (๊ณ„์ธต ๊ตฌ์กฐ)

๊ฐ Feature(๊ธฐ๋Šฅ)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐœ์˜ ์ฃผ์š” ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

1. Domain Layer (Inner Circle)

๊ฐ€์žฅ ์•ˆ์ชฝ์— ์œ„์น˜ํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ UI ํ”„๋ ˆ์ž„์›Œํฌ(SwiftUI, UIKit ๋“ฑ)์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ Swift ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Entities: ์•ฑ์˜ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ.
  • UseCases: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋Š” ๋‹จ์œ„. Repository Interface๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • Interfaces (Repository Protocols): Data Layer์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•  Repository์˜ ์ถ”์ƒํ™”๋œ ์ •์˜.

2. Data Layer (Outer Circle)

์‹ค์ œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. API ํ†ต์‹ , ๋กœ์ปฌ DB ์ ‘๊ทผ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ Domain Layer์˜ Repository Interface๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • Repositories (Implementation): Domain Layer์˜ Repository Interface๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค.
  • DataSources: Remote(API) ๋˜๋Š” Local(DB, UserDefaults) ๋ฐ์ดํ„ฐ ์†Œ์Šค.
  • DTOs (Data Transfer Objects): API ์‘๋‹ต ๋ชจ๋ธ (Domain Entity๋กœ ๋งคํ•‘๋˜์–ด ์‚ฌ์šฉ๋จ).

3. Presentation Layer (Outer Circle)

์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์ž…๋ ฅ์„ ๋ฐ›๋Š” UI ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.

  • Views (SwiftUI): UI๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ViewModel์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  • ViewModels: View์˜ ์ƒํƒœ(State)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , UseCase๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. @Published ์†์„ฑ์„ ํ†ตํ•ด View์™€ ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ Modularization (Folder Structure)

ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๊ธฐ๋Šฅ ๋‚ด๋ถ€๋Š” Clean Architecture ๋ ˆ์ด์–ด๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

Codive/
โ”œโ”€โ”€ Application/        # ์•ฑ ์ง„์ž…์  ๋ฐ ์ดˆ๊ธฐ ์„ค์ • (AppConfigurator, AppRootView)
โ”œโ”€โ”€ Features/           # ๊ธฐ๋Šฅ๋ณ„ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ Auth/
โ”‚   โ”‚   โ”œโ”€โ”€ Domain/     # Entity, UseCase, Repository Interface
โ”‚   โ”‚   โ”œโ”€โ”€ Data/       # Repository Impl, DTO, API Service
โ”‚   โ”‚   โ””โ”€โ”€ Presentation/ # View, ViewModel
โ”‚   โ”œโ”€โ”€ Feed/
โ”‚   โ”œโ”€โ”€ Home/
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ Shared/             # ๊ณตํ†ต ์‚ฌ์šฉ ๋ชจ๋“ˆ (DesignSystem, Extensions, Network, Storage)
โ”œโ”€โ”€ DIContainer/        # ์˜์กด์„ฑ ์ฃผ์ž… ์ปจํ…Œ์ด๋„ˆ
โ””โ”€โ”€ Router/             # ํ™”๋ฉด ์ „ํ™˜ ๋ฐ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋กœ์ง

๐Ÿ”Œ Dependency Injection (DI)

์˜์กด์„ฑ ์ฃผ์ž…์€ DIContainer ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • AppDIContainer: ์•ฑ ์ „์ฒด์˜ ์ตœ์ƒ์œ„ ์ปจํ…Œ์ด๋„ˆ๋กœ, ๊ฐ Feature์˜ DIContainer๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • FeatureDIContainer (e.g., AuthDIContainer): ๊ฐ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์— ํ•„์š”ํ•œ UseCase, Repository, ViewModel ๋“ฑ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ํ…Œ์ŠคํŠธ ์‹œ Mock ๊ฐ์ฒด ์ฃผ์ž…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿšฆ Navigation (Router Pattern)

ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์€ View์—์„œ ๋ถ„๋ฆฌ๋˜์–ด Router์™€ ViewFactory๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • Router: ๋‚ด๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํ™”๋ฉด ์ „ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค (AppRouter, NavigationRouter).
  • ViewFactory: ํŠน์ • ํ™”๋ฉด(View)์„ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ์˜์กด์„ฑ(ViewModel ๋“ฑ)์„ ์กฐ๋ฆฝํ•˜์—ฌ View๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • View๋Š” Router๋ฅผ ํ†ตํ•ด "์–ด๋””๋กœ ๊ฐˆ์ง€"๋งŒ ์š”์ฒญํ•˜๋ฉฐ, ์‹ค์ œ "์–ด๋–ป๊ฒŒ ํ™”๋ฉด์„ ๋„์šธ์ง€"๋Š” Router๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›  Tech Stack & Tools

  • Language: Swift 6.0+
  • UI Framework: SwiftUI
  • Architecture: MVVM + Clean Architecture
  • Build Tool: Tuist
  • Networking: CodiveAPI (swift-openapi-generator)
  • Reactive Programming: Combine / Swift Concurrency (async/await)