Skip to content

HenryVoid/ToneMeter-AI

Repository files navigation

๐ŸŽญ ToneMeter

๋Œ€ํ™”์˜ ๊ฐ์ • ํ†ค์„ AI๋กœ ๋ถ„์„ํ•˜๋Š” iOS ์•ฑ
Apple Vision Framework OCR + OpenAI GPT-4o-mini + SwiftUI

iOS Swift SwiftUI

ToneMeter Demo GIF

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์ดˆ

๐ŸŽจ ์•„๋ฆ„๋‹ค์šด UI/UX

  • ๊ฐ์ • ๋ฏธํ„ฐ๊ธฐ: ์ ์ˆ˜์— ๋”ฐ๋ฅธ ๊ทธ๋ผ๋ฐ์ด์…˜ ๊ฒŒ์ด์ง€ (๊ธ์ •/์ค‘๋ฆฝ/๋ถ€์ •)
  • ๊ฐ์ • ์นด๋“œ: ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œ
  • ๋‹คํฌ ๋ชจ๋“œ: ์ž๋™ ์ง€์›

๐Ÿ“Š ๊ธฐ๋ก ๊ด€๋ฆฌ

  • ๋ถ„์„ ํžˆ์Šคํ† ๋ฆฌ: ๋ชจ๋“  ๋ถ„์„ ๊ธฐ๋ก์„ ๋กœ์ปฌ 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์—์„œ ์ƒ์„ฑ

๐Ÿ“ฅ 1. ํ”„๋กœ์ ํŠธ ํด๋ก 

git clone https://github.com/YOUR_USERNAME/ToneMeter.git
cd ToneMeter

๐Ÿ”ง 2. API ํ‚ค ์„ค์ •

ํ”„๋กœ์ ํŠธ๋Š” Debug์™€ Release ํ™˜๊ฒฝ๋ณ„๋กœ ์„ค์ • ํŒŒ์ผ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ToneMeter/ ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐ๊ฐ OpenAI API ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Debug.xcconfig ์„ค์ •

# ToneMeter/Debug.xcconfig ์ƒ์„ฑ
cat > ToneMeter/Debug.xcconfig << 'EOF'
// Configuration Settings File
DEBUG = true

// OpenAI API Key
OPENAI_API_KEY = sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx
EOF

Release.xcconfig ์„ค์ •

# 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๋งŒ ๋จผ์ € ์„ค์ •ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ 3. Firebase ์„ค์ •

  1. Firebase Console์—์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  2. iOS ์•ฑ ์ถ”๊ฐ€ (Bundle ID: com.yourname.ToneMeter)
  3. GoogleService-Info.plist ๋‹ค์šด๋กœ๋“œ
  4. ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ToneMeter/ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ
cp ~/Downloads/GoogleService-Info.plist ToneMeter/
  1. Firebase Console์—์„œ Analytics์™€ Crashlytics ํ™œ์„ฑํ™”

๐Ÿ“ฆ 4. ์˜์กด์„ฑ ์„ค์น˜

Xcode์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๋ฉด Swift Package Manager๊ฐ€ ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค:

open ToneMeter.xcodeproj

์˜์กด์„ฑ ๋ชฉ๋ก:

์ˆ˜๋™ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ:

  1. Xcode ๋ฉ”๋‰ด: File > Packages > Resolve Package Versions
  2. ๋˜๋Š” Product > Clean Build Folder ํ›„ ๋‹ค์‹œ ๋นŒ๋“œ

โ–ถ๏ธ 5. ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

Xcode์—์„œ ์‹คํ–‰

  1. Xcode์—์„œ ํƒ€๊ฒŸ ์„ ํƒ: ToneMeter
  2. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋˜๋Š” ์‹ค์ œ ๋””๋ฐ”์ด์Šค ์„ ํƒ
  3. 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 ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ฐ ํŒŒ์ผ์— ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์„ค์ •ํ•˜์„ธ์š”

๐Ÿ“– ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์˜จ๋ณด๋”ฉ

  • ์•ฑ์„ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋Šฅ ์†Œ๊ฐœ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค
  • "๊ถŒํ•œ ํ—ˆ์šฉํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์‚ฌ์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค

