Skip to content

[πŸ‘Ÿ κ±·λŠ”]의 iOS μ €μž₯μ†Œμž…λ‹ˆλ‹€

Notifications You must be signed in to change notification settings

gaeng2y/GoForAWalk

Repository files navigation

κ±·λŠ” (GoForAWalk)

μ‚°μ±… 기둝을 남기고 κ³΅μœ ν•˜λŠ” iOS μ•±μž…λ‹ˆλ‹€.
이 ν”„λ‘œμ νŠΈλŠ” Tuist 기반 λͺ¨λ“ˆ μ•„ν‚€ν…μ²˜μ™€ SwiftUI + TCA둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ ꡬ쑰

μ•„λž˜ κ΅¬μ‘°λŠ” ν˜„μž¬ μ €μž₯μ†Œμ˜ Project.swift κΈ°μ€€ μ‹€μ œ ν™œμ„± λͺ¨λ“ˆμ„ λ°˜μ˜ν•©λ‹ˆλ‹€.

GoForAWalk
β”œβ”€β”€ Projects
β”‚   β”œβ”€β”€ App
β”‚   β”œβ”€β”€ Feature
β”‚   β”‚   β”œβ”€β”€ SplashFeature
β”‚   β”‚   β”œβ”€β”€ SignIn
β”‚   β”‚   β”œβ”€β”€ MainFeature
β”‚   β”‚   β”œβ”€β”€ FeedFeature
β”‚   β”‚   β”œβ”€β”€ HistoryFeature
β”‚   β”‚   β”œβ”€β”€ ProfileFeature
β”‚   β”‚   β”œβ”€β”€ RecordFeature
β”‚   β”‚   └── SettingsFeature
β”‚   β”œβ”€β”€ Domain
β”‚   β”‚   β”œβ”€β”€ AuthService
β”‚   β”‚   β”œβ”€β”€ CameraService
β”‚   β”‚   β”œβ”€β”€ FeedService
β”‚   β”‚   └── UserService
β”‚   β”œβ”€β”€ Core
β”‚   β”‚   β”œβ”€β”€ Networking
β”‚   β”‚   β”œβ”€β”€ KeyChainStore
β”‚   β”‚   └── Camera
β”‚   β”œβ”€β”€ Shared
β”‚   β”‚   β”œβ”€β”€ DependencyInjection
β”‚   β”‚   β”œβ”€β”€ GlobalThirdPartyLibrary
β”‚   β”‚   └── Util
β”‚   └── UserInterface
β”‚       └── DesignSystem
β”œβ”€β”€ Plugin
β”œβ”€β”€ Tuist
β”œβ”€β”€ Scripts
β”œβ”€β”€ XCConfig
β”œβ”€β”€ Package.swift
β”œβ”€β”€ Tuist.swift
└── Workspace.swift

λ ˆμ΄μ–΄ ꡬ성

Layer λͺ¨λ“ˆ μ—­ν• 
App GoForAWalk μ•± μ§„μž…μ , RootFeature μ‹€ν–‰
Feature Splash, SignIn, Main, Feed, History, Profile, Record, Settings ν™”λ©΄/μƒνƒœ/μœ μ € μ•‘μ…˜ 처리 (TCA)
Domain AuthService, CameraService, FeedService, UserService λΉ„μ¦ˆλ‹ˆμŠ€ API ν΄λΌμ΄μ–ΈνŠΈ
Core Networking, KeyChainStore, Camera 인프라/μ €μˆ˜μ€€ κΈ°λŠ₯
UserInterface DesignSystem 곡톡 UI μ»΄ν¬λ„ŒνŠΈ/λ¦¬μ†ŒμŠ€
Shared DependencyInjection, GlobalThirdPartyLibrary, Util μ˜μ‘΄μ„± 쑰립, μ™ΈλΆ€ 라이브러리 μ§‘μ•½, 곡톡 μœ ν‹Έ

UML

1) λ ˆμ΄μ–΄ μ˜μ‘΄μ„± UML

classDiagram
direction LR

class App
class Feature
class Domain
class Core
class UserInterface
class Shared

App --> Feature
App --> Shared
Feature --> Domain
Feature --> UserInterface
Feature --> Shared
Domain --> Core
Domain --> Shared
Core --> Shared
Loading

2) λͺ¨λ“ˆ μ˜μ‘΄μ„± UML

classDiagram
direction LR

class GoForAWalkApp
class DependencyInjection

class SplashFeature
class SignInFeature
class MainFeature
class FeedFeature
class HistoryFeature
class ProfileFeature
class RecordFeature
class SettingsFeature

class AuthService
class FeedService
class UserService
class CameraService

