SSAFYHubλ μΌμ± μ²λ μννΈμ¨μ΄ μμΉ΄λ°λ―Έ(SSAFY) μΊ νΌμ€μ μλ¨ μ 보λ₯Ό μ 곡νκ³ κ΄λ¦¬ν μ μλ iOS μ±μ λλ€. AI κΈ°λ° λ©λ΄ μΈμκ³Ό μ€μκ° μμ ―μ ν΅ν΄ νμλ€μ μλ¨ κ΄λ¦¬λ₯Ό λμ± νΈλ¦¬νκ² λ§λ€μ΄μ€λλ€.
- Apple Sign-In: μμ νκ³ λΉ λ₯Έ λ‘κ·ΈμΈ
- κ²μ€νΈ λͺ¨λ: μ νλ κΈ°λ₯μΌλ‘ 체ν κ°λ₯
- μλ μΈμ κ΄λ¦¬: μ± μ¬μμ μ μλ λ‘κ·ΈμΈ
- μ£Όκ° λ©λ΄ νΈμ§: ν λ²μ 5μΌμΉ λ©λ΄ λ±λ‘
- AI λ©λ΄ μΈμ: GPT-4o-miniλ‘ μλ¨ν μ¬μ§ μλ λΆμ
- μ€μκ° λκΈ°ν: λ©λ΄ λ³κ²½ μ μ¦μ λ°μ
- μΊ νΌμ€λ³ κ΄λ¦¬: λμ μΊ νΌμ€ μ§μ (μΆν νμ₯ μμ )
- Aνμ /Bνμ μμ ―: ν νλ©΄μμ λ°λ‘ λ©λ΄ νμΈ
- μλ μ λ°μ΄νΈ: λ§€μΌ μμ , μ μ¬, μ λ μλ κ°±μ
- μ§μ λ°μ΄ν° λ‘λ©: μ± μ€ν μμ΄λ μ΅μ λ©λ΄ νμ
- λ€ν¬λͺ¨λ μλ²½ μ§μ: λΌμ΄νΈ/λ€ν¬/μμ€ν ν λ§
- μ§κ΄μ μΈ UI: SwiftUI κΈ°λ° λͺ¨λ λμμΈ
- μ κ·Όμ±: κ³ λλΉ μμκ³Ό μ μ ν ν°νΈ ν¬κΈ°
| Frontend | SwiftUI, ComposableArchitecture (TCA) |
| Backend | Supabase (PostgreSQL, Auth) |
| AI | OpenAI GPT-4o-mini (μ΄λ―Έμ§ λΆμ) |
| Build System | Tuist |
| Authentication | Apple Sign-In, Guest Mode |
| Widget | WidgetKit (iOS widgets) |
| Architecture | MVVM + Coordinator Pattern |
SSAFYHub/
βββ π Configuration/ # μ€μ νμΌ
β βββ env.example # νκ²½ λ³μ μμ
βββ π Scripts/ # λΉλ μ€ν¬λ¦½νΈ
βββ π SharedModels/ # 곡μ λͺ¨λΈ
βββ π SSAFYHub/ # λ©μΈ μ±
β βββ π Sources/
β β βββ π App/ # μ± μ§μ
μ
β β βββ π Core/ # ν΅μ¬ λͺ¨λ
β β β βββ π Caching/ # μΊμ± μμ€ν
β β β βββ π ErrorHandling/ # μλ¬ μ²λ¦¬
β β β βββ π Logging/ # λ‘κΉ
μμ€ν
β β β βββ π Managers/ # μλΉμ€ λ§€λμ
β β β βββ π Network/ # λ€νΈμν¬ κ΄λ¦¬
β β β βββ π Testing/ # ν
μ€νΈ μ νΈλ¦¬ν°
β β β βββ π Utilities/ # μ νΈλ¦¬ν°
β β βββ π Screens/ # νλ©΄λ³ λͺ¨λ
β β β βββ π Auth/ # μΈμ¦ νλ©΄
β β β βββ π Menu/ # λ©λ΄ νλ©΄
β β β βββ π Settings/ # μ€μ νλ©΄
β β βββ π Shared/ # 곡μ μ»΄ν¬λνΈ
β β βββ SSAFYHubApp.swift # μ± μ§μ
μ
β βββ π Tests/ # ν
μ€νΈ
βββ π SSAFYHubWidget/ # μμ ― νμ₯
- Xcode: 15.0+
- iOS: 17.0+
- Swift: 5.9+
- Tuist: 4.0+
# 1. μ μ₯μ ν΄λ‘
git clone https://github.com/CobyApp/SSAFYHub.git
cd SSAFYHub
# 2. μμ‘΄μ± μ€μΉ
tuist install
# 3. νκ²½ λ³μ μ€μ
cp Configuration/env.example .env
# .env νμΌμ μ€μ API ν€ μ€μ
# 4. νλ‘μ νΈ μμ± λ° μ€ν
tuist generate
# Xcodeμμ νλ‘μ νΈ μ΄κΈ°- OpenAI Platformμμ API ν€ λ°κΈ
.envνμΌμOPENAI_API_KEYμ€μ
- Supabase νλ‘μ νΈ μμ±
.envνμΌμ λ€μ μ€μ :SUPABASE_URL=your_supabase_url SUPABASE_ANON_KEY=your_supabase_anon_key
- Aνμ μμ ―: μ£Όν©μ ν λ§, Aνμ λ©λ΄ νμ
- Bνμ μμ ―: μ΄λ‘μ ν λ§, Bνμ λ©λ΄ νμ
- μ λ°μ΄νΈ μκ°: λ§€μΌ μμ , μ μ¬(12μ), μ λ (18μ)
- μ€μκ° λκΈ°ν: λ©μΈ μ±μμ λ©λ΄ μμ μ μμ ― μλ μ λ°μ΄νΈ
- μ§μ λ°μ΄ν° λ‘λ©: μμ ―μ΄ λ 립μ μΌλ‘ λ€νΈμν¬μμ μ΅μ λ°μ΄ν° λ‘λ
- Small: μμ ν¬κΈ° (κΈ°λ³Έ)
- Medium: μ€κ° ν¬κΈ° (λ λ§μ λ©λ΄ νμ)
# λ¨μ ν
μ€νΈ μ€ν
tuist test
# νΉμ ν
μ€νΈ νκ² μ€ν
tuist test SSAFYHubTests
# λΉλ ν
μ€νΈ
tuist build- Row Level Security (RLS): Supabaseμμ λ°μ΄ν° μ κ·Ό μ μ΄
- μ¬μ©μλ³ κΆν: κ²μ€νΈ/μΈμ¦λ μ¬μ©μ ꡬλΆ
- μΊ νΌμ€λ³ λ°μ΄ν° 격리: κ° μΊ νΌμ€μ λ©λ΄ λ°μ΄ν° λ 립 κ΄λ¦¬
- App Group: μμ ―κ³Ό λ©μΈ μ± κ° μμ ν λ°μ΄ν° 곡μ
- API ν€ λ³΄μ: νκ²½λ³μ κΈ°λ° κ΄λ¦¬
| κΈ°λ₯ | μν | λΉκ³ |
|---|---|---|
| λμ μΊ νΌμ€ | β μμ μ§μ | λ©λ΄ μ‘°ν, νΈμ§, AI μΈμ |
| λ€ν¬λͺ¨λ | β μμ μ§μ | λΌμ΄νΈ/λ€ν¬/μμ€ν ν λ§ |
| μμ ― | β μμ μ§μ | Aνμ /Bνμ μμ ― |
| AI λ©λ΄ μΈμ | β μμ μ§μ | GPT-4o-mini κΈ°λ° |
| κΈ°ν μΊ νΌμ€ | π§ μ€λΉμ€ | μΆν νμ₯ μμ |
μ±μ΄ μ€νλμ§ μλ κ²½μ°
- iOS λ²μ νμΈ: iOS 17.0 μ΄μ νμ
- κΆν νμΈ: μΉ΄λ©λΌ, μ¨λ² μ κ·Ό κΆν νμ©
- μ¬μ€μΉ: μ± μμ ν μ¬μ€μΉ
λ‘κ·ΈμΈμ΄ μ λλ κ²½μ°
- Apple ID νμΈ: μ€μ > Apple ID > iCloudμμ Apple ID μν νμΈ
- λ€νΈμν¬ μ°κ²°: μΈν°λ· μ°κ²° μν νμΈ
- κ²μ€νΈ λͺ¨λ: μμλ‘ κ²μ€νΈ λͺ¨λ μ¬μ©
AI λ©λ΄ μΈμμ΄ μλνμ§ μλ κ²½μ°
- API ν€ νμΈ: OpenAI API ν€κ° μ¬λ°λ₯΄κ² μ€μ λμλμ§ νμΈ
- μ΄λ―Έμ§ νμ§: μ λͺ νκ³ λ©λ΄κ° μ 보μ΄λ μ¬μ§ μ¬μ©
- κΆν νμΈ: μΉ΄λ©λΌ λ° μ¨λ² μ κ·Ό κΆν νμ©
μμ ―μ΄ μ λ°μ΄νΈλμ§ μλ κ²½μ°
- λ©μΈ μ± μ€ν: μ΅μ λ°μ΄ν° λκΈ°νλ₯Ό μν΄ μ± μ€ν
- μμ ― μ¬μΆκ°: μμ ― μ κ±° ν μ¬μΆκ°
- κΈ°κΈ° μ¬λΆν : μμ€ν μΊμ μ΄κΈ°ν
- ποΈ νλ‘μ νΈ κ΅¬μ‘° λν κ°μ
- π νλ©΄λ³ λͺ¨λ κ΅¬μ‘°λ‘ μ¬κ΅¬μ± (Screens/Auth, Screens/Menu, Screens/Settings)
- π§ μ€μνλ μλ¬ μ²λ¦¬ μμ€ν ꡬν
- π ꡬ쑰νλ λ‘κΉ μμ€ν μΆκ°
- π μ€μνλ λ€νΈμν¬ κ΄λ¦¬ μμ€ν
- πΎ κ³μΈ΅μ μΊμ± μμ€ν (λ©λͺ¨λ¦¬ + λμ€ν¬)
- π§ͺ ν¬κ΄μ μΈ ν μ€νΈ νλ μμν¬
- π½οΈ μμ ― μ§μ λ°μ΄ν° λ‘λ© κΈ°λ₯
- π λ¬Έμν κ°μ λ° ν΅ν©
- π API ν€ λ³΄μ κ°ν
- π½οΈ μμ ― μ΄κΈ° μ€μΉ μ λ°μ΄ν° λ‘λ© κ°μ
- π μμ ―μ΄ νμ λ€νΈμν¬ μμ²μ μλνμ¬ μ΅μ λ°μ΄ν° λ‘λ
- π± λ‘κ·ΈμΈ ν μμ ―μμ μ€μ API λ°μ΄ν° νμ
- π§ λ€νΈμν¬ μ€ν¨ μ μΊμλ λ°μ΄ν° λλ κΈ°λ³Έ λ°μ΄ν° μ¬μ©
- π§ λ²κ·Έ μμ λ° μμ μ± κ°μ
- π νμνν΄ μ λ°μ΄ν°λ² μ΄μ€ μ 리 λ‘μ§ κ°μ
- π Apple Sign-In ν€μ²΄μΈ μ²λ¦¬ μΆκ°
- ποΈ λ©λ΄ μμ μ μ¬μ©μλ³ νν°λ§ κ°μ
- π μ΄κΈ° 릴리μ¦
- β¨ Apple Sign-In μ§μ
- π½οΈ AI κΈ°λ° λ©λ΄ μΈμ (GPT-4o-mini)
- π± iOS μμ ― μ§μ (Aνμ /Bνμ )
- π λ€ν¬λͺ¨λ μλ²½ μ§μ
- π« λμ μΊ νΌμ€ λ©λ΄ κ΄λ¦¬
- π« μΆκ° μΊ νΌμ€ μ§μ: μμΈ, κ΄μ£Ό, ꡬ미, λΆμ°
- π μλ¦Ό κΈ°λ₯: λ©λ΄ λ³κ²½ μλ¦Ό
- β λ©λ΄ μ¦κ²¨μ°ΎκΈ°: μμ£Ό λ¨Ήλ λ©λ΄ μ μ₯
- π ν΅κ³ λ° λΆμ: μλ¨ ν¨ν΄ λΆμ
- π― κ°μΈν: μ¬μ©μ λ§μΆ€ μΆμ²
- π νΈλ λ λΆμ: μΈκΈ° λ©λ΄ ν΅κ³
- π€ μμ κΈ°λ₯: λ©λ΄ 곡μ λ° λ¦¬λ·°
- π κ²μν: μλ¨ κ΄λ¦¬ μ±λ¦°μ§
- π μΈλΆ μ°λ: μΊλ¦°λ, κ±΄κ° μ± μ°λ
SSAFYHub νλ‘μ νΈμ κΈ°μ¬νκ³ μΆμΌμλ€λ©΄:
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- μ½λ© 컨벀μ : Swift API Design Guidelines μ€μ
- μν€ν μ²: ComposableArchitecture ν¨ν΄ μ¬μ©
- ν μ€νΈ: μλ‘μ΄ κΈ°λ₯μ λν ν μ€νΈ μμ±
- λ¬Έμν: λͺ νν μ£Όμκ³Ό README μ λ°μ΄νΈ
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
- μ΄μ 리ν¬νΈ: GitHub Issues
- κΈ°λ₯ μμ²: GitHub Discussions
- λ¬Έμ: Wiki
- SSAFY: μΌμ± μ²λ μννΈμ¨μ΄ μμΉ΄λ°λ―Έ
- OpenAI: GPT-4o-mini API μ 곡
- Supabase: λ°±μλ μΈνλΌ μ 곡
- Point-Free: ComposableArchitecture νλ μμν¬