디스코드·구글 시트·노션으로 흩어진 동아리 운영 도구를 하나의 앱으로 통합하여, 부원이 운영 잡무 대신 성장에 집중할 수 있는 환경을 제공합니다.
|
The Ping 공지 수신 확인을 추적하고 미확인자에게 재알림 |
Mobile-First Admin 출석·경고·공지 운영을 모바일에서 바로 처리 |
On-device AI Gemini Nano로 공지 요약· 문장 다듬기·채팅 요약 |
위치 기반 일정 일정에 장소를 등록하고 출석과 연계 |
| 구분 | 사용 기술 |
|---|---|
| 🧩 언어 / UI | Kotlin 2.2.21 · Jetpack Compose (BOM 2025.02.00) · Navigation Compose (Type-safe) |
| 🏗️ 아키텍처 | Clean Architecture (data / domain / presentation) + 멀티 모듈 |
| 💉 DI | Hilt 2.57.2 |
| 🌐 네트워크 | Retrofit 3.0.0 · OkHttp · Gson |
| ⚡ 비동기 | Coroutines 1.10.2 · Flow |
| 💾 로컬 저장소 | DataStore 1.2.1 |
| 🖼️ 이미지 | Coil 2.6.0 |
| 🔐 인증 | Kakao SDK 2.23.2 · 이메일 로그인 |
| 🤖 AI | ML Kit GenAI Prompt API (Gemini Nano · 온디바이스) |
| 🔔 기타 | Firebase (FCM, Analytics) · ZXing (QR) |
|
김도연 도리 @kimdoyeon1234 |
박유수 어헛차 @Park-yu-su |
양지애 나루 @yangjiae12 |
조경석 조나단 @rudtjr1106 |
|
김도연 도리 @kimdoyeon1234 |
박유수 어헛차 @Park-yu-su |
조경석 조나단 @rudtjr1106 |
추연우 우연 @starshape7 |
레이어별로 모듈을 분리하고, 화면 단위 기능은 presentation 하위 모듈로 나눕니다.
umc-product-android
├── 📱 app # 애플리케이션 진입점, DI 설정, 매니페스트
├── 💾 data # Data Layer — API, DTO, DataSource, Repository 구현
├── 🧠 domain # Domain Layer — Model, Repository Interface, UseCase
└── 🎨 presentation # Presentation Layer — Compose UI
├── component # 디자인 시스템 (색상·타이포·공통 컴포넌트), Base 클래스
├── splash # 스플래시 · 자동 로그인
├── login # 로그인 (카카오 / 이메일)
├── signUp # 회원가입
├── permission # 권한 요청
├── failCode # 챌린저 코드 입력
├── home # 홈 · 일정 · 알림 보관함
├── notice # 공지 (목록 · 검색 · 작성 · 상세 · 운영진 공지)
├── act # 활동 관리 (출석 · 챌린저 관리)
├── study # 스터디 · 워크북
├── community # 커뮤니티 (스레드 · 채팅)
└── mypage # 마이페이지 · 명함 · QR
📐 레이어 의존 규칙
presentation ──▶ domain ──▶ data
presentation→domain→data방향으로만 의존합니다.presentation은data를 직접 참조하지 않고,domain의 UseCase를 통해 접근합니다.- 화면 모듈끼리는 서로 의존하지 않으며, 공통 요소는
presentation:component에 둡니다.
git clone https://github.com/UMC-PRODUCT/umc-product-android.git- Android Studio에서 프로젝트를 엽니다. (JDK 11 · AGP 8.12.3)
- 아래 시크릿 설정을 완료합니다.
app구성으로 실행합니다. (minSdk 24 / targetSdk 36)
local.properties — 팀 내부 채널에서 수령
kakao.native.key=...
kakao.rest.key=...
kakao.app.key=...
naver.client.id=...app/google-services.json(Firebase 설정)도 팀 내부 채널에서 받아 배치합니다.⚠️ 실제 키·설정 파일은 원격 저장소에 커밋하지 않습니다.
🌿 브랜치 컨벤션
기본 브랜치: main(배포), develop-compose(개발)
모든 작업은 기본 브랜치에서 파생된 기능별 하위 브랜치에서 진행하며, 브랜치명은 태그/#이슈번호 형식을 따릅니다.
예: feat/#2, ui/#15
| 태그 | 설명 |
|---|---|
| main | 애플리케이션 배포 브랜치 |
| develop-compose | 개발을 위한 통합 브랜치 |
| feat | 새로운 기능 개발(로직 포함) |
| ui | 레이아웃 및 UI 작업 |
| fix | 버그 수정 및 에러 해결 |
| refactor | 코드 리팩토링 |
| chore | 빌드 설정 및 라이브러리 관리 |
📌 이슈 컨벤션
이슈는 템플릿 형태로 주어지며, 아래 내용을 작성합니다.
기능 개요: 구현하고자 하는 기능을 요약해 작성상세 내용: 기능과 관련된 추가적인 정보를 작성작업 체크리스트: 작업 간 수행 여부 작성 및 체크참고 사항: 외부 문서나 추후 작업 시 참고 사항 작성
제목 형식: [태그] 작업 제목 — 예: [UI] 온보딩 화면 UI 구현
✅ PR 컨벤션
PR 작성 시 템플릿 형태가 주어지며, 아래 내용을 작성합니다.
작업 내용: 이번 PR에서 작업한 내용을 간단히 요약리뷰 요구사항: 리뷰어가 중점적으로 봐주었으면 하는 부분 작성체크리스트: 코드에 이상 없는지 확인 및 체크스크린샷(선택): 작업한 화면 스크린샷
제목 형식: [태그/#이슈번호] 작업 제목 — 예: [Feat/#2] 온보딩 화면 구현
🏷️ 커밋 컨벤션
커밋 메시지는 [태그/#이슈번호] 작업 내용 형식을 권장합니다.
예: [Feat/#2] 온보딩 화면 UI 구현
태그 종류 (이슈 / PR / 커밋 공통)
| 태그 | 설명 |
|---|---|
| [Feat] | 새로운 기능 추가 및 로직 구현 |
| [UI] | Composable, Drawable, UI 컴포넌트 등 디자인 작업 |
| [Fix] | 버그 수정 및 예외 처리 |
| [Data] | API 연결, DTO 구성, 로컬 저장소 등 데이터 관련 작업 |
| [Refactor] | 리팩토링 및 파일/변수 이름 변경 |
| [Merge] | 브랜치 머지 및 충돌 해결 |
| [Chore] | 빌드 설정, 라이브러리 관리 등 기타 환경 설정 |
💻 코드 컨벤션
Ktlint를 통해 Android 공식 스타일 가이드를 준수하며, 자동 점검합니다.
Kotlin 네이밍
- Class / Interface:
PascalCase(예:NoticeViewModel) - 함수 / 변수:
camelCase(예:getUserId()) - 상수:
UPPER_SNAKE_CASE(예:BASE_URL)
Compose 네이밍
- Composable:
PascalCase명사형 (예:NoticeCard,UmcBottomNavigationBar) - 화면 단위:
{화면명}Screen/ 상태 주입 래퍼는{화면명}Route - 상태 / 이벤트:
{화면명}UiState,{화면명}Event - Drawable:
ic_(아이콘명),bg_(배경명)(예:ic_bottom_nav_home.xml)
그 외
- 화면은
Route(상태·네비게이션)와Screen(순수 UI)으로 분리하고,Screen은 Preview가 가능하도록 상태를 파라미터로 받습니다. - 색상·타이포는 하드코딩하지 않고
presentation:component의 디자인 토큰을 사용합니다.