class Networking
class KeyChainStore
class Camera
class DesignSystem

GoForAWalkApp --> DependencyInjection
GoForAWalkApp --> SplashFeature
GoForAWalkApp --> SignInFeature
GoForAWalkApp --> MainFeature

MainFeature --> FeedFeature
MainFeature --> HistoryFeature
MainFeature --> ProfileFeature
MainFeature --> RecordFeature
MainFeature --> SettingsFeature

SplashFeature --> AuthService
SignInFeature --> AuthService
FeedFeature --> FeedService
HistoryFeature --> FeedService
ProfileFeature --> UserService
RecordFeature --> CameraService
RecordFeature --> FeedService
SettingsFeature --> AuthService
SettingsFeature --> UserService

AuthService --> Networking
AuthService --> KeyChainStore
FeedService --> Networking
UserService --> Networking
CameraService --> Camera
Networking --> KeyChainStore

SplashFeature ..> DesignSystem
SignInFeature ..> DesignSystem
MainFeature ..> DesignSystem
FeedFeature ..> DesignSystem
HistoryFeature ..> DesignSystem
ProfileFeature ..> DesignSystem
RecordFeature ..> DesignSystem
SettingsFeature ..> DesignSystem
Loading

3) μ•± μ‹œμž‘ ν”Œλ‘œμš° UML (Sequence)

sequenceDiagram
autonumber
participant App as GoForAWalkApp
participant Root as RootFeature
participant Splash as SplashFeature
participant Auth as AuthClient
participant Main as MainTabFeature
participant SignIn as SignInFeature

App->>Root: onAppear
Root->>Splash: splash.onAppear
Splash->>Auth: loadToken()
Auth-->>Splash: Token? λ°˜ν™˜

alt 토큰 쑴재
  Splash-->>Root: delegate.authenticated
  Root->>Main: destination = .mainTab
else 토큰 μ—†μŒ
  Splash-->>Root: delegate.unauthenticated
  Root->>SignIn: destination = .signIn
end
Loading

타깃 ꡬ성 νŒ¨ν„΄

λͺ¨λ“ˆμ€ Interface / Sources 뢄리λ₯Ό 기본으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.

  • Feature/Core/Domain: Interface, Sources, Testing, Tests (λͺ¨λ“ˆλ³„λ‘œ Demo, UITests 선택)
  • Shared/UserInterface: λͺ©μ μ— 맞게 단일 Sources λ˜λŠ” Demo 포함

μ˜ˆμ‹œ:

Projects/Feature/FeedFeature
β”œβ”€β”€ Interface
β”œβ”€β”€ Sources
β”œβ”€β”€ Testing
β”œβ”€β”€ Tests
β”œβ”€β”€ Demo
└── UITests

기술 μŠ€νƒ

λΆ„λ₯˜ λ‚΄μš©
Language Swift 6
UI SwiftUI
Architecture TCA (The Composable Architecture)
Build/Modularization Tuist (.tuist-version: 4.88.0)
Networking Alamofire
Auth Kakao SDK, Sign in with Apple
Analytics/Crash Firebase Analytics, Crashlytics

μ‹œμž‘ν•˜κΈ°

μš”κ΅¬μ‚¬ν•­

  • Xcode 16+
  • iOS Deployment Target 18.0+
  • Tuist 4.88+

μ„€μΉ˜ 및 μ‹€ν–‰

# 1) Tuist μ„€μΉ˜ (mise μ‚¬μš© μ‹œ)
mise install tuist

# 2) μ˜μ‘΄μ„± μ„€μΉ˜ + ν”„λ‘œμ νŠΈ 생성
make generate

# 3) μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ—΄κΈ°
open GoForAWalk.xcworkspace

Make λͺ…λ Ήμ–΄

λͺ…λ Ήμ–΄ μ„€λͺ…
make init ν”„λ‘œμ νŠΈ κΈ°λ³Έ ν™˜κ²½ μ΄ˆκΈ°ν™”
make signing μ½”λ“œ μ„œλͺ… μ„€μ •
make generate μ˜μ‘΄μ„± μ„€μΉ˜ + ν”„λ‘œμ νŠΈ 생성
make ci_generate CI ν™˜κ²½μš© generate
make cd_generate CD ν™˜κ²½μš© generate
make module μ‹ κ·œ λͺ¨λ“ˆ 생성
make dependency λ””νŽœλ˜μ‹œ μΆ”κ°€
make clean μƒμ„±λœ .xcodeproj, .xcworkspace 정리
make reset tuist clean + 생성 파일 정리

About

[πŸ‘Ÿ κ±·λŠ”]의 iOS μ €μž₯μ†Œμž…λ‹ˆλ‹€

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages