From 917e61f7c6490ceeeb49c4ec8d12719208b0390d Mon Sep 17 00:00:00 2001 From: kimnahun Date: Thu, 29 Jan 2026 03:21:00 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20#16=20-=20README.md=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 242 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 241 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a2fb8d0..a21e1a8 100644 --- a/README.md +++ b/README.md @@ -1 +1,241 @@ -# 27th-App-Team-1-iOS +# NDGL-iOS + +

+ + + + +

+ +## πŸ“± ν”„λ‘œμ νŠΈ μ†Œκ°œ + +NDGL은 μ—¬ν–‰ μ½˜ν…μΈ λ₯Ό 따라가며 λ‚˜λ§Œμ˜ 여행을 κ³„νšν•  수 μžˆλŠ” iOS μ•±μž…λ‹ˆλ‹€. + +## πŸ›  기술 μŠ€νƒ + +| ꡬ뢄 | 기술 | +|:---:|:---| +| **Architecture** | RIBs (Router-Interactor-Builder-Presenter) | +| **UI** | UIKit, SnapKit, Then | +| **Reactive** | RxSwift, RxCocoa | +| **Network** | Moya, Alamofire | +| **Image** | Kingfisher | +| **Animation** | Lottie | +| **Push** | Firebase Cloud Messaging (FCM) | +| **Project** | Tuist | +| **CI/CD** | GitHub Actions, Fastlane | + +## πŸ“ λͺ¨λ“ˆ ꡬ쑰 + +``` +NDGL-iOS +β”œβ”€β”€ Projects +β”‚ β”œβ”€β”€ App # μ•± νƒ€κ²Ÿ +β”‚ β”œβ”€β”€ Features # Feature λͺ¨λ“ˆ +β”‚ β”‚ β”œβ”€β”€ RootFeature # μ•± μ§„μž…μ  RIB +β”‚ β”‚ β”œβ”€β”€ TabBarFeature # νƒ­λ°” RIB +β”‚ β”‚ β”œβ”€β”€ HomeFeature # ν™ˆ ν™”λ©΄ +β”‚ β”‚ β”œβ”€β”€ FollowFeature # 따라가기 μ½˜ν…μΈ  +β”‚ β”‚ β”œβ”€β”€ TravelFeature # λ‹€κ°€μ˜€λŠ” μ—¬ν–‰ +β”‚ β”‚ └── BaseFeatureDependency +β”‚ β”œβ”€β”€ Domain # Entity, UseCase, Repository Interface +β”‚ β”œβ”€β”€ Data # Repository κ΅¬ν˜„μ²΄, DTO +β”‚ β”œβ”€β”€ Core # 곡톡 μœ ν‹Έλ¦¬ν‹° +β”‚ └── Modules +β”‚ β”œβ”€β”€ DSKit # λ””μžμΈ μ‹œμŠ€ν…œ (Color, Font, Component) +β”‚ β”œβ”€β”€ Networks # λ„€νŠΈμ›Œν¬ λ ˆμ΄μ–΄ +β”‚ └── ThirdPartyLibs # μ™ΈλΆ€ 라이브러리 μ˜μ‘΄μ„± +β”œβ”€β”€ Plugins +β”‚ └── EnvPlugin # ν™˜κ²½ μ„€μ • ν”ŒλŸ¬κ·ΈμΈ +β”œβ”€β”€ Tuist # Tuist μ„€μ • +β”œβ”€β”€ fastlane # CI/CD 슀크립트 +└── Scripts # λΉŒλ“œ 슀크립트 +``` + +## πŸ— μ•„ν‚€ν…μ²˜ + +### RIBs Architecture + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Router β”‚ +β”‚ (ν™”λ©΄ μ „ν™˜, Child RIB Attach/Detach) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Interactor β”‚ +β”‚ (λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, μƒνƒœ 관리) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Presenter β”‚ β”‚ Builder β”‚ +β”‚ (View ↔ 톡신) β”‚ β”‚ (DI, RIB 생성) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ ViewController β”‚ +β”‚ (UI λ Œλ”λ§) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### λͺ¨λ“ˆ μ˜μ‘΄μ„± + +``` + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ App β”‚ + β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β–Ό β–Ό β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Data β”‚ β”‚ Networks β”‚ β”‚ Root β”‚ + β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ Feature β”‚ + β”‚ β”‚ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ + β”‚ β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β” β”‚ + β”‚ β–Ό β–Ό β–Ό + β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β”‚ Domain β”‚β”‚ Core β”‚ β”‚ TabBar β”‚ + β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Feature β”‚ + β”‚ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ + β–Ό β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Domain β”‚ β”‚ Home β”‚ + β”‚ Networks β”‚ β”‚ Feature β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ BaseFeatureDependencyβ”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β–Ό β–Ό β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β” + β”‚ Core β”‚ β”‚ Domain β”‚ β”‚ DSKit β”‚ + β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”€β”¬β”€β”€β”€β”˜ + β”‚ β”‚ β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Core β”‚ + β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ ThirdPartyLibsβ”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### μ£Όμš” μ˜μ‘΄μ„± 관계 + +| λͺ¨λ“ˆ | μ˜μ‘΄μ„± | +|:---:|:---| +| **App** | Data, Networks, RootFeature | +| **RootFeature** | TabBarFeature | +| **TabBarFeature** | HomeFeature | +| **HomeFeature** | BaseFeatureDependency | +| **BaseFeatureDependency** | Core, Domain, DSKit | +| **Data** | Domain, Networks | +| **Networks** | Core, Domain | +| **Domain** | Core | +| **DSKit** | Core | +| **Core** | ThirdPartyLibs (RxSwift, RIBs, SnapKit, Then, Moya, Kingfisher) | + +## 🌿 브랜치 μ „λž΅ + +| 브랜치 | μ„€λͺ… | +|:---:|:---| +| `main` | ν”„λ‘œλ•μ…˜ 배포 브랜치 | +| `develop` | 개발 톡합 브랜치 | +| `feat/#이슈번호-μž‘μ—…λ‚΄μš©` | κΈ°λŠ₯ 개발 브랜치 | +| `fix/#이슈번호-μž‘μ—…λ‚΄μš©` | 버그 μˆ˜μ • 브랜치 | +| `hotfix/#이슈번호-μž‘μ—…λ‚΄μš©` | κΈ΄κΈ‰ μˆ˜μ • 브랜치 (developμ—μ„œ λΆ„κΈ°) | + +### PR κ·œμΉ™ +- **2λͺ… 이상 승인** μ‹œ λ¨Έμ§€ κ°€λŠ₯ +- CI 톡과 ν•„μˆ˜ + +## πŸ”„ CI/CD + +| ν™˜κ²½ | 트리거 | λ™μž‘ | +|:---:|:---:|:---| +| **CI** | `develop` PR/Push | λΉŒλ“œ 체크, 린트 검사 | +| **CD** | `main` Push | Fastlane을 ν†΅ν•œ TestFlight 배포 | + +## πŸ“ 컀밋 μ»¨λ²€μ…˜ + +``` +feat: #이슈번호 - μž‘μ—… λ‚΄μš© +``` + +| νƒ€μž… | μ„€λͺ… | +|:---:|:---| +| `feat` | μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€ | +| `fix` | 버그 μˆ˜μ • | +| `docs` | λ¬Έμ„œ μˆ˜μ • | +| `style` | μ½”λ“œ ν¬λ§·νŒ… (κΈ°λŠ₯ λ³€κ²½ μ—†μŒ) | +| `refactor` | μ½”λ“œ λ¦¬νŒ©ν† λ§ | +| `test` | ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€/μˆ˜μ • | +| `chore` | λΉŒλ“œ, νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € μ„€μ • | +| `design` | UI/UX λ””μžμΈ λ³€κ²½ | + +## πŸ“ μ½”λ“œ μ»¨λ²€μ…˜ + +[StyleShare Swift Style Guide](https://github.com/StyleShare/swift-style-guide) μ€€μˆ˜ + +### SwiftLint +ν”„λ‘œμ νŠΈ 루트의 `.swiftlint.yml` μ„€μ • 파일 μ‚¬μš© + +## πŸš€ μ‹œμž‘ν•˜κΈ° + +### μš”κ΅¬μ‚¬ν•­ +- Xcode 16.0+ +- iOS 17.0+ +- [mise](https://mise.jdx.dev/) (Tuist, Ruby 버전 관리) + +### μ„€μΉ˜ 및 μ‹€ν–‰ + +```bash +# 1. μ €μž₯μ†Œ 클둠 +git clone https://github.com/YourOrg/NDGL-iOS.git +cd NDGL-iOS + +# 2. mise둜 도ꡬ μ„€μΉ˜ +mise install + +# 3. μ˜μ‘΄μ„± μ„€μΉ˜ +bundle install +tuist install + +# 4. ν”„λ‘œμ νŠΈ 생성 +tuist generate + +# 5. Xcodeμ—μ„œ NDGL-iOS.xcworkspace μ—΄κΈ° +``` + +## πŸ‘₯ νŒ€μ› + + + + + + +
+ + +
+ κΉ€λ‚˜ν›ˆ +
+
+ + +
+ μ΅œμ•ˆμš© +
+