PHpullh
학습 로드맵/모바일 앱

Kotlin

📱 모바일 앱 개발 학습 로드맵

순서대로 진행하되, 각 단계에서 작은 결과물을 만들고 다음 단계로 넘어가세요.

이 로드맵을 읽는 방법

아래 다섯 단계는 안드로이드 앱을 처음 만드는 사람이 실제로 발이 묶이는 지점을 기준으로 나눈 것입니다. 각 단계마다 무엇을 배우는지, 대략 얼마나 걸리는지, 무엇을 만들어야 그 단계를 통과했다고 볼 수 있는지, 그리고 가장 흔하게 막히는 한 가지를 함께 적었습니다.

시간 추정은 주당 8~12시간 정도를 쓸 수 있는 사람을 기준으로 한 범위입니다. 매일 두세 시간을 꾸준히 낼 수 있다면 짧아지고, 주말에만 몰아서 한다면 배 이상 길어집니다. 숫자를 목표로 삼기보다 "이 단계는 이 정도 분량이구나"를 가늠하는 용도로 보시면 됩니다.

순서를 지키라고 권하는 이유는 하나입니다. 앞 단계를 건너뛰면 뒤 단계에서 생긴 문제의 원인을 구분할 수 없기 때문입니다. Compose 화면이 갱신되지 않을 때 그것이 상태 관리 문제인지, 코루틴이 다른 스레드에서 값을 바꾼 문제인지, Kotlin의 리스트가 불변이라는 사실을 잊은 문제인지 가려내려면 앞 단계의 감각이 필요합니다. 전체 호흡을 잡는 데는 첫 100일 로드맵이 도움이 됩니다.

다섯 단계를 하나씩 뜯어보기

1단계 · Kotlin 기초 문법

문법 전체를 훑는 대신 안드로이드 코드에서 매일 쓰이는 것만 먼저 잡습니다. val과 var의 차이, 널 가능 타입과 ?. ?: 연산자, data class, 컬렉션의 map/filter/first 같은 함수, 람다를 인자로 받는 함수, when 표현식, sealed class, 그리고 확장 함수입니다. 코루틴은 여기서 개념만 훑고 4단계에서 제대로 다룹니다.

분량은 대략 2~3주입니다. 다른 언어를 이미 한 번 다뤄봤다면 1주로도 충분하고, 프로그래밍 자체가 처음이라면 4주 이상 잡아야 합니다. 통과 기준은 남이 쓴 Kotlin 코드를 읽으면서 "여기서 왜 ?가 붙었는지"를 설명할 수 있는 상태입니다. 문법을 외웠는지가 아니라 읽히는지가 기준입니다.

체크포인트 프로젝트는 화면 없이 콘솔에서 도는 작은 프로그램입니다. 지출 내역 리스트를 data class로 정의하고, 카테고리별 합계를 구하고, 금액 상위 3건을 뽑아 문자열로 출력하는 정도면 충분합니다. UI를 붙이지 않는 것이 핵심입니다.

가장 흔하게 막히는 지점은 널 안정성입니다. 자바나 파이썬을 하다 온 사람은 컴파일러가 널 때문에 빨간 줄을 그을 때마다 !!를 붙여 넘어가는데, 이렇게 배우면 나중에 앱이 실행 중에 죽는 이유를 영영 이해하지 못합니다. !!를 쓰고 싶을 때마다 "이 값이 널이면 화면에 뭘 보여줘야 하나"를 먼저 정하는 습관을 들이시기 바랍니다. 문법 정리는 Kotlin 학습 자료에서 예제와 함께 보실 수 있고, 자바와의 차이가 궁금하다면 Java 자료를 나란히 두고 비교해도 좋습니다.

2단계 · Android Studio와 프로젝트 구조

이 단계는 배우는 양은 적은데 시간은 이상하게 많이 먹습니다. 새 프로젝트를 만들고, 에뮬레이터나 실제 기기에서 실행하고, Gradle이 무엇을 하는지 대략 알고, build.gradle.kts에 라이브러리 하나를 추가해 동기화까지 성공시키는 것이 목표입니다. 여기에 AndroidManifest의 역할, res 디렉터리와 문자열 리소스, Logcat에서 로그와 스택 트레이스를 읽는 법을 더합니다.

보통 3일에서 1주입니다. 통과 기준은 프로젝트를 처음부터 다시 만들어 라이브러리를 하나 붙이고 앱을 기기에 띄우는 과정을 검색 없이 해내는 것입니다. 체크포인트 프로젝트라고 할 것도 없이, 버튼을 누르면 Logcat에 로그가 찍히는 화면 하나면 됩니다. 대신 그 로그를 필터로 걸러서 찾아보는 것까지 해보세요.

