|
1 | | -# 🚪 Next Room |
| 1 | +<div align="center"> |
| 2 | + |
| 3 | +# 🚪 넥스트룸 (NextRoom) |
| 4 | + |
| 5 | +### 방탈출의 퀄리티를 한층 높여줄 힌트폰 앱 |
| 6 | + |
| 7 | +[](https://www.android.com) |
| 8 | +[](https://android-arsenal.com/api?level=24) |
| 9 | +[](https://kotlinlang.org) |
| 10 | +[](LICENSE) |
| 11 | + |
| 12 | +[<img src="https://play.google.com/intl/en_us/badges/images/generic/ko_badge_web_generic.png" alt="Get it on Google Play" height="80">](https://play.google.com/store/apps/details?id=com.nextroom.nextroom&hl=ko) |
| 13 | + |
| 14 | +<img width="700" height="700" alt="nextroom_banner" src="https://github.com/user-attachments/assets/530957f6-c2c5-446a-b734-df60705a3dc0" /> |
| 15 | + |
| 16 | + |
| 17 | +</div> |
| 18 | + |
| 19 | +--- |
| 20 | + |
| 21 | +## 📱 프로젝트 소개 |
| 22 | + |
| 23 | +**넥스트룸**은 방탈출 사장님들을 위한 힌트폰 관리 서비스입니다. |
| 24 | + |
| 25 | +방탈출 게임 진행시 사용하는 앱을 제공하며, 웹에서 테마와 힌트를 한 번에 관리할 수 있습니다. |
| 26 | + |
| 27 | +### 링크 |
| 28 | + |
| 29 | +- **플레이스토어**: [playstore](https://play.google.com/store/apps/details?id=com.nextroom.nextroom&hl=ko) |
| 30 | +- **웹사이트**: [nextroom.co.kr](https://nextroom.co.kr) |
| 31 | +- **인스타그램**: [@team_nextroom](https://www.instagram.com/team_nextroom/) |
| 32 | +- **사용 가이드**: [넥스트룸 사용 가이드](https://held-notebook-420.notion.site/134ed57b9c574733b31feab0ea5c36a5?pvs=4) |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +## ✨ 주요 기능 |
| 37 | + |
| 38 | +### 🎮 게임 관리 |
| 39 | +- **실시간 타이머**: 방탈출 게임 진행 시간 추적 및 관리 |
| 40 | +- **힌트 시스템**: 4자리 힌트 코드를 통한 체계적인 힌트 제공 |
| 41 | +- **진행률 추적**: 문제 진행률 실시간 모니터링 |
| 42 | +- **메모 기능**: 게임 중 필요한 메모를 그림으로 작성 |
| 43 | + |
| 44 | +### 🎨 커스터마이징 |
| 45 | +- **타이머 배경 설정**: 테마별 포스터로 타이머 배경 커스텀 |
| 46 | +- **이미지 조정**: 배경 이미지의 어두움과 위치 조정 가능 |
| 47 | +- **테마별 분위기**: 각 테마의 독특한 분위기로 몰입감 향상 |
| 48 | + |
| 49 | +### 🔐 보안 기능 |
| 50 | +- **앱 비밀번호**: 관리자만 게임을 시작할 수 있도록 보안 설정 |
| 51 | +- **지문 인증**: 생체 인증을 통한 빠르고 안전한 접근 |
| 52 | + |
| 53 | +### 💳 구독 관리 |
| 54 | +- **멤버십 시스템**: 월 구독 기반 서비스 |
| 55 | +- **힌트 이미지**: 구독 시 힌트와 이미지를 함께 제공 |
| 56 | +- **무제한 배경**: 구독자는 무제한 타이머 배경 등록 가능 |
| 57 | + |
| 58 | +--- |
| 59 | + |
| 60 | +## 📸 스크린샷 |
| 61 | + |
| 62 | +<div align="center"> |
| 63 | + <img src="https://github.com/user-attachments/assets/7fc42dca-0d96-4f06-a7c0-87721fc2919f" width="200" /> |
| 64 | + <img src="https://github.com/user-attachments/assets/f3021fbf-d319-4dd3-917e-b5520ea83a95" width="200" /> |
| 65 | + <img src="https://github.com/user-attachments/assets/e6c8ac42-b74d-40be-900c-cd120993b060" width="200" /> |
| 66 | +</div> |
| 67 | + |
| 68 | +--- |
| 69 | + |
| 70 | +## 🏗️ 아키텍처 |
| 71 | + |
| 72 | +### Clean Architecture with Multi-Module |
| 73 | + |
| 74 | +이 프로젝트는 **Clean Architecture** 원칙을 따르며, 5개의 모듈로 구성되어 있습니다. |
| 75 | + |
| 76 | +```mermaid |
| 77 | +graph TD |
| 78 | + A[app] --> B[data] |
| 79 | + A[app] --> C[domain] |
| 80 | + A[app] --> D[presentation] |
| 81 | + A[app] --> E[commonutil] |
| 82 | +
|
| 83 | + B --> C |
| 84 | + B --> E |
| 85 | +
|
| 86 | + D --> C |
| 87 | + D --> E |
| 88 | +
|
| 89 | + style A fill:#e1f5ff |
| 90 | + style B fill:#fff4e1 |
| 91 | + style C fill:#e8f5e9 |
| 92 | + style D fill:#fce4ec |
| 93 | + style E fill:#f3e5f5 |
| 94 | +``` |
| 95 | + |
| 96 | +--- |
| 97 | + |
| 98 | +## 🔄 CI/CD |
| 99 | + |
| 100 | +### GitHub Actions |
| 101 | + |
| 102 | +**앱 배포와 알림 프로세스** 구축 |
| 103 | +- Feature 브랜치: Lint → Debug APK 빌드 → Firebase App Distribution → Slack 알림 |
| 104 | +- Release 브랜치: Lint → Release AAB 빌드 → Play Store 배포 (내부 테스트, 초안) |
| 105 | + |
| 106 | +**자동으로 코드를 작성하고 검수**까지 완료하는 프로세스 구축 |
| 107 | +- 깃허브 이슈 등록 → Gemini API를 활용하여 자동으로 코드 작성 → PR push → Gemini로 코드 검수하여 리뷰 코멘트 작성 |
| 108 | + |
| 109 | +--- |
| 110 | + |
| 111 | +## 🛠️ 기술 스택 |
| 112 | + |
| 113 | +### Language & Platform |
| 114 | +- **Kotlin** `1.9.10` - 100% Kotlin으로 작성 |
| 115 | +- **JVM Target** `17` |
| 116 | +- **Min SDK** `24` (Android 7.0) |
| 117 | + |
| 118 | +### Architecture & Design Pattern |
| 119 | +- **Clean Architecture** - 계층 분리 및 의존성 규칙 |
| 120 | +- **Multi-Module** - 기능별 모듈 분리 |
| 121 | +- **MVI Pattern** - Orbit MVI를 활용한 단방향 데이터 흐름 |
| 122 | + |
| 123 | +### Jetpack & AndroidX |
| 124 | +- **Navigation Component** `2.7.4` - 화면 전환 및 SafeArgs |
| 125 | +- **Room** `2.5.2` - 로컬 데이터베이스 (KSP 적용) |
| 126 | +- **DataStore** - 사용자 설정 저장 |
| 127 | +- **View Binding** - 타입 안전한 뷰 바인딩 |
| 128 | + |
| 129 | +### Dependency Injection |
| 130 | +- **Hilt** `2.48` - 의존성 주입 (KAPT 사용) |
| 131 | + |
| 132 | +### Networking |
| 133 | +- **Retrofit** `2.9.0` - REST API 통신 |
| 134 | + |
| 135 | +### Asynchronous |
| 136 | +- **Coroutines** `1.7.3` - 비동기 프로그래밍 |
| 137 | +- **Flow** - 반응형 데이터 스트림 |
| 138 | + |
| 139 | +### State Management |
| 140 | +- **Orbit MVI** `6.0.0` - 상태 관리 및 사이드 이펙트 처리 |
| 141 | + |
| 142 | +### Firebase |
| 143 | +- **Firebase BOM** `32.3.1` |
| 144 | + - Analytics - 사용자 행동 분석 |
| 145 | + - Crashlytics - 크래시 리포팅 |
| 146 | + - Remote Config - 원격 설정 |
| 147 | + |
| 148 | +### Billing & Authentication |
| 149 | +- **Play Billing** `8.0.0` - 인앱 결제 |
| 150 | +- **Google Identity** - 구글 로그인 |
| 151 | + |
| 152 | +### Debugging (Debug Only) |
| 153 | +- **Flipper** `0.200.0` - 네트워크, DB 디버깅 |
| 154 | +- **LeakCanary** `2.14` - 메모리 누수 감지 |
| 155 | +- **Timber** `5.0.1` - 로깅 |
| 156 | + |
| 157 | +--- |
| 158 | + |
| 159 | +## 📚 주요 개발 패턴 |
| 160 | + |
| 161 | +### State Management (Orbit MVI) |
| 162 | + |
| 163 | +ViewModel에서 `BaseViewModel<STATE, SIDE_EFFECT>`를 상속: |
| 164 | + |
| 165 | +```kotlin |
| 166 | +@HiltViewModel |
| 167 | +class ExampleViewModel @Inject constructor( |
| 168 | + private val repository: ExampleRepository |
| 169 | +) : BaseViewModel<ExampleState, ExampleEvent>() { |
| 170 | + |
| 171 | + override val container: Container<ExampleState, ExampleEvent> = |
| 172 | + container(ExampleState()) |
| 173 | + |
| 174 | + fun loadData() = intent { |
| 175 | + repository.getData() |
| 176 | + .onSuccess { data -> |
| 177 | + reduce { state.copy(data = data) } |
| 178 | + } |
| 179 | + .onFailure { error -> |
| 180 | + postSideEffect(ExampleEvent.ShowError(error)) |
| 181 | + } |
| 182 | + } |
| 183 | +} |
| 184 | +``` |
| 185 | + |
| 186 | +--- |
| 187 | + |
| 188 | +## 📄 라이선스 |
| 189 | + |
| 190 | +``` |
| 191 | +MIT License |
| 192 | +
|
| 193 | +Copyright (c) 2025 Next Room |
| 194 | +
|
| 195 | +Permission is hereby granted, free of charge, to any person obtaining a copy |
| 196 | +of this software and associated documentation files (the "Software"), to deal |
| 197 | +in the Software without restriction, including without limitation the rights |
| 198 | +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 199 | +copies of the Software, and to permit persons to whom the Software is |
| 200 | +furnished to do so, subject to the following conditions: |
| 201 | +
|
| 202 | +The above copyright notice and this permission notice shall be included in all |
| 203 | +copies or substantial portions of the Software. |
| 204 | +
|
| 205 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 206 | +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 207 | +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 208 | +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 209 | +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 210 | +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| 211 | +SOFTWARE. |
| 212 | +``` |
| 213 | + |
| 214 | +<div align="center"> |
| 215 | + |
| 216 | +Made with ❤️ by Next Room Team |
| 217 | + |
| 218 | +[⬆️ Back to top](#-넥스트룸-nextroom) |
| 219 | + |
| 220 | +</div> |
0 commit comments