2๏ธโƒฃ ์ด๋ฏธ์ง€ ๋ถ„์„

  1. ํ™ˆ ํ™”๋ฉด์—์„œ "์ด๋ฏธ์ง€๋กœ ๋ถ„์„ํ•˜๊ธฐ" ๋ฒ„ํŠผ ํด๋ฆญ
  2. ๋Œ€ํ™” ์Šคํฌ๋ฆฐ์ƒท์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค (๊ฐค๋Ÿฌ๋ฆฌ ๋˜๋Š” ์นด๋ฉ”๋ผ)
  3. OCR ์ง„ํ–‰ โ†’ ํ…์ŠคํŠธ ์ธ์‹ (์•ฝ 1์ดˆ)
  4. AI ๋ถ„์„ ์ค‘ โ†’ ๊ฐ์ • ํ†ค ๋ถ„์„ (์•ฝ 1.5์ดˆ)
  5. ๊ฒฐ๊ณผ ํ™”๋ฉด ํ™•์ธ:
    • ๊ฐ์ • ์ ์ˆ˜ (0~100)
    • ๊ฐ์ • ๋ ˆ์ด๋ธ” (๊ธ์ •/์ค‘๋ฆฝ/๋ถ€์ •)
    • ์ฃผ์š” ํ‚ค์›Œ๋“œ
    • ๋ถ„์„ ๊ทผ๊ฑฐ

3๏ธโƒฃ ๊ธฐ๋ก ๋ณด๊ธฐ

  • History ํƒญ์—์„œ ๋ชจ๋“  ๋ถ„์„ ๊ธฐ๋ก ํ™•์ธ
  • ํ•„ํ„ฐ: ์ „์ฒด, ๊ธ์ •, ์ค‘๋ฆฝ, ๋ถ€์ •, ์˜ค๋Š˜, ์ด๋ฒˆ์ฃผ
  • ์ •๋ ฌ: ์ตœ์‹ ์ˆœ, ์ ์ˆ˜์ˆœ
  • ๊ธฐ๋ก์„ ํƒญํ•˜๋ฉด ์ƒ์„ธ ํ™”๋ฉด์œผ๋กœ ์ด๋™

4๏ธโƒฃ ์„ค์ •

  • 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)

๐Ÿ’ก ๊ธฐ์ˆ ์  ํ•˜์ด๋ผ์ดํŠธ

1. MVVM ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„

  • @Published์™€ Combine์„ ํ™œ์šฉํ•œ ๋ฐ˜์‘ํ˜• ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ
  • ViewModel ๋ ˆ์ด์–ด์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ
  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ์„ค๊ณ„

2. Vision Framework OCR ์ตœ์ ํ™”

  • VNRecognizeTextRequest๋กœ ํ•œ๊ธ€/์˜์–ด ๋™์‹œ ์ธ์‹
  • ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์ธ์‹๋ฅ  ํ–ฅ์ƒ (89% ๋‹ฌ์„ฑ)
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ UI ๋ธ”๋กœํ‚น ๋ฐฉ์ง€

3. OpenAI API ํ†ตํ•ฉ

  • Structured Output (JSON Schema)์œผ๋กœ ์ผ๊ด€๋œ ์‘๋‹ต ๋ณด์žฅ
  • ์ปค์Šคํ…€ ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ •ํ™•๋„ ๊ฐœ์„ 
  • ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋ฐ ์žฌ์‹œ๋„ ๋กœ์ง ๊ตฌํ˜„

4. GRDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„

  • SQLite ๊ธฐ๋ฐ˜ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ ์ €์žฅ
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ์Šคํ…œ์œผ๋กœ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ๊ด€๋ฆฌ
  • FetchedRecordsController๋กœ ์‹ค์‹œ๊ฐ„ UI ์—…๋ฐ์ดํŠธ

5. SwiftUI ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ

  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ToneMeterGauge (๊ฒŒ์ด์ง€ ์• ๋‹ˆ๋ฉ”์ด์…˜)
  • Dark Mode ์ž๋™ ์ง€์›

6. Firebase ๋ชจ๋‹ˆํ„ฐ๋ง

  • 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 ์‹ฌ์‚ฌ ์ œ์ถœ ๊ณผ์ •, ๊ทธ๋ฆฌ๊ณ  ํ–ฅํ›„ ๊ฐœ์„  ๊ณ„ํš์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ์™€ ํ•จ๊ป˜ ์ƒ์„ธํžˆ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ง ์—ฐ๋ฝ์ฒ˜


๐Ÿ™ ๊ฐ์‚ฌ

  • Apple: Vision Framework, SwiftUI
  • OpenAI: GPT-4o-mini API
  • Firebase: Analytics & Crashlytics
  • GRDB.swift: ๊ฐ•๋ ฅํ•œ SQLite ORM

๐ŸŒŸ ๊ธฐ์—ฌ ๋ฐ ํ”ผ๋“œ๋ฐฑ

์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์ด๋‚˜ ์ œ์•ˆ์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ์—ฐ๋ฝ์ฃผ์„ธ์š”!

  • Issues: ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ ๋˜๋Š” ๊ธฐ๋Šฅ ์ œ์•ˆ
  • Pull Requests: ์ฝ”๋“œ ๊ฐœ์„  ์ œ์•ˆ ํ™˜์˜
  • Email: chicazic@gmail.com

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages