이별 후의 감정을 정리하고 극복하도록 돕는 감정 케어 서비스
🔮 App Store
ByeBoo는 이별의 감정을 맞춤형 퀘스트를 통해 정리하고, 감정 회복의 여정을 함께하는 감정 케어 앱입니다. 사용자는 자기 성찰형/행동 실천형 퀘스트를 선택하여 보리와 함께 감정을 직면하고 일상을 회복해나갑니다.
가입 직후 온보딩 과정을 통해 서비스의 세계관에 대해 안내 받습니다. 메인 캐릭터인 ‘보리’의 스토리를 들으며 서비스에 대한 이해도를 높일 수 있습니다.
닉네임 / 이별 후의 감정 상태 / 선호하는 퀘스트 스타일을 선택한 후, 입력한 정보에 맞는 이별 극복 여정을 안내받습니다. *앱잼 구현 범위 내에서는 ‘퀘스트 스타일’만 고려해 여정을 제공합니다. 따라서 질문형-감정 직면 / 행동형-감정 정리 여정 2가지가 제공됩니다.
홈에서 서비스의 메인 캐릭터인 ‘보리’를 만나볼 수 있으며, 보리가 해주는 위로와 응원의 한마디를 제공 받을 수 있습니다. 또한 퀘스트 및 전체 여정의 진행 상태를 한 눈에 확인할 수 있습니다.
하나의 이별 극복 여정은 총 5단계로 구성되며, 각 단계마다 6개의 퀘스트가 포함되어 있어 한 여정은 총 30개의 퀘스트로 이루어집니다. 퀘스트는 단계별로 점진적으로 설계되어 있어, 사용자는 이를 따라가며 감정과 상황을 직면하고 정리해 나가는 과정을 경험하게 됩니다.
📝 질문형 퀘스트
감정과 상황을 글로 마주하는 자기 성찰 중심의 퀘스트입니다.
이별에 대해 천천히 돌아보며 감정의 실체를 파악하고, 스스로 이해하는 과정을 돕습니다.
🧗♂️ 행동형 퀘스트
몸을 움직이며 감정을 정리하는 실천 중심의 퀘스트입니다.
간단한 행동을 통해 머릿속을 환기시키고, 무기력에서 벗어나 스스로 일상의 루틴을 되찾을 수 있도록 유도합니다.
30개의 퀘스트를 모두 완료하고, 1개의 이별 극복 여정이 끝나면 보리의 축하 인사를 받습니다.
이후 추가적인 이별 극복 여정이 필요하면 ‘새로운 이별 극복 여정 시작하기’를 통해 추가 여정을 선택하고, 새롭게 시작할 수 있습니다.
남긴 기록들을 돌아보고 싶을 경우, ‘완료한 여정 돌아보기’를 통해 이번 여정에서 작성한 내용들을 다시 볼 수 있습니다.
![]() |
![]() |
![]() |
|---|---|---|
| 최주리 (Lead) | 허승준 | 이나연 |
온보딩, 홈 |
정보입력, 퀘스트 조회, 알림 |
퀘스트 작성, 퀘스트 수정 |
1. 성숙도와 안정성
UIKit은 iOS 초기부터 사용되던 프레임워크로, 높은 안정성을 자랑하며 다양한 기기와 iOS 버전을 아우르는 호환성이 우수하다는 장점이 있습니다.
2. 예측 가능한 UI 레이아웃 작업
SwiftUI는 예측하지 못한 동작으로 인해 기대와는 다른 UI가 제작될 우려가 있어, 서비스의 완성도가 중요한 앱잼 프로젝트에서 채택하기에 리스크가 있다고 판단했습니다.
반면, UIKit은 개발자가 UI 구성 과정을 직접 명령형으로 제어할 수 있어, 예측 가능한 방식으로 UI를 구현할 수 있습니다. 오류가 발생해도 디버깅이 수월해, 서비스의 안정성을 높이는 데 도움이 되었습니다.
- 각 계층의 책임 분리를 명확하게 함으로써 앱의 확장성과 유지보수성을 높이기 위함
- 테스트가 용이한 구조
- DIContainer에서 의존성 관리
- 비즈니스 로직과 UI 로직을 분리해서 작성함으로써 유지보수성 높이기 위함
- Input을 enum으로 정의하여 사용자의 행동을 미리 정의
- ViewModel에서 각 Input별 행동을 매핑
- 행동에 따른 Output을 View에서 Combine을 이용하여 구독함으로써 View 갱신
| 기술/도구 | 선정 이유 |
|---|---|
| Alamofire | 네트워크 레이어를 보다 간편하게 사용하기 위함 |
| SnapKit | 오토레이아웃을 간편하게 설정하기 위함 |
| Then | UI 코드를 간편하게 작성하기 위함 |
| Combine | 데이터 바인딩을 편리하게 하기 위함 |
| Kingfisher | 이미지 처리 및 캐싱을 편리하게 하기 위함 |
| Lottie | 애니메이션 구현을 위함 |
| Firebase | FCM 토큰을 이용한 알람 구현을 위함 |
📁 App
│ ├── 📝 AppDelegate
│ ├── 📝 DIContainer+
│ └── 📝 SceneDelegate
├── 📁 Core
│ ├── 📝 ByeBooError
│ ├── 📝 ByeBooLogger
│ └── 📝 DIContainer
├── 📁 Data
│ ├── 📁 Config
│ ├── 📁 Model
│ ├── 📁 Network
│ │ ├── 📁 EndPoint
│ │ └── 📁 Service
│ ├── 📁 Persistence
│ │ ├── 📁 Service
│ │ └── 📝 UserDefaultsKey
│ ├── 📁 Repository
│ └── 📝 DataDependencyAssembler
├── 📁 Domain
│ ├── 📁 Entity
│ ├── 📁 Interface
│ ├── 📁 UseCase
│ └── 📝 DomainDependencyAssembler
├── 📁 Presentation
│ ├── 📁 Base
│ ├── 📁 Common
│ ├── 📁 Enum
│ ├── 📁 Extension
│ ├── 📁 Feature
│ ├── 📁 Protocol
│ ├── 🖼️ LaunchScreen
│ └── 📝 PresentationDependencyAssembler
└── 📁 ResourceSwift 스타일 쉐어 가이드를 따릅니다.
| 태그 | 설명 |
|---|---|
feat |
새로운 기능 구현 시 사용 |
style |
스타일 및 UI 기능 구현 시 사용 |
fix |
버그나 오류 해결 시 사용 |
docs |
README, 템플릿 등 프로젝트 내 문서 수정 시 사용 |
setting |
프로젝트 관련 설정 변경 시 사용 |
add |
사진 등 에셋이나 라이브러리 추가 시 사용 |
refactor |
기존 코드를 리팩토링하거나 수정할 때 사용 |
chore |
별로 중요한 수정이 아닐 때 사용 |
hotfix |
급하게 develop에 바로 반영해야 하는 경우 사용 |
- 반드시 소문자로 작성합니다.
- 한글로 작성합니다.
- 제목이 50자를 넘지 않도록, 간단하게 명령조로 작성합니다.
feat: #1 로그인 기능 구현
add: #2 이미지 에셋 추가| 카카오 로그인 | 애플 로그인 |
|---|---|
![]() |
![]() |
| 정보 입력 및 사용자 맞춤 여정 결과 확인 |
|---|
![]() |
| 퀘스트 조회 | 퀘스트 작성 -> 퀘스트 팁 조회 | 퀘스트 시작 모달 -> 퀘스트 팁 조회 |
|---|---|---|
![]() |
![]() |
![]() |
| 질문형 퀘스트 작성 -> 작성 완료 확인 | 행동형 퀘스트 작성 -> 작성 완료 확인 |
|---|---|
![]() |
![]() |
| 퀘스트 알림 | 알림 터치 시 앱으로 이동 |
|---|---|
![]() |
![]() |
| 질문형 퀘스트 수정 | 행동형 퀘스트 수정 |
|---|---|
![]() |
![]() |
