가장 흔한 함정은 Gradle 동기화 오류를 만났을 때 검색 결과의 설정을 아무거나 복사해 붙이는 것입니다. 대개 원인은 셋 중 하나입니다. JDK 버전이 안 맞거나, 라이브러리 버전이 compileSdk와 안 맞거나, 저장소 선언이 빠진 것입니다. 오류 메시지의 첫 줄을 끝까지 읽는 습관이 여기서 만들어집니다. 이 감각은 디버깅은 재능이 아니라 순서에서 다룬 방식과 같습니다.

TIP

에뮬레이터가 느려서 진도가 안 나가는 경우가 많습니다. 개발자 옵션을 켠 실제 안드로이드 기기가 있다면 USB로 연결해 쓰는 편이 학습 속도에 훨씬 유리합니다.

3단계 · Jetpack Compose로 화면 만들기

Compose는 "화면을 그리는 명령"이 아니라 "상태를 화면으로 바꾸는 함수"라는 사고 전환이 전부입니다. 배울 것은 컴포저블 함수, Column·Row·Box와 Modifier, LazyColumn으로 목록 그리기, remember와 mutableStateOf로 상태 보관하기, 상태를 위로 끌어올리는 패턴(state hoisting), 그리고 화면 회전 시 상태를 지키는 rememberSaveable입니다.

STATE HOISTING

@Composable
fun CounterScreen() {
    var count by rememberSaveable { mutableStateOf(0) }
    Counter(count = count, onIncrement = { count++ })
}

@Composable
fun Counter(count: Int, onIncrement: () -> Unit) {
    Column(modifier = Modifier.padding(16.dp)) {
        Text(text = "담은 개수: $count")
        Button(onClick = onIncrement) { Text("추가") }
    }
}

위 코드에서 Counter는 자기 상태를 갖지 않습니다. 값과 콜백만 받기 때문에 테스트하기도, 미리보기로 확인하기도 쉽습니다. 이 구조가 몸에 붙으면 Compose에서 겪는 문제의 절반이 사라집니다.

분량은 3~4주 정도입니다. 통과 기준은 디자인 시안 없이도 목록 화면과 상세 화면을 만들고 둘 사이를 이동시킬 수 있는 상태입니다. 체크포인트 프로젝트로는 로컬 데이터만 쓰는 할 일 앱을 권합니다. 항목 추가, 완료 체크, 삭제, 그리고 앱을 껐다 켜도 목록이 남아 있게 하는 것까지입니다.

가장 흔하게 막히는 지점은 "값을 바꿨는데 화면이 안 바뀐다"입니다. 원인은 거의 항상 상태가 State가 아니라 평범한 변수이거나, 리스트를 add로 제자리에서 수정해 Compose가 변경을 감지하지 못한 경우입니다. 리스트는 새 리스트로 교체한다는 원칙을 세워두면 대부분 해결됩니다. 무엇을 만들지 정하기 어렵다면 끝낼 수 있는 첫 프로젝트 고르기를 먼저 읽어보세요.

4단계 · 네트워크와 API 연동

여기서 앱이 처음으로 바깥 세상과 연결됩니다. 배울 것은 HTTP 요청과 응답의 구조, JSON을 데이터 클래스로 변환하는 직렬화, Retrofit이나 Ktor 같은 클라이언트 사용법, 그리고 코루틴입니다. suspend 함수, viewModelScope, 그리고 화면 상태를 로딩·성공·오류 세 가지로 나누어 표현하는 방식을 익힙니다.

3~4주를 잡으시면 됩니다. 통과 기준은 네트워크가 끊긴 상태에서 앱을 켰을 때 크래시 없이 오류 메시지가 뜨고, 다시 연결하면 재시도가 되는 것입니다. 성공 경로만 되는 것은 통과가 아닙니다. 체크포인트 프로젝트는 공개 API 하나를 골라 목록과 상세를 보여주는 앱입니다. 여기에 로딩 표시, 오류 화면, 당겨서 새로고침을 붙이면 실무 구조의 축소판이 됩니다.

가장 흔한 문제는 응답 JSON의 필드가 가끔 비어 오는 경우를 처리하지 않는 것입니다. 문서에 필수라고 적힌 필드도 실제로는 null이 옵니다. 파싱 오류가 나면 원본 응답을 로그로 찍어 눈으로 확인하는 것이 가장 빠릅니다. HTTP와 JSON 자체가 아직 흐릿하다면 언어별 HTTP 요청 비교와 JSON 처리 비교를, 비동기 개념이 흔들린다면 비동기 처리 비교를 보시면 언어를 넘어 공통 구조가 보입니다.

WARNING

