AI가 먼저 전화하고 관계를 이어가는, 나만의 연애 시뮬레이션
AI 캐릭터가 채팅뿐 아니라 먼저 전화를 걸어오고, 예약 통화를 하고, 관계 상태(연애 온도·스트릭)를 함께 쌓아가는 연애 시뮬레이션 앱입니다.
주요 기능
-
이상형 온보딩 (4단계)
-
AI 채팅 (페르소나 기반, 퀵리플라이, SSE 스트리밍)
-
AI 음성 통화 (예약 통화 / 즉시 통화)
-
관계 상태 관리 (연애 온도, 스트릭)
-
플랫폼: Android (Kotlin)
| Android | Android | Android | Android |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| JiwonLee42 (LEAD) 통화 · 홈화면 |
codebidoof 채팅 · SSE |
WAcAW9 FCM · 마이페이지 |
dada4679 로그인 · 온보딩 |
| 구분 | 내용 |
|---|---|
| 언어 | Kotlin |
| UI | Jetpack Compose |
| 아키텍처 | Multi Module + MVVM + MVI |
| 비동기 | Coroutines, Flow |
| 상태 관리 | Orbit MVI |
| DI | Hilt |
| 네비게이션 | Navigation 3 |
| 네트워크 | Retrofit, OkHttp, Gson |
| 실시간 채팅 | OkHttp-SSE (Server-Sent Events, 채팅 응답 스트리밍) |
| 실시간 통화 | LiveKit Android SDK (WebRTC 기반) |
| 페이지네이션 | Paging 3 |
| 이미지 로딩 | Coil |
| 푸시 알림 | Firebase Cloud Messaging (FCM) |
| 로컬 저장소 | DataStore, Room |
| 로깅 | Timber |
- 코드 저장소: GitHub
- API 명세: OpenAPI (Swagger) — 백엔드 레포 기준
- 협업 도구: Notion / Figma / Slack
/
├── app/ # 앱 진입점(Application), 앱 전역 DI 및 초기화
│
├── build-logic/
│ └── convention/ # Gradle Convention Plugin(공통 빌드 설정)
│
├── core/
│ ├── common/ # 공통 유틸리티, 확장 함수, 상수, 디스패처, 코루틴 모듈
│ ├── data/ # Repository 구현체, Mapper, DataSource
│ ├── database/ # Room Database, DAO, Entity
│ ├── datastore/ # DataStore(사용자 설정, 토큰 등 로컬 데이터)
│ ├── designsystem/ # 공통 UI, Theme, Color, Typography, Component, res
│ ├── domain/ # Domain Model, Repository 인터페이스, UseCase
│ └── network/ # Retrofit, OkHttp, API Service, 네트워크 설정. DTO
│
└── feature/
│
├── login/
│ ├── api/ # Login Navigation 계약(Route)
│ └── impl/ # 로그인 화면 및 인증 기능 구현
│
├── onboarding/
│ ├── api/ # Onboarding Navigation 계약(Route)
│ └── impl/ # 온보딩 화면 및 흐름 구현
│
├── home/
│ ├── api/ # Home Navigation 계약(Route)
│ └── impl/ # 홈 화면 및 기능 구현
│
├── chatting/
│ ├── api/ # Chatting Navigation 계약(Route)
│ └── impl/ # 채팅 화면 및 메시지 기능 구현
│
├── call/
│ ├── api/ # Call Navigation 계약(Route)
│ └── impl/ # 음성/영상 통화 기능 구현
│
└── mypage/
├── api/ # MyPage Navigation 계약(Route)
└── impl/ # 마이페이지 및 사용자 정보 관리 구현
| 접두사 | 용도 | 예시 |
|---|---|---|
feature/ |
신규 기능 개발 | feature/login |
fix/ |
버그 수정 | fix/crash-on-home |
refactor/ |
리팩토링 (기능 변화 없음) | refactor/chat-viewmodel |
chore/ |
빌드, 설정, 의존성 등 | chore/update-gradle |
docs/ |
문서 작업 | docs/readme-update |
- 브랜치명은 소문자와 하이픈(
-)만 사용 - 이슈 번호가 있는 경우
feature/123-login형태로 이슈 번호 포함 권장
<type>: <description>
[선택 사항] 본문
[선택 사항] 이슈 참조 (#123)
| type | 설명 |
|---|---|
feat |
새로운 기능 추가 |
fix |
버그 수정 |
docs |
문서 수정 |
style |
코드 포맷팅, 세미콜론 누락 등 (로직 변경 없음) |
refactor |
리팩토링 |
test |
테스트 코드 추가/수정 |
chore |
빌드 설정, 패키지 매니저 설정 등 |
예시:
feat: 로그인 화면 구현
fix: 홈 화면 진입 시 크래시 수정 (#42)
refactor: 채팅 뷰모델 상태관리 구조 개선
- 제목: 커밋 메시지 규칙과 동일한 형식 사용 (예:
feat: 통화 수신 UI 구현) - 템플릿: 변경 사항, 스크린샷(UI 변경 시 필수), 테스트 방법, 관련 이슈 링크 포함
- 리뷰어: 팀원 1명 지정 (최소 1명 승인 필요)
- 머지 조건: 리뷰 승인 1개 이상 + CI 통과 시에만 머지 가능
- 머지 방식: Squash and Merge (커밋 히스토리 정리)
- 본인 PR은 본인이 머지하지 않음
| 대상 | 규칙 | 예시 |
|---|---|---|
| 클래스, 인터페이스 | PascalCase | ChatRoomViewModel |
| 함수, 변수 | camelCase | fetchChatHistory() |
| 상수 | UPPER_SNAKE_CASE | MAX_RETRY_COUNT |
| Composable 함수 | PascalCase (명사형) | ChatBubble() |
| 리소스 파일(Android) | snake_case | ic_call_incoming.xml |
| 패키지명 | 전부 소문자 | com.callmeai.chat |
- Boolean 변수/함수는
is,has,should접두사 사용 (isLoading,hasPermission) - 약어는 대문자 통일 지양, 카멜케이스 유지 (팀 내 IDE 포맷터 공유)
- feature 모듈은 기능 단위로 분리하고, 외부에 노출할 Navigation 계약은
api, 화면/상태/비즈니스 로직 구현은impl에 둠 - 공통 UI는
core:designsystem, 공통 유틸은core:common에 두되, 특정feature에서만 쓰는 코드는 공통 모듈로 올리지 않음 - 데이터 흐름은 단방향으로 유지하고, 의존성은
feature → core:domain ← core:data구조를 기준으로 순환 참조를 방지함. 단,core:datastore모듈은 각feature모듈이 의존할 수 있도록 허용 - 화면 상태는 ViewModel에서 Orbit MVI Container로 관리하고, UI는 State와 SideEffect를 구독해 렌더링함.
- drawable을 비롯한 리소스는
core:designsystem모듈에서 일괄 관리



