|
1 | | -# 27th-App-Team-1-iOS |
| 1 | +# NDGL-iOS |
| 2 | + |
| 3 | +<p align="center"> |
| 4 | + <img src="https://img.shields.io/badge/Swift-5.0-orange.svg" /> |
| 5 | + <img src="https://img.shields.io/badge/iOS-17.0+-blue.svg" /> |
| 6 | + <img src="https://img.shields.io/badge/Tuist-4.x-purple.svg" /> |
| 7 | + <img src="https://img.shields.io/badge/Architecture-RIBs-green.svg" /> |
| 8 | +</p> |
| 9 | + |
| 10 | +## 📱 프로젝트 소개 |
| 11 | + |
| 12 | +NDGL은 여행 콘텐츠를 따라가며 나만의 여행을 계획할 수 있는 iOS 앱입니다. |
| 13 | + |
| 14 | +## 🛠 기술 스택 |
| 15 | + |
| 16 | +| 구분 | 기술 | |
| 17 | +|:---:|:---| |
| 18 | +| **Architecture** | RIBs (Router-Interactor-Builder-Presenter) | |
| 19 | +| **UI** | UIKit, SnapKit, Then | |
| 20 | +| **Reactive** | RxSwift, RxCocoa | |
| 21 | +| **Network** | Moya, Alamofire | |
| 22 | +| **Image** | Kingfisher | |
| 23 | +| **Animation** | Lottie | |
| 24 | +| **Push** | Firebase Cloud Messaging (FCM) | |
| 25 | +| **Project** | Tuist | |
| 26 | +| **CI/CD** | GitHub Actions, Fastlane | |
| 27 | + |
| 28 | +## 📁 모듈 구조 |
| 29 | + |
| 30 | +``` |
| 31 | +NDGL-iOS |
| 32 | +├── Projects |
| 33 | +│ ├── App # 앱 타겟 |
| 34 | +│ ├── Features # Feature 모듈 |
| 35 | +│ │ ├── RootFeature # 앱 진입점 RIB |
| 36 | +│ │ ├── TabBarFeature # 탭바 RIB |
| 37 | +│ │ ├── HomeFeature # 홈 화면 |
| 38 | +│ │ ├── FollowFeature # 따라가기 콘텐츠 |
| 39 | +│ │ ├── TravelFeature # 다가오는 여행 |
| 40 | +│ │ └── BaseFeatureDependency |
| 41 | +│ ├── Domain # Entity, UseCase, Repository Interface |
| 42 | +│ ├── Data # Repository 구현체, DTO |
| 43 | +│ ├── Core # 공통 유틸리티 |
| 44 | +│ └── Modules |
| 45 | +│ ├── DSKit # 디자인 시스템 (Color, Font, Component) |
| 46 | +│ ├── Networks # 네트워크 레이어 |
| 47 | +│ └── ThirdPartyLibs # 외부 라이브러리 의존성 |
| 48 | +├── Plugins |
| 49 | +│ └── EnvPlugin # 환경 설정 플러그인 |
| 50 | +├── Tuist # Tuist 설정 |
| 51 | +├── fastlane # CI/CD 스크립트 |
| 52 | +└── Scripts # 빌드 스크립트 |
| 53 | +``` |
| 54 | + |
| 55 | +## 🏗 아키텍처 |
| 56 | + |
| 57 | +### RIBs Architecture |
| 58 | + |
| 59 | +``` |
| 60 | +┌─────────────────────────────────────────────────┐ |
| 61 | +│ Router │ |
| 62 | +│ (화면 전환, Child RIB Attach/Detach) │ |
| 63 | +└─────────────────────────────────────────────────┘ |
| 64 | + │ |
| 65 | + ▼ |
| 66 | +┌─────────────────────────────────────────────────┐ |
| 67 | +│ Interactor │ |
| 68 | +│ (비즈니스 로직, 상태 관리) │ |
| 69 | +└─────────────────────────────────────────────────┘ |
| 70 | + │ |
| 71 | + ┌──────────┴──────────┐ |
| 72 | + ▼ ▼ |
| 73 | +┌──────────────────┐ ┌──────────────────┐ |
| 74 | +│ Presenter │ │ Builder │ |
| 75 | +│ (View ↔ 통신) │ │ (DI, RIB 생성) │ |
| 76 | +└──────────────────┘ └──────────────────┘ |
| 77 | + │ |
| 78 | + ▼ |
| 79 | +┌──────────────────┐ |
| 80 | +│ ViewController │ |
| 81 | +│ (UI 렌더링) │ |
| 82 | +└──────────────────┘ |
| 83 | +``` |
| 84 | + |
| 85 | +### 모듈 의존성 |
| 86 | + |
| 87 | +``` |
| 88 | + ┌─────────┐ |
| 89 | + │ App │ |
| 90 | + └────┬────┘ |
| 91 | + │ |
| 92 | + ┌────────────────────┼────────────────────┐ |
| 93 | + ▼ ▼ ▼ |
| 94 | + ┌──────────┐ ┌──────────┐ ┌───────────┐ |
| 95 | + │ Data │ │ Networks │ │ Root │ |
| 96 | + └────┬─────┘ └────┬─────┘ │ Feature │ |
| 97 | + │ │ └─────┬─────┘ |
| 98 | + │ ┌────┴────┐ │ |
| 99 | + │ ▼ ▼ ▼ |
| 100 | + │ ┌────────┐┌────────┐ ┌───────────┐ |
| 101 | + │ │ Domain ││ Core │ │ TabBar │ |
| 102 | + │ └────────┘└────────┘ │ Feature │ |
| 103 | + │ └─────┬─────┘ |
| 104 | + │ │ |
| 105 | + ▼ ▼ |
| 106 | + ┌──────────┐ ┌───────────┐ |
| 107 | + │ Domain │ │ Home │ |
| 108 | + │ Networks │ │ Feature │ |
| 109 | + └──────────┘ └─────┬─────┘ |
| 110 | + │ |
| 111 | + ▼ |
| 112 | + ┌─────────────────────┐ |
| 113 | + │ BaseFeatureDependency│ |
| 114 | + └──────────┬──────────┘ |
| 115 | + │ |
| 116 | + ┌───────────────┼───────────────┐ |
| 117 | + ▼ ▼ ▼ |
| 118 | + ┌────────┐ ┌────────┐ ┌───────┐ |
| 119 | + │ Core │ │ Domain │ │ DSKit │ |
| 120 | + └────┬───┘ └────┬───┘ └───┬───┘ |
| 121 | + │ │ │ |
| 122 | + └──────────────┴──────────────┘ |
| 123 | + │ |
| 124 | + ▼ |
| 125 | + ┌────────┐ |
| 126 | + │ Core │ |
| 127 | + └────┬───┘ |
| 128 | + │ |
| 129 | + ▼ |
| 130 | + ┌───────────────┐ |
| 131 | + │ ThirdPartyLibs│ |
| 132 | + └───────────────┘ |
| 133 | +``` |
| 134 | + |
| 135 | +### 주요 의존성 관계 |
| 136 | + |
| 137 | +| 모듈 | 의존성 | |
| 138 | +|:---:|:---| |
| 139 | +| **App** | Data, Networks, RootFeature | |
| 140 | +| **RootFeature** | TabBarFeature | |
| 141 | +| **TabBarFeature** | HomeFeature | |
| 142 | +| **HomeFeature** | BaseFeatureDependency | |
| 143 | +| **BaseFeatureDependency** | Core, Domain, DSKit | |
| 144 | +| **Data** | Domain, Networks | |
| 145 | +| **Networks** | Core, Domain | |
| 146 | +| **Domain** | Core | |
| 147 | +| **DSKit** | Core | |
| 148 | +| **Core** | ThirdPartyLibs (RxSwift, RIBs, SnapKit, Then, Moya, Kingfisher) | |
| 149 | + |
| 150 | +## 🌿 브랜치 전략 |
| 151 | + |
| 152 | +| 브랜치 | 설명 | |
| 153 | +|:---:|:---| |
| 154 | +| `main` | 프로덕션 배포 브랜치 | |
| 155 | +| `develop` | 개발 통합 브랜치 | |
| 156 | +| `feat/#이슈번호-작업내용` | 기능 개발 브랜치 | |
| 157 | +| `fix/#이슈번호-작업내용` | 버그 수정 브랜치 | |
| 158 | +| `hotfix/#이슈번호-작업내용` | 긴급 수정 브랜치 (develop에서 분기) | |
| 159 | + |
| 160 | +### PR 규칙 |
| 161 | +- **2명 이상 승인** 시 머지 가능 |
| 162 | +- CI 통과 필수 |
| 163 | + |
| 164 | +## 🔄 CI/CD |
| 165 | + |
| 166 | +| 환경 | 트리거 | 동작 | |
| 167 | +|:---:|:---:|:---| |
| 168 | +| **CI** | `develop` PR/Push | 빌드 체크, 린트 검사 | |
| 169 | +| **CD** | `main` Push | Fastlane을 통한 TestFlight 배포 | |
| 170 | + |
| 171 | +## 📝 커밋 컨벤션 |
| 172 | + |
| 173 | +``` |
| 174 | +feat: #이슈번호 - 작업 내용 |
| 175 | +``` |
| 176 | + |
| 177 | +| 타입 | 설명 | |
| 178 | +|:---:|:---| |
| 179 | +| `feat` | 새로운 기능 추가 | |
| 180 | +| `fix` | 버그 수정 | |
| 181 | +| `docs` | 문서 수정 | |
| 182 | +| `style` | 코드 포맷팅 (기능 변경 없음) | |
| 183 | +| `refactor` | 코드 리팩토링 | |
| 184 | +| `test` | 테스트 코드 추가/수정 | |
| 185 | +| `chore` | 빌드, 패키지 매니저 설정 | |
| 186 | +| `design` | UI/UX 디자인 변경 | |
| 187 | + |
| 188 | +## 📐 코드 컨벤션 |
| 189 | + |
| 190 | +[StyleShare Swift Style Guide](https://github.com/StyleShare/swift-style-guide) 준수 |
| 191 | + |
| 192 | +### SwiftLint |
| 193 | +프로젝트 루트의 `.swiftlint.yml` 설정 파일 사용 |
| 194 | + |
| 195 | +## 🚀 시작하기 |
| 196 | + |
| 197 | +### 요구사항 |
| 198 | +- Xcode 16.0+ |
| 199 | +- iOS 17.0+ |
| 200 | +- [mise](https://mise.jdx.dev/) (Tuist, Ruby 버전 관리) |
| 201 | + |
| 202 | +### 설치 및 실행 |
| 203 | + |
| 204 | +```bash |
| 205 | +# 1. 저장소 클론 |
| 206 | +git clone https://github.com/YourOrg/NDGL-iOS.git |
| 207 | +cd NDGL-iOS |
| 208 | + |
| 209 | +# 2. mise로 도구 설치 |
| 210 | +mise install |
| 211 | + |
| 212 | +# 3. 의존성 설치 |
| 213 | +bundle install |
| 214 | +tuist install |
| 215 | + |
| 216 | +# 4. 프로젝트 생성 |
| 217 | +tuist generate |
| 218 | + |
| 219 | +# 5. Xcode에서 NDGL-iOS.xcworkspace 열기 |
| 220 | +``` |
| 221 | + |
| 222 | +## 👥 팀원 |
| 223 | + |
| 224 | +<table> |
| 225 | + <tr> |
| 226 | + <td align="center"> |
| 227 | + <a href="https://github.com/KimNahun"> |
| 228 | + <img src="https://github.com/KimNahun.png" width="120" /> |
| 229 | + <br /> |
| 230 | + <b>김나훈</b> |
| 231 | + </a> |
| 232 | + </td> |
| 233 | + <td align="center"> |
| 234 | + <a href="https://github.com/ChoiAnYong"> |
| 235 | + <img src="https://github.com/ChoiAnYong.png" width="120" /> |
| 236 | + <br /> |
| 237 | + <b>최안용</b> |
| 238 | + </a> |
| 239 | + </td> |
| 240 | + </tr> |
| 241 | +</table> |
0 commit comments