API 키를 소스 코드에 그대로 넣고 저장소에 올리는 실수가 이 단계에서 가장 자주 나옵니다. 키는 로컬 설정 파일로 빼고, 저장소에 올라가지 않도록 제외 목록에 넣으세요. 관련 내용은 첫 프로젝트를 위한 보안 기본기에 정리해 두었습니다.

5단계 · Play Store 출시

기술적으로 어려운 단계는 아니지만, 코드가 아닌 일이 대부분이라 처음 하면 예상보다 오래 걸립니다. 배울 것은 애플리케이션 ID와 버전 코드, 릴리스 서명 키 생성과 보관, R8/ProGuard가 켜진 릴리스 빌드에서만 나는 오류 잡기, App Bundle 만들기, 개인정보처리방침 페이지 준비, 데이터 안전 섹션 작성, 그리고 내부 테스트 트랙으로 먼저 배포해 보는 것입니다.

순수 작업 시간은 2~5일이지만 심사 대기와 보완 요청까지 감안하면 2주 정도로 잡는 편이 마음이 편합니다. 통과 기준은 명확합니다. 내가 아닌 다른 사람의 기기에 스토어를 통해 앱이 설치되고 정상 동작하는 것입니다.

가장 흔하게 막히는 지점은 두 가지입니다. 하나는 릴리스 서명 키를 잃어버리는 것입니다. 키를 잃으면 같은 앱으로 업데이트를 올릴 수 없으므로 백업 위치를 처음부터 정해두어야 합니다. 다른 하나는 디버그 빌드에서는 잘 되던 앱이 릴리스 빌드에서 죽는 경우인데, 대개 난독화 과정에서 리플렉션으로 참조되던 데이터 클래스가 사라진 탓입니다. 출시 전에 반드시 릴리스 빌드를 기기에 직접 설치해 확인하세요.

한 번 배포해 보면 코드를 쓰는 방식 자체가 달라집니다. 이 변화에 대해서는 한 번의 배포가 코드를 바꾼다에 더 적어두었습니다.

지금은 건너뛰거나 미뤄도 되는 것

초반에 시간을 가장 많이 빼앗기는 것은 정작 필요하지 않은 주제들입니다. 아래는 첫 앱을 출시할 때까지 미뤄도 손해가 없는 항목입니다.

  • 의존성 주입 프레임워크 — 화면이 서너 개일 때는 생성자로 넘기는 편이 오히려 읽기 쉽습니다. 수동 연결이 귀찮아졌을 때 도입하면 됩니다.
  • 멀티 모듈 구조 — 빌드가 느려서 참기 힘들어지는 시점이 도입 시점입니다. 그 전에는 관리 비용만 늘어납니다.
  • 커스텀 애니메이션과 그래픽스 — 눈에는 잘 띄지만 앱의 완성도와는 거의 무관합니다.
  • iOS 동시 지원, 크로스 플랫폼 프레임워크 — 한 플랫폼에서 끝까지 가본 다음에 결정할 문제입니다.
  • 아키텍처 패턴 논쟁 — 화면 상태를 한 곳에 모으는 것까지만 하고, 이름 붙이기는 나중에 해도 됩니다.

반대로 미루면 안 되는 것도 있습니다. 버전 관리, 오류 로그를 읽는 습관, 그리고 아주 작은 테스트입니다. 테스트는 거창하게 시작할 필요가 없습니다. 계산 함수 하나에 검증 두 줄을 붙이는 것부터가 작은 케이스로 테스트를 시작하는 방법입니다.

현실적인 전체 일정

주당 8~12시간을 기준으로 하면 1단계부터 5단계까지 대략 3~5개월입니다. 처음 두 달은 진도가 빨라 보이고, 3단계와 4단계에서 속도가 눈에 띄게 느려집니다. 이때 느려지는 것은 정상입니다. 문법을 읽는 일에서 스스로 구조를 정하는 일로 성격이 바뀌기 때문입니다.

  1. 1~4주차: Kotlin 문법과 콘솔 프로그램
  2. 5~6주차: 개발 환경, 빌드, 로그 읽기
  3. 7~10주차: Compose 화면과 로컬 데이터 할 일 앱
  4. 11~14주차: API 연동, 코루틴, 오류 상태 처리
  5. 15~16주차: 릴리스 빌드와 내부 테스트 배포

일정이 밀리면 단계를 줄이지 말고 체크포인트 프로젝트의 범위를 줄이시기 바랍니다. 기능 두 개짜리 앱을 끝까지 출시하는 편이 기능 열 개짜리 미완성 앱보다 훨씬 많은 것을 남깁니다. 코드를 남에게 보여줄 준비가 되었다면 첫 코드 리뷰에서 살아남기가 다음 읽을거리로 적당합니다.

이어서 볼 자료