2026. 1. 14. 06:13ㆍAI Product Building/HalloGerman
이 글의 핵심:
앱 아이디어를 떠올리는 것과, 실제로 개발 가능한 기능 목록으로 정리하는 것은 완전히 다른 문제다. 2편에서는 독일어 학습 앱 HalloGerman을 만들기 전, 아이디어를 어떻게 기능 단위로 쪼개고 MVP로 압축했는지 실제 기준을 공유한다.
1. “이거 있으면 좋겠다”는 대부분 실패한다
앱 아이디어를 처음 떠올리면 보통 이런 생각부터 든다.
- 단어도 외우고
- 문장도 연습하고
- 회화도 되고
- 시험 대비도 되고
- 게임처럼 재미있으면 좋겠다
문제는 이 상태로 바로 개발에 들어가면, 거의 100% 중간에 멈춘다는 점이다. 기능이 많아질수록 설계는 복잡해지고, 1인 개발에서는 감당이 되지 않는다. 그래서 기획 단계에서 가장 먼저 해야 할 일은 ‘뺄 기능’을 정하는 것이다.
2. 타깃 사용자를 단 한 문장으로 정의하기
HalloGerman의 타깃 사용자는 이렇게 정의했다.
“독일어를 생활 속에서 쓰지만, 단어가 부족해서 매번 막히는 사람”
이 문장을 기준으로 모든 기능을 평가했다. 이 사용자에게 지금 당장 가장 필요한 것은 무엇일까?
- 문법 설명? → 당장 급하지 않다
- 긴 회화 코스? → 부담이 크다
- 시험 대비? → 일부 사용자만 해당
- 생활에서 마주친 단어를 바로 정리하고 외우는 기능? → 핵심
이렇게 타깃을 좁히면 기능 선택이 쉬워진다.
3. 아이디어를 기능 카드로 쪼개기
다음 단계는 머릿속 아이디어를 “기능 카드”로 쪼개는 것이다. HalloGerman 초기 기획 단계에서 정리한 기능 카드 예시는 다음과 같다.
- 단어 듣기 (독일어 발음)
- 단어 말하기 (음성 인식)
- 단어 쓰기 (타이핑)
- 단어 쓰기 (필기 입력)
- 뉴스 읽기 (독일어 원문)
- 뉴스 음성으로 읽어주기
- 뉴스에서 단어/문장 선택
- 선택한 단어를 단어장에 저장
- CSV 파일로 단어장 업로드
- 개인 단어장 암기 모드
중요한 점은, 이 단계에서는 “어떻게 구현할지”를 고민하지 않는다는 것이다. 오직 “사용자 입장에서 필요한 행동”만 나열한다.
4. MVP 기준: 지금 안 만들어도 되는 기능은 과감히 제외
기능 카드를 나열했다면, 이제 가장 중요한 질문을 던진다.
“이 기능이 없으면 앱이 의미가 없어지는가?”
이 질문을 기준으로 MVP(최소 기능 제품)를 정리했다.
✔ MVP에 포함된 기능
- 단어장 생성 및 관리
- 단어 듣기 (TTS)
- 단어 말하기 (음성 인식)
- 단어 쓰기 (타이핑)
- 독일어 뉴스 읽기 + 음성 재생
- 뉴스 → 단어장 저장
- CSV 단어장 업로드
✖ MVP에서 제외한 기능
- 문법 설명 코스
- 레벨 테스트
- 문장 회화 훈련 (확장 예정)
- 게임 요소(점수, 랭킹 등)
문장 학습은 중요하지만, 단어장이 제대로 돌아간다는 전제가 없으면 의미가 없다고 판단했다. 그래서 문장 학습은 확장 기능으로 명확히 분리했다.
5. 기능 우선순위를 정하는 현실적인 기준
기능을 고를 때 사용한 기준은 단순하다.
- 하루에 한 번이라도 앱을 열 이유가 되는가?
- 실제 독일 생활과 연결되는가?
- 구현 난이도가 1인 개발로 감당 가능한가?
예를 들어 CSV 단어장 업로드 기능은 구현 난이도는 있지만, 사용자가 “이 앱을 계속 써야 할 이유”를 만들어 주기 때문에 MVP에 포함시켰다.
6. 이 단계에서 아키텍처를 고민하면 안 되는 이유
많은 개발자들이 이 단계에서 벌써 아키텍처, 패턴, 최적화를 고민한다. 하지만 MVP 설계 단계에서는 오히려 독이다.
이 시점에서 중요한 것은 딱 하나다.
“이 기능들이 실제 화면으로 연결될 수 있는가?”
다음 편부터는 이 MVP 기능들을 기준으로 Android 프로젝트 구조를 어떻게 잡았는지, 그리고 확장을 고려해 어떤 선까지 미리 설계했는지를 다룬다.
MVP 구조 코드
// 앱의 MVP 탭 구조 정의
MainScreen.kt
val items = listOf(
BottomNavItem.Home,
BottomNavItem.Daily,
BottomNavItem.Learn,
BottomNavItem.Notebooks,
BottomNavItem.Settings
)
HorizontalPager(
state = pagerState,
modifier = Modifier.fillMaxSize(),
userScrollEnabled = true
) { page ->
when (items[page]) {
BottomNavItem.Home -> HomeScreen(...)
BottomNavItem.Daily -> DayListScreen(navController)
BottomNavItem.Learn -> LearnModeScreen(title = "", navController = navController)
BottomNavItem.Notebooks -> NotebookScreen(navController = navController)
BottomNavItem.Settings -> SettingsScreen(navController = navController)
}
}
// MVP 단계에서는 탭 구성 자체가 곧 “핵심 기능 범위”야. 이 5개만으로 홈/데일리/학습/단어장/설정을 커버한다.
// 학습 모드 = 기능 세트 정의
LearnModeScreen.kt
val items = listOf(
LearnItem(
title = stringResource(R.string.learn_mode_listen_title),
description = stringResource(R.string.desc_listen_mode),
icon = Icons.Default.Hearing,
color = PastelPalette.LearnListen,
onClick = { navController.navigate("listen?topic=$encodedTopic") }
),
LearnItem(
title = stringResource(R.string.title_news_mode),
description = stringResource(R.string.desc_news_mode),
icon = Icons.AutoMirrored.Filled.MenuBook,
color = PastelPalette.LearnNews,
onClick = { navController.navigate("news_webview") }
),
LearnItem(
title = stringResource(R.string.learn_mode_read_title),
description = stringResource(R.string.desc_speak_mode),
icon = Icons.Default.Mic,
color = PastelPalette.LearnRead,
onClick = { navController.navigate("read?topic=$encodedTopic") }
)
)
// 아이디어(듣기/말하기/쓰기)는 곧 모드 카드로 변환되고, 이게 “MVP 기능 목록”이 된다.
// 네비게이션으로 MVP 범위를 고정
NavGraph.kt
composable("flashcard?topic={topic}") { ... }
composable("listen?topic={topic}") { ... }
composable("write?topic={topic}") { ... }
composable("read?topic={topic}") { ... }
7. 다음 편 예고
3편. Android 프로젝트 구조 설계 (확장 가능한 뼈대 만들기)
다음 글에서는 HalloGerman의 실제 패키지 구조, 화면 분리 기준, 데이터 흐름을 그림처럼 설명한다. “처음에 어떻게 구조를 잡아야 나중에 안 망가지는지”를 중심으로 다룬다.
참조 라이브러리 및 도구 모음
'AI Product Building > HalloGerman' 카테고리의 다른 글
| [독일어 학습 앱 개발기 6편] TTS와 음성 인식 구현 – Android에서 가장 까다로운 기능 다루기 (0) | 2026.01.18 |
|---|---|
| [독일어 학습 앱 개발기 5편] 단어 암기 UI 설계 – 듣기·말하기·쓰기를 하나의 흐름으로 만드는 법 (0) | 2026.01.17 |
| [독일어 학습 앱 개발기 4편] 단어장 데이터 구조 설계 – CSV, 뉴스, 로컬 데이터를 하나로 묶는 법 (1) | 2026.01.16 |
| [독일어 학습 앱 개발기 3편] Android 프로젝트 구조 설계 – 처음에 이것만 지켜도 망하지 않는다 (1) | 2026.01.15 |
| [독일어 학습 앱 개발기 1편] 왜 HalloGerman을 직접 만들었을까 (0) | 2026.01.13 |