Mobile 입문 & 로드맵를 실무 흐름으로 이해하기
모바일 앱 개발을 처음 시작하는 분을 위한 출발점입니다. 네이티브·크로스플랫폼·하이브리드 방식의 차이, Android(Kotlin)와 Flutter 중 무엇을 고를지, 앱의 생명주기와 아키텍처, 스토어 배포까지 — 모바일 개발의 전체 지도와 단계별 학습 로드맵을 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
모바일 앱 개발을 처음 시작하는 분을 위한 출발점입니다. 네이티브·크로스플랫폼·하이브리드 방식의 차이, Android(Kotlin)와 Flutter 중 무엇을 고를지, 앱의 생명주기와 아키텍처, 스토어 배포까지 — 모바일 개발의 전체 지도와 단계별 학습 로드맵을 정리합니다.
모바일 앱 개발을 처음 시작하는 분을 위한 출발점입니다. 네이티브·크로스플랫폼·하이브리드 방식의 차이, Android(Kotlin)와 Flutter 중 무엇을 고를지, 앱의 생명주기와 아키텍처, 스토어 배포까지 — 모바일 개발의 전체 지도와 단계별 학습 로드맵을 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
화면을 그리는 법에서 멈추지 않고, 상태, 데이터 요청, 라우팅, 접근성, 배포 단위까지 함께 봅니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 Mobile 입문 & 로드맵를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
Mobile 입문 & 로드맵를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
| 구분 | 웹 | 모바일 앱 |
|---|---|---|
| 배포 | URL 접속 즉시 최신 버전 | 스토어 심사 → 사용자 업데이트 |
| 기기 기능 | 제한적 (브라우저 권한) | 카메라·GPS·센서·푸시 전면 활용 |
| 오프라인 | 제한적 | 로컬 DB로 오프라인 동작 가능 |
| 성능 | 브라우저 엔진에 의존 | 네이티브 수준의 부드러운 애니메이션 |
| 생명주기 | 탭 열림/닫힘 | 백그라운드 전환, 시스템에 의한 강제 종료 |
3가지 개발 방식: 네이티브 · 크로스플랫폼 · 하이브리드은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 방식 | 대표 기술 | 장점 | 단점 |
|---|---|---|---|
| 네이티브 | Android: Kotlin + Jetpack Compose / iOS: Swift + SwiftUI | 최고 성능, 최신 OS 기능 즉시 사용 | 플랫폼별로 두 번 개발 |
| 크로스플랫폼 | Flutter(Dart), React Native(JS/TS) | 코드 하나로 Android·iOS 동시 개발 | 일부 네이티브 기능은 브릿지 필요 |
| 하이브리드 / PWA | WebView 앱, PWA | 웹 기술 재사용, 가장 빠른 개발 | 성능·기기 기능 제약 |
Kotlin(Android) vs Flutter: 무엇부터 배울까은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 기준 | Kotlin + Android | Flutter |
|---|---|---|
| 지원 플랫폼 | Android (Kotlin Multiplatform으로 확장 가능) | Android, iOS, 웹, 데스크톱 |
| 언어 | Kotlin — 백엔드(Spring)에서도 사용 | Dart — Flutter 전용에 가까움 |
| UI 방식 | Jetpack Compose (선언형) | 위젯 트리 (선언형) |
| 채용 시장 | 국내 대기업·금융 앱 Android 포지션 | 스타트업·신규 서비스에서 증가 |
| 추천 대상 | Android 전문가, 네이티브 깊이 추구 | 1인 개발, 빠른 MVP, 양 플랫폼 동시 출시 |
| 가이드 | Kotlin, Android | Flutter |
모바일 핵심 개념은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 개념 | 의미 | 놓치면 생기는 문제 |
|---|---|---|
| 생명주기 (Lifecycle) | 앱·화면이 생성 → 포그라운드 → 백그라운드 → 종료되는 단계 | 화면 회전 시 입력 데이터 유실, 메모리 누수 |
| 메인 스레드 | UI를 그리는 유일한 스레드 | 네트워크·DB 작업을 올리면 화면 멈춤(ANR) |
| 선언형 UI | 상태를 바꾸면 화면이 다시 그려지는 방식 | 상태와 화면 불일치 |
| 권한 (Permission) | 카메라·위치 등은 사용자 허용 필요 | 권한 거부 시 크래시 |
| 로컬 저장소 | Room/SQLite, DataStore, SharedPreferences | 오프라인 시 빈 화면 |
| 네비게이션 | 화면 간 이동과 뒤로 가기 스택 | 뒤로 가기 버튼 오동작 |
여기서는 첫 화면 만들기: 선언형 UI 맛보기을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
remember { mutableStateOf(0) }로 상태를 만들고, 값이 바뀌면 화면이 자동으로 다시 그려집니다. Flutter의 setState, React의 useState와 같은 아이디어입니다.@Composable
fun CounterScreen() {
var count by remember { mutableStateOf(0) } // 상태 선언
Column(
modifier = Modifier.fillMaxSize().padding(24.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(text = "눌린 횟수: $count", style = MaterialTheme.typography.headlineMedium)
Spacer(Modifier.height(16.dp))
Button(onClick = { count++ }) { // 상태만 바꾸면 화면이 갱신됨
Text("눌러보세요")
}
}
}앱 아키텍처: MVVM과 단방향 데이터 흐름은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 계층 | 역할 | Android | Flutter |
|---|---|---|---|
| UI | 상태를 받아 그리기, 사용자 이벤트 전달 | Composable | Widget |
| ViewModel / 상태 관리 | 화면 상태 보관, 이벤트 처리, 생명주기 대응 | ViewModel + StateFlow | Provider, Riverpod, Bloc |
| Repository | 네트워크·로컬 DB 중 어디서 데이터를 가져올지 결정 | Repository 클래스 | Repository 클래스 |
| 데이터 소스 | API 호출, 로컬 DB 접근 | Retrofit, Room | dio/http, sqflite, drift |
시작 전 준비물은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 영역 | 무엇을 | 어느 정도 |
|---|---|---|
| 프로그래밍 언어 | Kotlin 또는 Dart | 클래스, 널 안정성, 람다, 코루틴/async |
| 객체지향 | 클래스, 인터페이스, 상속 vs 조합 | 필수 |
| 개발 환경 | Android Studio, 에뮬레이터 또는 실기기 | PC 메모리 16GB 이상 권장 |
| HTTP · JSON | REST API 호출과 응답 파싱 | API 연동 시 필요 |
| Git | 버전 관리 | 필수 |
단계별 로드맵: 첫 화면부터 스토어 출시까지은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 단계 | 목표 | 학습 내용 | 가이드 | 완료 체크 |
|---|---|---|---|---|
| 0. 언어 | Kotlin 또는 Dart | 널 안정성, 컬렉션, 람다, 코루틴/async | Kotlin | 콘솔 앱으로 문법 연습 |
| 1. UI 기초 | 화면 구성 | 레이아웃, 리스트, 입력, 테마 | Android, Flutter | 로그인 + 목록 화면 |
| 2. 상태 & 네비게이션 | 여러 화면 앱 | 상태 관리, 화면 이동, 인자 전달 | Android, Flutter | 목록 → 상세 → 수정 흐름 |
| 3. 네트워크 | 서버 데이터 연동 | REST 호출, JSON 파싱, 로딩·에러 처리 | Android | 공공 API 연동 앱 |
| 4. 로컬 저장 | 오프라인 지원 | Room/SQLite, 캐시 전략 | Android | 비행기 모드에서도 목록 표시 |
| 5. 아키텍처 | 유지보수 가능한 구조 | MVVM, Repository, 의존성 주입 | Android | 계층 분리 리팩터링 |
| 6. 기기 기능 | 모바일다운 기능 | 카메라, 위치, 푸시 알림, 권한 | Android, Flutter | 사진 업로드 + 푸시 |
| 7. 품질 & 출시 | 스토어 배포 | 테스트, 크래시 리포트, 서명, 스토어 등록 | Flutter | Play Store 내부 테스트 배포 |
12주 학습 플랜: 하루 1~2시간 기준은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 주차 | 주제 | 결과물 |
|---|---|---|
| 1~2주 | Kotlin(또는 Dart) 문법 | 문법 연습 콘솔 앱 |
| 3~4주 | UI 기초: 레이아웃, 리스트, 입력 | 메모 앱 화면 |
| 5주 | 상태 관리 + 네비게이션 | 메모 목록 → 상세 → 편집 |
| 6~7주 | 네트워크 연동 | 날씨·뉴스 API 앱 |
| 8주 | 로컬 DB | 메모 앱 로컬 저장 + 검색 |
| 9주 | MVVM 아키텍처 | 계층 분리 리팩터링 |
| 10주 | 카메라·위치·푸시 | 사진 일기 앱 |
| 11주 | 테스트 + 크래시 리포팅 | ViewModel 단위 테스트 |
| 12주 | 스토어 배포 | Play Store 내부 테스트 트랙 배포 |
프로젝트 아이디어: 난이도별은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 난이도 | 프로젝트 | 배우는 것 |
|---|---|---|
| ★☆☆ | 습관 체크 앱 | 리스트, 상태, 로컬 저장 |
| ★★☆ | 날씨 앱 (현재 위치 기반) | 위치 권한, API 연동, 로딩 처리 |
| ★★☆ | 가계부 앱 + 월별 차트 | 로컬 DB, 집계, 차트 라이브러리 |
| ★★★ | 사진 일기 + 클라우드 동기화 | 카메라, 파일 업로드, 오프라인 동기화 |
| ★★★ | 채팅 앱 | 실시간 통신, 푸시 알림, 페이징 |
모바일 입문자가 자주 하는 실수은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 실수 | 문제 | 대신 이렇게 |
|---|---|---|
| 메인 스레드에서 네트워크·DB 작업 | 화면 멈춤, ANR | 코루틴(Dispatchers.IO) / async |
| 화면 회전·백그라운드 전환 미고려 | 입력 데이터 유실 | ViewModel·저장 상태로 보존 |
| 권한 거부 상황 미처리 | 크래시 또는 기능 먹통 | 거부 시 안내 화면과 대체 흐름 |
| 에뮬레이터에서만 테스트 | 실기기 성능·해상도 문제 발견 못함 | 저사양 실기기 테스트 포함 |
| 모든 로직을 화면 코드에 작성 | 테스트 불가, 재사용 불가 | ViewModel·Repository로 분리 |
| 서명 키(keystore) 분실 | 앱 업데이트 불가 | 서명 키 안전하게 백업, Play 앱 서명 사용 |
핵심 용어 사전은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 용어 | 한 줄 설명 |
|---|---|
| Activity / Fragment | Android 화면의 기본 단위 (Compose에서는 주로 단일 Activity) |
| Composable | Jetpack Compose에서 UI를 그리는 함수 |
| Widget | Flutter에서 UI를 구성하는 모든 요소 |
| ViewModel | 화면 상태를 보관하고 생명주기 변화에도 유지되는 객체 |
| 코루틴 (Coroutine) | Kotlin의 경량 비동기 처리 방식 |
| ANR | Application Not Responding — 메인 스레드가 오래 막혀 앱이 응답 없음 |
| APK / AAB | Android 설치 파일 / Play Store 배포용 번들 형식 |
| Hot Reload | 앱을 재시작하지 않고 코드 변경을 즉시 반영하는 기능 |
| 딥 링크 | URL로 앱의 특정 화면을 바로 여는 기능 |
| FCM | Firebase Cloud Messaging — 푸시 알림 전송 서비스 |