๋ํ์ ๊ฐ์ ํค์ AI๋ก ๋ถ์ํ๋ iOS ์ฑ
Apple Vision Framework OCR + OpenAI GPT-4o-mini + SwiftUI
ToneMeter๋ ๋ํ ์คํฌ๋ฆฐ์ท์ ๋ถ์ํ์ฌ ๊ฐ์ ํค์ 0~100 ์ ์๋ก ์๊ฐํํ๋ iOS ๊ฐ์ธ ํ๋ก์ ํธ์
๋๋ค.
Vision Framework๋ก ํ
์คํธ๋ฅผ ์ถ์ถํ๊ณ , OpenAI GPT-4o-mini๋ก ๊ฐ์ ์ ๋ถ์ํ์ฌ, ์ง๊ด์ ์ธ ๋ฏธํฐ๊ธฐ UI๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Vision Framework OCR๊ณผ AI ๋ถ์์ ๊ฒฐํฉํ ์ค์ฉ์ ์ธ ๊ฐ์ ๋ถ์ ์ฑ ๊ตฌํ
- MVVM ์ํคํ ์ฒ ๊ธฐ๋ฐ์ ํ์ฅ ๊ฐ๋ฅํ iOS ์ฑ ์ค๊ณ
- SwiftUI์ GRDB๋ฅผ ํ์ฉํ ๋ชจ๋ iOS ๊ฐ๋ฐ ๊ฒฝํ ์๊ธฐ
- โจ ์ฃผ์ ๊ธฐ๋ฅ
- ๐๏ธ ๊ธฐ์ ์คํ
- ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๐ ์ค์น ๋ฐ ๋น๋ ๋ฐฉ๋ฒ
- ๐ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ๐งช ํ ์คํธ & ๋ฌธ์
- ๐จ ๋์์ธ ์์คํ
- ๐ก ๊ธฐ์ ์ ํ์ด๋ผ์ดํธ
- ๐ ๊ฐ๋ฐ ํ๊ณ
- OCR ํ ์คํธ ์ธ์: Apple Vision Framework๋ก ๋ํ ์ด๋ฏธ์ง์์ ํ ์คํธ ์ถ์ถ (์ ํ๋ ~89%)
- AI ๊ฐ์ ๋ถ์: OpenAI GPT-4o-mini๋ก ๊ฐ์ ํค ๋ถ์ (0~100 ์ ์)
- ์ค์๊ฐ ๊ฒฐ๊ณผ: ์ด๋ฏธ์ง ์ ํ๋ถํฐ ๊ฒฐ๊ณผ ํ์๊น์ง ํ๊ท 2.6์ด
- ๊ฐ์ ๋ฏธํฐ๊ธฐ: ์ ์์ ๋ฐ๋ฅธ ๊ทธ๋ผ๋ฐ์ด์ ๊ฒ์ด์ง (๊ธ์ /์ค๋ฆฝ/๋ถ์ )
- ๊ฐ์ ์นด๋: ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์
- ๋คํฌ ๋ชจ๋: ์๋ ์ง์
- ๋ถ์ ํ์คํ ๋ฆฌ: ๋ชจ๋ ๋ถ์ ๊ธฐ๋ก์ ๋ก์ปฌ DB์ ์ ์ฅ (GRDB)
- ํํฐ๋ง & ์ ๋ ฌ: ๋ ์ง๋ณ, ๊ฐ์ ๋ณ, ์ ์๋ณ ํํฐ๋ง
- ์์ธ ๋ณด๊ธฐ: OCR ์๋ฌธ, ๊ฐ์ ํค์๋, ๋ถ์ ๊ทผ๊ฑฐ ํ์ธ
- ํต๊ณ: ์ ์ฒด ๋ถ์ ์, ํ๊ท ์ ์, ๊ฐ์ฅ ๋ง์ ๊ฐ์
- ๋ฐ์ดํฐ ๊ด๋ฆฌ: ์บ์ ์ ๋ฆฌ, ์ ์ฒด ๋ฐ์ดํฐ ์ญ์
- ์ง์: ๋ฌธ์ํ๊ธฐ, ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ๋ฐฉ์นจ, ์คํ์์ค ๋ผ์ด์ ์ค
| ๋ถ์ผ | ๊ธฐ์ |
|---|---|
| ํ๋ซํผ | iOS 16.0+ |
| ์ธ์ด | Swift 5.9+ |
| UI | SwiftUI |
| ์ํคํ ์ฒ | MVVM (Model-View-ViewModel) |
| OCR | Vision Framework (VNRecognizeTextRequest) |
| AI ๋ถ์ | OpenAI API (gpt-4o-mini) |
| ๋ก์ปฌ DB | GRDB.swift |
| Analytics | Firebase Analytics |
| Crash Report | Firebase Crashlytics |
| ์์กด์ฑ ๊ด๋ฆฌ | Swift Package Manager (SPM) |
ToneMeter/
โโโ App/
โ โโโ ToneMeterApp.swift # ์ฑ ์ง์
์
โ โโโ AppDelegate.swift # Firebase ์ด๊ธฐํ
โโโ Models/
โ โโโ EmotionRecord.swift # ๊ฐ์ ๊ธฐ๋ก ๋ชจ๋ธ (GRDB)
โ โโโ ToneAnalysisResult.swift # AI ๋ถ์ ๊ฒฐ๊ณผ ๋ชจ๋ธ
โ โโโ ChatCompletionRequest.swift # OpenAI ์์ฒญ ๋ชจ๋ธ
โ โโโ ChatCompletionResponse.swift# OpenAI ์๋ต ๋ชจ๋ธ
โโโ Services/
โ โโโ Database/
โ โ โโโ DatabaseManager.swift # GRDB ์ด๊ธฐํ & ๋ง์ด๊ทธ๋ ์ด์
โ โ โโโ EmotionRecordRepository.swift # CRUD ๋ฉ์๋
โ โโโ OCR/
โ โ โโโ VisionOCRService.swift # Vision Framework OCR
โ โโโ API/
โ โโโ OpenAIService.swift # OpenAI API ํด๋ผ์ด์ธํธ
โ โโโ APIConfiguration.swift # API ํค ๊ด๋ฆฌ
โโโ ViewModels/
โ โโโ HomeViewModel.swift # ํ ํ๋ฉด ViewModel
โ โโโ AnalysisViewModel.swift # ๋ถ์ ํ๋ฉด ViewModel
โ โโโ HistoryViewModel.swift # ํ์คํ ๋ฆฌ ViewModel
โ โโโ SettingsViewModel.swift # ์ค์ ViewModel
โโโ Views/
โ โโโ Launch/
โ โ โโโ LaunchView.swift # ์คํ๋์ ํ๋ฉด
โ โ โโโ OnboardingView.swift # ์จ๋ณด๋ฉ ํ๋ฉด
โ โโโ Main/
โ โ โโโ ToneMeterTabView.swift # ํญ ๋ฐ (Home/History/Settings)
โ โ โโโ HomeView.swift # ๋ฉ์ธ ํ ํ๋ฉด
โ โโโ Analysis/
โ โ โโโ AnalysisView.swift # ๋ถ์ ์งํ ํ๋ฉด
โ โโโ History/
โ โ โโโ HistoryView.swift # ๊ธฐ๋ก ๋ฆฌ์คํธ
โ โ โโโ DetailView.swift # ์์ธ ๋ณด๊ธฐ
โ โโโ Settings/
โ โ โโโ SettingsView.swift # ์ค์ ํ๋ฉด
โ โ โโโ LicensesView.swift # ๋ผ์ด์ ์ค ํ๋ฉด
โ โโโ Components/
โ โโโ ToneMeterGauge.swift # ๋ฏธํฐ๊ธฐ ์ปดํฌ๋ํธ
โ โโโ EmotionCard.swift # ๊ฐ์ ์นด๋
โ โโโ EmotionChart.swift # ๊ฐ์ ์ฐจํธ
โ โโโ ImagePicker.swift # ์ด๋ฏธ์ง ์ ํ๊ธฐ
โ โโโ ...
โโโ Utilities/
โ โโโ Extensions/
โ โ โโโ Color+Theme.swift # ์์ ํ
๋ง
โ โ โโโ UIImage+.swift # ์ด๋ฏธ์ง ์ ํธ
โ โโโ Enums/
โ โ โโโ AnalysisStep.swift # ๋ถ์ ๋จ๊ณ Enum
โ โ โโโ AnalysisError.swift # ์๋ฌ ํ์
โ โ โโโ ...
โ โโโ Constants.swift # ์ฑ ์์
โ โโโ PermissionManager.swift # ๊ถํ ๊ด๋ฆฌ
โ โโโ UserDefaultsKeys.swift # UserDefaults ํค
โโโ Resources/
โ โโโ Assets.xcassets/ # ์ด๋ฏธ์ง & ์์ด์ฝ
โ โโโ Colors.xcassets/ # ์์ ํ๋ ํธ
โโโ Debug.xcconfig # Debug ๋น๋ ์ค์ (API ํค, Git ๋ฌด์๋จ)
โโโ Release.xcconfig # Release ๋น๋ ์ค์ (API ํค, Git ๋ฌด์๋จ)
โโโ GoogleService-Info.plist # Firebase ์ค์ (Git ๋ฌด์๋จ)
โโโ Info.plist
- macOS: 13.0 (Ventura) ์ด์
- Xcode: 15.0 ์ด์
- iOS ์๋ฎฌ๋ ์ดํฐ ๋๋ ์ค์ ๋๋ฐ์ด์ค: iOS 16.0+
- OpenAI API ํค: OpenAI Platform์์ ๋ฐ๊ธ
- Firebase ํ๋ก์ ํธ: Firebase Console์์ ์์ฑ
git clone https://github.com/YOUR_USERNAME/ToneMeter.git
cd ToneMeterํ๋ก์ ํธ๋ Debug์ Release ํ๊ฒฝ๋ณ๋ก ์ค์ ํ์ผ์ด ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. ToneMeter/ ๋๋ ํ ๋ฆฌ์ ๊ฐ๊ฐ OpenAI API ํค๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
# ToneMeter/Debug.xcconfig ์์ฑ
cat > ToneMeter/Debug.xcconfig << 'EOF'
// Configuration Settings File
DEBUG = true
// OpenAI API Key
OPENAI_API_KEY = sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx
EOF# ToneMeter/Release.xcconfig ์์ฑ
cat > ToneMeter/Release.xcconfig << 'EOF'
// Configuration Settings File
DEBUG = false
// OpenAI API Key
OPENAI_API_KEY = sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx
EOF๋๋ ๊ฐ ํ์ผ์ ์๋์ผ๋ก ์์ฑ:
// ToneMeter/Debug.xcconfig
DEBUG = true
OPENAI_API_KEY = sk-proj-your_api_key_here
// ToneMeter/Release.xcconfig
DEBUG = false
OPENAI_API_KEY = sk-proj-your_api_key_here
๐ก ํ: ๊ฐ๋ฐ ์ค์๋ Debug ๋น๋๊ฐ ์ฌ์ฉ๋๋ฏ๋ก
Debug.xcconfig๋ง ๋จผ์ ์ค์ ํด๋ ๋ฉ๋๋ค.
- Firebase Console์์ ์ ํ๋ก์ ํธ ์์ฑ
- iOS ์ฑ ์ถ๊ฐ (Bundle ID:
com.yourname.ToneMeter) GoogleService-Info.plist๋ค์ด๋ก๋- ๋ค์ด๋ก๋ํ ํ์ผ์
ToneMeter/๋๋ ํ ๋ฆฌ์ ๋ณต์ฌ
cp ~/Downloads/GoogleService-Info.plist ToneMeter/- Firebase Console์์ Analytics์ Crashlytics ํ์ฑํ
Xcode์์ ํ๋ก์ ํธ๋ฅผ ์ด๋ฉด Swift Package Manager๊ฐ ์๋์ผ๋ก ์์กด์ฑ์ ๋ค์ด๋ก๋ํฉ๋๋ค:
open ToneMeter.xcodeproj์์กด์ฑ ๋ชฉ๋ก:
- GRDB.swift - SQLite ORM
- Firebase iOS SDK - Analytics & Crashlytics
์๋ ์ค์น๊ฐ ํ์ํ ๊ฒฝ์ฐ:
- Xcode ๋ฉ๋ด: File > Packages > Resolve Package Versions
- ๋๋ Product > Clean Build Folder ํ ๋ค์ ๋น๋
- Xcode์์ ํ๊ฒ ์ ํ: ToneMeter
- ์๋ฎฌ๋ ์ดํฐ ๋๋ ์ค์ ๋๋ฐ์ด์ค ์ ํ
Cmd + R๋๋โถ๏ธ ๋ฒํผ ํด๋ฆญ
# Debug ๋น๋
xcodebuild -project ToneMeter.xcodeproj \
-scheme ToneMeter \
-configuration Debug \
-destination 'platform=iOS Simulator,name=iPhone 15 Pro'
# Release ๋น๋
xcodebuild -project ToneMeter.xcodeproj \
-scheme ToneMeter \
-configuration Release \
-destination 'platform=iOS Simulator,name=iPhone 15 Pro'Debug.xcconfig,Release.xcconfig,GoogleService-Info.plist๋.gitignore์ ํฌํจ๋์ด ์์ต๋๋ค- API ํค๋ฅผ ์ ๋ ๊ณต๊ฐ ์ ์ฅ์์ ์ปค๋ฐํ์ง ๋ง์ธ์
- OpenAI API๋ ์ ๋ฃ์ด๋ฏ๋ก ์ฌ์ฉ๋ ์ ํ์ ์ค์ ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค
- Debug์ Release ํ๊ฒฝ์์ ์๋ก ๋ค๋ฅธ API ํค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ ํ์ผ์ ๋ค๋ฅธ ํค๋ฅผ ์ค์ ํ์ธ์
- ์ฑ์ ์ฒ์ ์คํํ๋ฉด ๊ธฐ๋ฅ ์๊ฐ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค
- "๊ถํ ํ์ฉํ๊ณ ์์ํ๊ธฐ" ๋ฒํผ์ ๋๋ฌ ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ถํ์ ํ์ฉํฉ๋๋ค
- ํ ํ๋ฉด์์ "์ด๋ฏธ์ง๋ก ๋ถ์ํ๊ธฐ" ๋ฒํผ ํด๋ฆญ
- ๋ํ ์คํฌ๋ฆฐ์ท์ ์ ํํฉ๋๋ค (๊ฐค๋ฌ๋ฆฌ ๋๋ ์นด๋ฉ๋ผ)
- OCR ์งํ โ ํ ์คํธ ์ธ์ (์ฝ 1์ด)
- AI ๋ถ์ ์ค โ ๊ฐ์ ํค ๋ถ์ (์ฝ 1.5์ด)
- ๊ฒฐ๊ณผ ํ๋ฉด ํ์ธ:
- ๊ฐ์ ์ ์ (0~100)
- ๊ฐ์ ๋ ์ด๋ธ (๊ธ์ /์ค๋ฆฝ/๋ถ์ )
- ์ฃผ์ ํค์๋
- ๋ถ์ ๊ทผ๊ฑฐ
- History ํญ์์ ๋ชจ๋ ๋ถ์ ๊ธฐ๋ก ํ์ธ
- ํํฐ: ์ ์ฒด, ๊ธ์ , ์ค๋ฆฝ, ๋ถ์ , ์ค๋, ์ด๋ฒ์ฃผ
- ์ ๋ ฌ: ์ต์ ์, ์ ์์
- ๊ธฐ๋ก์ ํญํ๋ฉด ์์ธ ํ๋ฉด์ผ๋ก ์ด๋
- Settings ํญ์์ ์ฑ ์ค์ ๊ด๋ฆฌ
- ํต๊ณ: ์ ์ฒด ๋ถ์ ์, ํ๊ท ์ ์, ๊ฐ์ฅ ๋ง์ ๊ฐ์
- ๋ฐ์ดํฐ ๊ด๋ฆฌ: ์บ์ ์ ๋ฆฌ, ์ ์ฒด ๋ฐ์ดํฐ ์ญ์
- ๋ฌธ์ํ๊ธฐ: ์ด๋ฉ์ผ๋ก ๋ฌธ์ (tonemeter@example.com)
ํ๋ก์ ํธ์ ์์ ์ฑ๊ณผ ํ์ง์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ํ ํ ์คํธ๋ฅผ ์ํํ์ต๋๋ค.
| ํ ์คํธ ์ข ๋ฅ | ๋ฌธ์ | ์ฃผ์ ๋ด์ฉ |
|---|---|---|
| ๋ฐ์ดํฐ ๋ ์ด์ด | Data-Layer-Test-Report.md | GRDB CRUD ์ฐ์ฐ, ํธ๋์ญ์ ์ฒ๋ฆฌ |
| OCR ์๋น์ค | OCR-Service-Test-Report.md | Vision Framework ํ ์คํธ ์ธ์ ์ ํ๋ (~89%) |
| API ์๋น์ค | API-Service-Test-Report.md | OpenAI API ํตํฉ, ์๋ฌ ํธ๋ค๋ง |
| ViewModel | ViewModel-Implementation-Test-Report.md | ๋น์ฆ๋์ค ๋ก์ง, ์ํ ๊ด๋ฆฌ |
| E2E ํตํฉ | Full-Flow-Integration-Test-Report.md | ์ด๋ฏธ์ง ์ ํ โ OCR โ AI ๋ถ์ โ ์ ์ฅ ์ ์ฒด ํ๋ก์ฐ |
- โ OCR ์ ํ๋: 89% (ํ๊ธ/์์ด ํผํฉ ๋ํ ๊ธฐ์ค)
- โ ํ๊ท ์๋ต ์๊ฐ: 2.6์ด (OCR 1์ด + AI ๋ถ์ 1.5์ด)
- โ ๋ฐ์ดํฐ๋ฒ ์ด์ค: 1000+ ๋ ์ฝ๋ CRUD ํ ์คํธ ํต๊ณผ
- โ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ: ํ๊ท 45MB, ํผํฌ 80MB
- โ ํฌ๋์ ์์: 50+ ์๋๋ฆฌ์ค ํ ์คํธ
ToneMeter๋ ํต์ผ๋ ์์ ํ ๋ง๋ฅผ ์ฌ์ฉํฉ๋๋ค:
| ์์ | ์ฉ๋ | Light ๋ชจ๋ | Dark ๋ชจ๋ |
|---|---|---|---|
| Primary | ๋ฉ์ธ ๋ธ๋๋ ์์ | #007AFF |
#0A84FF |
| Accent Positive | ๊ธ์ ๊ฐ์ | #34C759 |
#30D158 |
| Accent Neutral | ์ค๋ฆฝ ๊ฐ์ | #FFCC00 |
#FFD60A |
| Accent Negative | ๋ถ์ ๊ฐ์ | #FF3B30 |
#FF453A |
| Background | ๋ฐฐ๊ฒฝ | #F2F2F7 |
#000000 |
| Surface | ์นด๋ ๋ฐฐ๊ฒฝ | #FFFFFF |
#1C1C1E |
- ToneMeterGauge: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฏธํฐ๊ธฐ (ํฌ๊ธฐ, ์์ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ)
- EmotionCard: ์ ๋ณด ํ์ ์นด๋
- EmotionChart: ๋ง๋ ์ฐจํธ (Swift Charts)
@Published์ Combine์ ํ์ฉํ ๋ฐ์ํ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ- ViewModel ๋ ์ด์ด์์ ๋น์ฆ๋์ค ๋ก์ง ๋ถ๋ฆฌ
- ํ ์คํธ ๊ฐ๋ฅํ ๊ตฌ์กฐ ์ค๊ณ
VNRecognizeTextRequest๋ก ํ๊ธ/์์ด ๋์ ์ธ์- ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ๋ฅผ ํตํ ์ธ์๋ฅ ํฅ์ (89% ๋ฌ์ฑ)
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก UI ๋ธ๋กํน ๋ฐฉ์ง
- Structured Output (JSON Schema)์ผ๋ก ์ผ๊ด๋ ์๋ต ๋ณด์ฅ
- ์ปค์คํ ํ๋กฌํํธ ์์ง๋์ด๋ง์ผ๋ก ์ ํ๋ ๊ฐ์
- ์๋ฌ ํธ๋ค๋ง ๋ฐ ์ฌ์๋ ๋ก์ง ๊ตฌํ
- SQLite ๊ธฐ๋ฐ ๋ก์ปฌ ๋ฐ์ดํฐ ์ ์ฅ
- ๋ง์ด๊ทธ๋ ์ด์ ์์คํ ์ผ๋ก ์คํค๋ง ๋ณ๊ฒฝ ๊ด๋ฆฌ
- FetchedRecordsController๋ก ์ค์๊ฐ UI ์ ๋ฐ์ดํธ
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ToneMeterGauge (๊ฒ์ด์ง ์ ๋๋ฉ์ด์ )
- Dark Mode ์๋ ์ง์
- Analytics๋ก ์ฌ์ฉ์ ํ๋ ๋ถ์
- Crashlytics๋ก ์ค์๊ฐ ์๋ฌ ์ถ์
- Remote Config ์ค๋น (ํฅํ A/B ํ ์คํธ์ฉ)
์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๋ง์ฃผํ ๊ธฐ์ ์ ๊ณ ๋ฏผ, ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด ์ ๋ค์ ์ ๋ฆฌํ์ต๋๋ค.
- OCR ์์ง ์ ํ: Vision Framework vs Tesseract
- ๊ฒฐ๊ณผ: Vision Framework ์ ํ (ํ๊ธ ์ธ์๋ฅ 89% vs 74%)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ: Core Data vs GRDB
- ๊ฒฐ๊ณผ: GRDB ์ ํ (์ฟผ๋ฆฌ ์ฑ๋ฅ 50% ์ฐ์, ๋ง์ด๊ทธ๋ ์ด์ ๋ช ํ)
- AI ๋ชจ๋ธ ์ ํ: GPT-4o vs GPT-4o-mini
- ๊ฒฐ๊ณผ: GPT-4o-mini ์ ํ (๋น์ฉ 25๋ฐฐ ์ ๋ ด, ์ ํ๋ 94%)
- ์ํคํ
์ฒ ํจํด: MVC vs MVVM vs TCA
- ๊ฒฐ๊ณผ: MVVM ์ ํ (ํ ์คํธ ๊ฐ๋ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ท ํ)
- OCR์ด ๋งํ์ UI๋ฅผ ํ
์คํธ๋ก ์ค์ธ์
- ๋งํ์ ํ ๋๋ฆฌ "( ์์๋ง", ์ด๋ชจ์ง "o" ์ค์ธ์ ๋ฐ์
- AI๊ฐ ๋ ธ์ด์ฆ๋ฅผ ์๋ ํํฐ๋งํ์ฌ ๊ฐ์ ๋ถ์์๋ ์ํฅ ์์ (์ ํ๋ 89% ์ ์ง)
- OpenAI API ์๋ต ํ์ฑ ์คํจ
- Structured Output (JSON Schema) ํ์ฉ์ผ๋ก ์ฑ๊ณต๋ฅ 100% ๋ฌ์ฑ
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์
- UIImage ๊ฐํ ์ฐธ์กฐ ํด์ ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ 200MB โ 80MB ๊ฐ์
- API ๋น์ฉ ์ต์ ํ (์ด๋ฏธ์ง ํด์ ๊ธฐ๋ฐ ์บ์ฑ)
- ์คํ๋ผ์ธ ๋ชจ๋ ์ง์ (CoreML ํ์ฉ)
- ํ ์คํธ ์๋ํ ๋ฐ CI/CD ํ์ดํ๋ผ์ธ
- ์ ๊ทผ์ฑ(Accessibility) ๊ฐ์
๊ธฐ์ ์ ํ์ ๊ทผ๊ฑฐ, ์ค์ ์ฝ๋ ์์, ์ฑ๋ฅ ๋น๊ต ๋ฐ์ดํฐ, ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ์์ธ ๋ด์ฉ์ ์๋ ๋งํฌ์์ ํ์ธํ์ค ์ ์์ต๋๋ค:
๐ก ํ๊ณ ๋ฌธ์์๋ ๊ฐ ๊ธฐ์ ์ ํ์ ์์ฌ๊ฒฐ์ ๊ณผ์ , Before/After ์ฝ๋ ๋น๊ต, ์ฑ๋ฅ ์ธก์ ๊ฒฐ๊ณผ, App Store ์ฌ์ฌ ์ ์ถ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ํฅํ ๊ฐ์ ๊ณํ์ด ์ฒดํฌ๋ฆฌ์คํธ์ ํจ๊ป ์์ธํ ์์ฑ๋์ด ์์ต๋๋ค.
- Email: chicazic@gmail.com
- Apple: Vision Framework, SwiftUI
- OpenAI: GPT-4o-mini API
- Firebase: Analytics & Crashlytics
- GRDB.swift: ๊ฐ๋ ฅํ SQLite ORM
์ด ํ๋ก์ ํธ์ ๋ํ ํผ๋๋ฐฑ์ด๋ ์ ์์ฌํญ์ด ์์ผ์๋ฉด ์ธ์ ๋ ์ง ์ฐ๋ฝ์ฃผ์ธ์!
- Issues: ๋ฒ๊ทธ ๋ฆฌํฌํธ ๋๋ ๊ธฐ๋ฅ ์ ์
- Pull Requests: ์ฝ๋ ๊ฐ์ ์ ์ ํ์
- Email: chicazic@gmail.com
