μΌμ κΈ°μ μ λ§₯μΌλ‘, νμΈμ μμ΄ν°μΌλ‘ ν΄λ³΄κ³ μΆμ§ μμΌμ κ°μ? dgmemoμ μΌμ , μκ°λλ κ², μ 무 λ± λͺ¨λ κ²μ κΈ°λ‘ν΄λ³΄μΈμ. μ νμ λͺ¨λ λλ°μ΄μ€μ μ°λλ©λλ€.
β
Create, edit, and organize memos - κ°λ¨νκ³ μ§κ΄μ μΈ λ©λͺ¨(νμ€ν¬) κ΄λ¦¬ νλ‘κ·Έλ¨
β
iCloud sync - λͺ¨λ apple λλ°μ΄μ€μμ μ κ·Ό κ°λ₯ν μ€κ³
β
Calendar integration - μ ν μΊλ¦°λμμ μλ μ°λ
π» Download on the Mac App Store
dgmemoμ macOS λ²μ μ νμ¬ μ±μ€ν μ΄μμ νμΈ κ°λ₯ν©λλ€!
- π» Native macOS interface - macOS κ°μ΄λλΌμΈμ μ€μνμ¬ κΉλν λμμΈμ μΆκ΅¬ν©λλ€.
- π Seamless iCloud sync - λΉμ μ λͺ¨λ λ©λͺ¨λ λ§₯, μμ΄ν°, μμ΄ν¨λμμ λ°μ΄ν°κ° νΈνλ©λλ€.
- π Calendar integration - μΊλ¦°λμ μλμΌλ‘ μ°λλλ λ°μ΄ν°
π± Download on the App Store
dgmemoμ iOS λ²μ μ νμ¬ μ±μ€ν μ΄μμ νμΈ κ°λ₯ν©λλ€!
- π± Native iOS interface - λ§₯ λ²μ μ λμμΈμ μ¬νμ©νμ§ μμμ΅λλ€. iPhoneμ μ΅μ νλ λμμΈμΌλ‘ λ°λ‘ κ°λ°νμμ΅λλ€.
- π Seamless iCloud sync - λΉμ μ λͺ¨λ λ©λͺ¨λ λ§₯, μμ΄ν°, μμ΄ν¨λμμ λ°μ΄ν°κ° νΈνλ©λλ€.
- π Calendar integration - μΊλ¦°λμ μλμΌλ‘ μ°λλλ λ°μ΄ν°
- Automatic sync: Due dateλ₯Ό μ€μ νλ©΄ μλμΌλ‘ μ ν μΊλ¦°λμ κΈ°μ λ©λλ€
- Permission required: μ± μ²« μ€νμ μΊλ¦°λ μ κ·Όμ λμν΄μ£ΌμΈμ
- Smart updates: λ©λͺ¨μ μ λͺ©, 컨ν μΈ , μΌμ λ³κ²½μ λ°λΌμ μλμΌλ‘ μΊλ¦°λ λ°μ΄ν°λ μ λ°μ΄νΈ λ©λλ€
- βN - New memo (opens in separate window)
- Return - Move from title to contents when editing
- SwiftUI - Modern UI framework
- SwiftData - Persistence with schema migration + CloudKit sync
- EventKit - Calendar integration for due date reminders
- Factory - Dependency injection framework
- Tuist - Project generation and dependency management
- Fastlane - Automated build and release pipeline
- CloudKit λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©ν΄μ κ°λ°νμ΅λλ€. Appleμ iCloud κΈ°λ°μΌλ‘ λμνκΈ° λλ¬Έμ 보μμ μΌλ‘ μ·¨μ½νμ§ μκ³ μ ν μνκ³μ λͺ¨λ λλ°μ΄μ€μμ μμ°μ€λ½κ² κ°μ λ°μ΄ν°μ μ κ·Όμ΄ κ°λ₯ν©λλ€. λν SwiftDataλ₯Ό μ΄μ©ν΄μ λ‘컬 λλΉμμ μμ°μ€λ¬μ΄ νΈν ν¨κ³Όλ₯Ό κΈ°λνκ³ κ°λ¨νκ² κ΅¬νν μ μμ΅λλ€.
μμ‘΄μ±μ μ΅λλ‘ μ€μ¬ μ± μΈλΆμ λ³νλ‘λΆν° μν₯μ λ°μ§ μκ²λ μ€κ³ν©λλ€. ꡬν체λ λͺ¨λ μ¨κΈ°κ³ νλλ§ μ μνμ¬ μ»¨ν μ€νΈμ λ°λΌμ νμν ꡬν체λ€μ μ£Όμ ν μ μκ²λ μ λ°μ μΌλ‘ μ±μ μ€κ³ν©λλ€.
- Entity - App λ΄μμ νμν κ°μ²΄λ€μ λͺ¨λΈμ μ μν©λλ€.
- Repository - λ°μ΄ν°μ μ κ·Όν©λλ€.
- Service - μΊλ¦°λ, νΈμ¬λ Έν°νΌμΌμ΄μ λ± μΈλΆ μλΉμ€μμ ν΅ν©μ μν΄ μ μν©λλ€.
- UseCase - Repositoryμ Serviceλ€μ μ‘°ν©νμ¬ νλμ μκ²°λ λΉμ¦λμ€ λ‘μ§μ μνν©λλ€.
μ€μ λ΄λΆ λ°μ΄ν°λ² μ΄μ€ νΉμ μΈλΆ μλΉμ€μ ν΅ν©νμ¬ λ°μ΄ν°λ₯Ό λ³κ²½, μ κ·Όνλ νλμ λν λͺ¨λ ꡬνμ λ΄λΉν©λλ€.
κ°μ₯ μ΅μλ¨ λ μ΄μ΄λ‘ μ€μ μ μ μ λ§λΏμμκ³ μ΄ν리μΌμ΄μ κ·Έ μ체μ λλ€. μ μ μμ μνΈμμ©μ΄λ μ± μμ€μ μ΄λ²€νΈλ±μ μμλ°κ³ λμν©λλ€.
- Container λ΄λΆμ κ° νμ λ³λ‘ μμ‘΄μ±μ λ±λ‘ν΄μ€λλ€. μ΄λμ, μ±μ΄ μ€νλλ contextμ λ§μΆμ΄μ λ€λ₯Έ ꡬν체λ€μ μ£Όμ ν΄μ€ μ μμ΅λλ€. ViewModel μμλ Container λ₯Ό ν΅ν΄ λ±λ‘λ ꡬν체λ€μ μ¬μ©νλ©΄ μμ±μλ₯Ό λλ½νμ§ μμΌλ©΄μλ context μ λ§κ² Impl ꡬν체, Mock ꡬν체 λ±μ μμμ μ£Όμ λ°μ μ μκ² λμ΄μ Preview, Test μμ± λ±μ μ 리ν©λλ€.
- μμ‘΄μ±μ μμ±μλ₯Ό ν΅ν΄μ μ§μ μ£Όμ λ°μ§ μκΈ° λλ¬Έμ μ½λκ° μ§μ λΆν΄μ§κ³ , μμ λ³κ²½ μ¬νμλ code changes κ° λ§μμ§λ Dependency Drilling μ λ°©μ§ν΄ μ€ μ μμ΅λλ€.
- κΈ°μ‘΄ μ½λκ° Service Locator Pattern μ μ€μνκ³ μλ€κ³ ν΄μ μμΌλ‘μ μ½λ μμ±μ νμ @Injected annotationμ μ¬μ©ν νμλ μμ΅λλ€. μν©μ λ°λΌ νμνλ€λ©΄ μ λμ μΌλ‘ μμ‘΄μ±μ μ§μ μ£Όμ λ°κ² λ§λ€μ΄μ€λλ€.
NavigationStackμ pathμ μ§μ μ κ·Όνμ¬ μ±μ λ€λΉκ²μ΄ν μ κ΄λ¦¬ν΄μ€λλ€. Appμμ EnvironmentObjectλ‘ λ±λ‘ν΄μ£ΌκΈ° λλ¬Έμ Depth κ° κΉμ μ»΄ν¬λνΈλ€μμλ λ°λ‘ μ§μ μ κ·Όμ΄ κ°λ₯ν©λλ€.
μ±κ³Ό κ·Έ μ΄λ ν μμ‘΄μ±λ μκΈ°μ§ μκ³ pure ν String κ° λ§μΌλ‘ μ±μ λ€λΉκ²μ΄μ μ μ‘°μν μ μκ² λμμ€λλ€. Widget, Push Notification, DeepLink λ± νμ©μ±μ΄ λ§€μ° λ²μ©μ μ λλ€.
μ±μ ν΅μ¬ λλ©μΈ λͺ¨λΈμ λλ€. μ¬μ©μκ° μμ±νλ λ©λͺ¨(νμ€ν¬)μ λͺ¨λ μ 보λ₯Ό λ΄κ³ μμ΅λλ€.
| νλ‘νΌν° | νμ | μ€λͺ |
|---|---|---|
id |
String | κ³ μ μλ³μ |
title |
String | λ©λͺ¨ μ λͺ© |
contents |
String? | λ©λͺ¨ λ΄μ© (λ§ν¬λ€μ΄ μ§μ) |
due |
Date? | λ§κ°μΌ |
done |
Bool | μλ£ μ¬λΆ |
eventIdentifier |
String? | μ°λλ μΊλ¦°λ μ΄λ²€νΈ ID |
createdAt |
Date | μμ±μΌ |
updatedAt |
Date | μμ μΌ |
images |
[ImageAttachment] | μ²¨λΆ μ΄λ―Έμ§ λͺ©λ‘ |
Computed Properties:
isUrgent- λ§κ°μΌμ΄ 3μΌ μ΄λ΄μ΄κ³ λ―Έμλ£μΈ κ²½μ°trueisOverDue- λ§κ°μΌμ΄ μ§λ κ²½μ°true
μΊλ¦°λ λ·°μμ νΉμ λ μ§μ λ©λͺ¨λ₯Ό λ§€ννκΈ° μν λͺ¨λΈμ λλ€.
| νλ‘νΌν° | νμ | μ€λͺ |
|---|---|---|
year |
Int | μ°λ |
month |
Int | μ |
day |
Int | μΌ |
memo |
Memo | ν΄λΉ λ μ§μ λ©λͺ¨ |
μ¬μ©μ μ€μ λ° μ± μνλ₯Ό μ μ₯νκ³ λΆλ¬μ€λ μΈν°νμ΄μ€μ λλ€. UserDefaultsλ₯Ό ν΅ν΄ μμνλ©λλ€.
| λ©μλ | μ€λͺ |
|---|---|
getMemoSort() / setMemoSort(_:) |
λ©λͺ¨ μ λ ¬ κΈ°μ€ (μμ±μΌ/μμ μΌ/λ§κ°μΌ) |
getAscending() / setAscending(_:) |
μ λ ¬ μμ (μ€λ¦μ°¨μ/λ΄λ¦Όμ°¨μ) |
getStatistics() / setStatistics(_:) |
ν΅κ³ λ·° νμ |
getMemoSortCacheInSearch() / setMemoSortCacheInSearch(_:) |
κ²μ νλ©΄ μ λ ¬ κΈ°μ€ μΊμ |
getMemoSearchQuery() / setMemoSearchQuery(_:) |
κ²μμ΄ μΊμ |
getSelectedMemoId() / setSelectedMemoId(_:) |
μ νλ λ©λͺ¨ ID |
getMemoDraft() / setMemoDraft(_:) |
μμ± μ€μΈ λ©λͺ¨ μμ μ μ₯ |
getAppTabEnum() / setAppTabEnum(_:) |
νμ¬ μ νλ ν |
getCalendarDotVisibleMode() / setCalendarDotVisibleMode(_:) |
μΊλ¦°λ dot νμ λͺ¨λ |
λ©λͺ¨ λ°μ΄ν°μ CRUD λ° μ‘°νλ₯Ό λ΄λΉνλ μΈν°νμ΄μ€μ λλ€. SwiftDataλ₯Ό ν΅ν΄ μμνλλ©°, iCloudλ₯Ό ν΅ν΄ κΈ°κΈ° κ° λκΈ°νλ©λλ€.
- Xcode 26.0+
- Tuist 4.0+
- macOS 15.0+
# Clone the repository
git clone https://github.com/donggyushin/macmo.git
cd macmo
# Generate Xcode project
tuist generate
# Open in Xcode
open macmo.xcworkspacetuist generate
[bundle exec] fastlane mac release
[bundle exec] fastlane ios releaseContributions are welcome! Please feel free to submit a Pull Request.
- 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
- Local storage - All data stored locally on your device
- iCloud sync - Data synced through your personal iCloud account
- Calendar privacy - Calendar access only used for syncing your memos, no data sharing
- No tracking - No analytics or user tracking
- Open source - Full source code available for review
- Issues - GitHub Issues
- Discussions - GitHub Discussions
Donggyu Shin - @donggyushin
β Star this repository if you found it helpful! β