🧱 1️⃣ 전체 구조
📁 LemonLog
┣ 📂 Application
┃ ┣ AppDelegate.swift
┃ ┗ SceneDelegate.swift
┣ 📂 Model
┣ 📂 View
┣ 📂 ViewController
┣ 📂 ViewModel
┣ 📂 CoreData
┣ 📂 Firebase
┣ 📂 Resource
┃ ┣ Assets.xcassets
┃ ┗ LaunchScreen.storyboard
┗ 📂 Utils
🎯 2️⃣ 폴더별 역할 설명
📂 Application
앱의 “시작점”과 생명주기를 관리하는 핵심 폴더입니다.
AppDelegate.swift → 앱 전체의 설정, 초기화, 백그라운드 관리
SceneDelegate.swift → 루트 뷰를 설정하고, 앱의 윈도우 흐름 제어
💡 Firebase 초기화, 푸시 알림 등록 등은 나중에 AppDelegate에서 추가 예정.
📂 Model
앱에서 사용하는 데이터 구조를 정의하는 폴더입니다.
EmotionDiary.swift, User.swift 등
CoreData Entity와 대응되는 구조체 포함
📂 View
화면 구성 요소 중 재사용 가능한 UI 컴포넌트를 관리합니다.
예: 커스텀 셀, 버튼, 뷰 등
DiaryCell.swift
EmotionButton.swift
📂 ViewController
UIKit 기반 프로젝트에서는 필수 폴더입니다.
MVVM 구조에서 ViewController는 View와 ViewModel을 연결하는 역할을 합니다.
HomeViewController.swift
DiaryViewController.swift
📂 ViewModel
데이터 로직을 처리하고 View와 바인딩하는 계층입니다.
HomeViewModel.swift
DiaryViewModel.swift
💡 Firebase와 CoreData의 중간 역할을 하는 ViewModel은 이곳에 추가됩니다.
📂 CoreData
로컬 데이터 저장용 파일을 관리하는 폴더입니다.
CoreDataManager.swift
EmotionDiaryEntity+CoreDataProperties.swift
📂 Firebase
나중에 서버 동기화, 사용자 인증, 감정일기 공유 기능을 추가할 때 사용할 폴더입니다.
현재는 폴더만 만들어두고, 이후에 .gitkeep 파일을 넣어 관리해도 됩니다.
FirebaseManager.swift
FirestoreService.swift
📂 Resource
앱의 모든 정적 리소스를 관리하는 폴더입니다.
Assets.xcassets : 이미지, 색상, 앱 아이콘 관리
LaunchScreen.storyboard : 앱 실행 시 표시되는 런치 화면
💡 Info.plist는 기본적으로 루트에 두지만, Resource로 옮겨도 무방합니다.
📂 Utils (선택)
공용 유틸리티, 익스텐션, 헬퍼 클래스를 관리합니다.
UIColor+Extension.swift
DateFormatter+Helper.swift
🪄 3️⃣ 폴더 구성 이유
| 폴더 | 핵심 | 역할 이유 |
| Application | 앱 생명주기 제어 | 전역 설정 코드 집중 관리 |
| Model / View / ViewModel | MVVM 구조 | 역할 분리로 유지보수성 향상 |
| ViewController | UIKit 전용 구조 | View-ViewModel 연결 중심 |
| CoreData | 로컬 데이터 | 오프라인 저장 기능 |
| Firebase | 서버 동기화 | 커뮤니티/백업 기능 확장성 확보 |
| Resource | 정적 리소스 | 색상, 이미지, 폰트 일괄 관리 |
| Utils | 공용 로직 | 코드 중복 최소화 |
✅ 마무리 요약
LemonLog의 폴더 구조는 “확장 가능한 MVVM 기반 iOS 앱의 전형적인 형태”입니다.
Firebase, CoreData, UIKit, 향후 SwiftUI 전환까지 고려해도 이 구조는 유지보수성과 확장성 면에서 효율적입니다.
'감정일기(가칭)' 카테고리의 다른 글
| 📱 iOS에서 사용자가 선택한 이미지를 FileManager에 저장하는 이유 (0) | 2025.10.16 |
|---|---|
| 🚀 iOS에서 앱 로고를 보여주는 두 가지 방식 — LaunchScreen vs SplashViewController 완전 정리 (0) | 2025.10.15 |
| 🚀 [2편] Git 커밋 vs 푸시 — 언제 해야 할까? (0) | 2025.10.14 |
| 🧩 [1편] Git 커밋 메시지 작성 가이드 (0) | 2025.10.14 |
| 🍋 LemonLog App Store Connect 카테고리 설정 가이드 (0) | 2025.10.14 |