Note
프로젝트를 빌드하기 위해서는 Secrets.xcconfig 와 GoogleService-Info.plist 파일이 필요합니다.
오늘의 감정 보드 오늘 하루의 감정 기록 |
활동 추천 AI가 추천하는 맞춤형 활동 |
뱃지 기록 달성에 따른 뱃지 획득 |
기록 히스토리 이틀 전까지 기록 가능 |
감정 기록 폼 텍스트, 음성, 사진 기록 |
사진으로 기록 이미지를 통한 감정 표현 |
음성으로 기록 음성 녹음을 통한 감정 기록 |
AI 감정 분석 LLM 기반 감정 분석, 조언 |
설정 알림 및 개인 설정 관리 |
| 카테고리 | 기술 |
|---|---|
| 🏗️ 아키텍처 |
|
| 💾 데이터 관리 |
|
| 🎤 음성 처리 |
|
| 🤖 LLM |
|
|
|
Xcode 26.1 이상 |
|
|
iOS 26.0 이상 (시뮬레이터 또는 실제 디바이스) |
|
|
watchOS 26.0 이상 |
|
|
Swift 6.0 |
-
저장소 클론
git clone https://github.com/EST-iOS4/Mentory.git cd Mentory -
프로젝트 열기
cd Mentory open Mentory.xcodeproj
-
Secrets.xcconfig.sample파일을 복사하여Secrets.xcconfig파일 생성cp Mentory/Secrets.xcconfig.sample Mentory/Secrets.xcconfig
-
Secrets.xcconfig파일을 열어 ESTSOFT에서 제공받은 API 토큰 입력TOKEN = 여기에-발급받은-토큰-입력 -
Xcode에서 프로젝트 설정 확인
- Mentory.xcodeproj를 선택
- Info 탭에서
ALAN_API_TOKEN값이$(TOKEN)으로 설정되어 있는지 확인
-
Firebase Console에서 프로젝트 생성
-
iOS 앱 추가 및
GoogleService-Info.plist다운로드 -
다운로드한 파일을 프로젝트의
Mentory/Mentory/디렉토리에 추가- Xcode에서 Mentory/Mentory 폴더에 드래그 앤 드롭
- Copy items if needed 체크
-
Firebase AI 기능 활성화
- Firebase Console에서 Build > AI 메뉴로 이동
- Gemini API 활성화
- Xcode에서 타겟을 Mentory로 선택
- 시뮬레이터 또는 실제 디바이스 선택
Cmd + R또는 실행 버튼 클릭
- Xcode에서 타겟을 MentoryWatch Watch App으로 선택
- Watch 시뮬레이터 선택
Cmd + R또는 실행 버튼 클릭
참고: watchOS 앱을 실행하려면 먼저 iOS 앱이 실행되어 있어야 데이터 동기화가 정상적으로 작동합니다.
- iOS 앱을 먼저 실행
- 홈 화면으로 이동
- 위젯 추가 화면에서 Mentory 위젯 선택
- 원하는 크기의 위젯을 홈 화면에 배치
아래 사진을 통해 MentoryiOS, MentoryLLM, MentoryDB 도메인을 확인할 수 있습니다.
Mentory/
├── Mentory/ # 메인 iOS 앱
│ ├── MentoryApp.swift # 앱 진입점
│ ├── Domain/ # 비즈니스 로직 계층
│ │ ├── MentoryiOS.swift # 메인 도메인 모델
│ │ ├── TodayBoard/ # 오늘의 감정 기록 관련 도메인
│ │ │ ├── TodayBoard.swift
│ │ │ ├── RecordForm/ # 감정 기록 폼
│ │ │ ├── MentorMessage/ # 멘토 메시지
│ │ │ └── Suggestion/ # 활동 추천
│ │ ├── Onboarding/ # 온보딩 도메인
│ │ └── SettingBoard/ # 설정 도메인
│ ├── Presentation/ # UI 계층 (SwiftUI Views & ViewModels)
│ │ ├── Components/ # 재사용 가능한 UI 컴포넌트
│ │ ├── TodayBoard/ # 오늘의 감정 기록 화면
│ │ ├── Onboarding/ # 온보딩 화면
│ │ └── SettingBoard/ # 설정 화면
│ ├── Adapter/ # 외부 서비스 어댑터 계층
│ │ ├── AlanLLM/ # ESTSOFT Alan LLM 어댑터
│ │ ├── AlanLLMMock/ # Alan LLM 목 객체
│ │ ├── FirebaseLLM/ # Firebase AI 어댑터
│ │ ├── FirebaseLLMMock/ # Firebase LLM 목 객체
│ │ ├── MentoryDB/ # 데이터베이스 어댑터
│ │ ├── MentoryDBMock/ # DB 목 객체
│ │ └── Notification/ # 알림 어댑터
│ ├── Service/ # 서비스 계층
│ │ ├── Microphone/ # 음성 녹음 서비스
│ │ ├── ImagePicker/ # 이미지 선택 서비스
│ │ └── WatchConnectivity/ # Watch 연동 서비스
│ ├── Assets.xcassets/ # 이미지, 컬러 리소스
│ ├── GoogleService-Info.plist # Firebase 설정 파일
│ └── Info.plist # 앱 설정 파일
│
├── MentoryDB/ # 데이터베이스 모듈
│ └── Domain/ # DB 도메인 모델
│ └── DailyRecord/ # 일일 감정 기록 모델
│
├── MentoryWatch Watch App/ # watchOS 앱
│ ├── Domain/ # Watch 앱 비즈니스 로직
│ ├── Service/ # Watch 앱 서비스
│ └── Presentation/. # UI 계층
│
├── MentoryWidget/ # 위젯 확장
│ ├── MentoryWidgetBundle.swift # 위젯 번들
│ └── Presentation/ # 위젯 UI
│
├── Values/ # 공유 값 타입 및 프로토콜
│ ├── MentoryiOS/ # iOS 앱 관련 값 타입
│ ├── MentoryDB/ # DB 관련 값 타입
│ ├── AlanLLM/ # Alan LLM 관련 값 타입
│ └── FirebaseLLM/ # Firebase LLM 관련 값 타입
│
├── MentoryTests/ # 단위 테스트
│ ├── TodayBoard/ # TodayBoard 도메인 테스트
│ └── Onboarding/ # Onboarding 도메인 테스트
│
├── Secrets.xcconfig # API 키 설정 파일 (git에서 제외됨)
└── Secrets.xcconfig.sample # API 키 설정 템플릿
이 프로젝트는 MVVM 패턴과 클린 아키텍처 원칙을 따라 설계되었습니다:
- Domain: 비즈니스 로직과 규칙을 담당하는 핵심 계층
- Presentation: SwiftUI 뷰와 뷰모델을 포함하는 UI 계층
- Adapter: 외부 서비스(LLM, DB, 알림 등)와의 통신을 담당하는 계층
- Service: 공통 기능(마이크, 이미지 피커, Watch 연동)을 제공하는 계층
- Values: 도메인 간 공유되는 값 타입과 프로토콜
각 계층은 의존성 역전 원칙(DIP)을 따르며, Mock 객체를 통해 테스트 가능하도록 설계되었습니다.
- 이슈(Issue) 작성하기
- SwiftUI에서 Combine 기반 MVVM 사용하기
- MVVM에 Swift Concurrency 도입하기
- SwiftData 구현 가이드
- Alan API 사용법
- WatchOS 기초
- WatchConnectivity 이해하기
- Widget Extension 개념 이해하기
- Firebase AI 사용하기
아래는 팀원별로 개발을 진행하며 겪은 문제에 대한 트러블슈팅 문서입니다. 새로운 문서를 추가하려면 docs/troubleshooting/<이름-폴더>/YYYYMMDD-short-title.md 형식으로 새 마크다운 파일을 만들고, 아래에 문서 참조를 추가하면 됩니다.
- 박재이
- 송지석
- 구현모
- 김민우
- 작성된 문서 없음
![]() 박재이 |
![]() 송지석 |
![]() 구현모 |
![]() 김민우 |
| iOS Developer | iOS Developer | iOS Developer | iOS Developer |















