도서 소개
안드로이드 스튜디오와 코틀린을 활용해 앱을 만드는 기초부터 시작해, 사용자 친화적인 화면 설계, 백그라운드 작업, 데이터 관리, 앱 내비게이션 등 앱 개발의 핵심 기술을 익힐 수 있도록 돕는다.Retrofit, Glide와 같은 필수 라이브러리와 코루틴, 플로우를 사용한 비동기 처리, 의존성 주입과 아키텍처 구성 요소 등 실무에서 꼭 필요한 기술도 자세히 다룬다. 또한, 젯팩 컴포즈를 통해 효율적으로 UI를 개발하고, 앱 테스트 및 구글 플레이 스토어 배포 과정까지 실습을 통해 배우게 된다.퀴즈 앱, 뉴스 리더, 날씨 앱 등 다양한 프로젝트를 따라 하다 보면 안드로이드 앱 개발의 전반적인 과정을 완벽히 익히고 자신만의 창의적인 앱을 만들 준비가 될 것이다.
출판사 리뷰
◈ 이 책에서 다루는 내용 ◈
◆ 코틀린을 사용해 유지보수가 용이하고 확장 가능한 앱 제작
◆ 안드로이드 앱 개발 생명주기 이해
◆ 구글 안드로이드 아키텍처 컴포넌트로 앱 개발 단순화
◆ 표준 라이브러리를 사용한 의존성 주입 및 데이터 파싱
◆ 리포지토리 패턴을 적용해 외부 소스에서 데이터 검색
◆ 젯팩 컴포즈를 사용한 사용자 인터페이스 구축
◆ 코루틴, 플로우 API를 사용한 안드로이드 비동기 프로그래밍
◆ 구글 플레이 스토어에 앱 출시
◈ 이 책의 대상 독자 ◈
코틀린을 사용해 자신만의 앱을 개발하고 싶지만 어떻게 시작해야 할지 확신이 없다면 이 책이 도움이 될 것이다. 코틀린 프로그래밍 언어에 대한 기본적인 이해만 있다면 이 책에서 다루는 주제를 더 빠르게 이해하는 데 도움이 된다.
◈ 이 책의 구성 ◈
1장, ‘첫 번째 앱 만들기’에서는 안드로이드 스튜디오를 사용해 첫 번째 안드로이드 앱을 만드는 방법을 보여준다. 여기에서는 안드로이드 스튜디오 프로젝트를 생성하고 그 구성 요소를 이해하며, 가상 기기에서 앱을 빌드하고 배포하는 데 필요한 도구를 알아본다. 또한 안드로이드 앱의 구조를 살펴본다.
2장, ‘사용자 화면 흐름 생성’에서는 안드로이드 생태계와 안드로이드 앱의 구성 요소를 자세히 다룬다. 액티비티(Activity)와 액티비티의 생명주기(Lifecycle), 인텐트(Intent), 태스크(Task)와 같은 개념을 소개하고, 상태 복원과 화면 간 또는 액티비티 간 데이터 전달도 다룬다.
3장, ‘프래그먼트를 사용한 UI 개발’에서는 사용자 인터페이스를 위한 기본적인 프래그먼트 사용 방법을 알아본다. 프래그먼트를 여러 방법으로 사용해 폰과 태블릿용 앱의 레이아웃을 구성하는 방법을 알아본다. 또한 젯팩 Navigation 컴포넌트를 사용하는 방법도 알아본다.
4장, ‘앱 내비게이션’에서는 앱의 다양한 내비게이션 유형을 다룬다. 슬라이딩 레이아웃을 사용한 내비게이션 드로어(Navigation Drawer), 바텀 내비게이션(Bottom Navigation), 탭 내비게이션(Tabbed Navigation)을 살펴본다.
5장, ‘필수 라이브러리: Retrofit, Moshi, Glide’에서는 Retrofit 라이브러리와 Moshi 라이브러리를 사용해 원격 데이터 소스에서 데이터를 가져와 코틀린 객체로 변환하는 방법을 알아본다. 또한 앱에 원격 이미지를 로드하는 Glide 라이브러리도 알아본다.
6장, ‘RecyclerView 생성 및 상호작용’에서는 목록을 만들고 RecyclerView 위젯을 사용해 표시하는 방법을 알아본다.
7장, ‘안드로이드 권한 및 구글 맵스’에서는 권한의 개념을 알아보고 앱이 특정 작업을 실행하기 위해 사용자로부터 권한을 요청하는 방법을 소개하며, Maps API도 알아본다.
8장, ‘서비스, WorkManager, 알림’에서는 안드로이드 앱에서 백그라운드 작업의 개념과 앱이 사용자에게 보이지 않는 상태로 특정 작업을 실행하는 방법을 자세히 살펴보며, 해당 작업에 대한 알림을 표시하는 방법을 알아본다.
9장, ‘젯팩 컴포즈를 사용한 사용자 인터페이스 구현’에서는 젯팩 컴포즈의 작동 방식, 스타일과 테마의 적용 방법, 레이아웃 파일을 사용하도록 생성된 프로젝트에서 젯팩 컴포즈를 사용하는 방법을 알아본다.
10장, ‘JUnit, Mockito, Espresso를 사용한 단위 테스트와 통합 테스트’에서는 안드로이드 앱의 다양한 테스트, 각 테스트 유형별로 사용되는 프레임워크, 테스트 주도 개발(TDD, Test-Driven Development)의 개념을 알아본다.
11장, ‘안드로이드 아키텍처 컴포넌트’에서는 안드로이드 젯팩 라이브러리에서 제공하는 컴포넌트들을 자세히 알아본다. 이는 ViewModel과 같은 컴포넌트를 사용해 비즈니스 로직을 UI 코드와 분리하는 데 도움을 준다. 또한 LiveData와 같이 구독 가능한 데이터 스트림을 사용해 데이터를 UI에 전달하는 방법을 알아본다. 마지막으로 룸(Room) 라이브러리를 살펴보며 데이터를 영속적으로 저장하는 방법을 분석한다.
12장, ‘데이터 저장’에서는 SharedPreferences에서 파일까지 장치에 데이터를 저장하는 다양한 방법을 알아본다. 또한 리포지토리(Repository) 개념을 소개해 앱의 특정 구현을 다른 계층으로 구조화하는 방법의 아이디어를 제공한다.
13장, ‘Dagger, Hilt, Koin을 사용한 의존성 주입’에서는 의존성 주입의 개념과 의존성 주입이 앱에 제공하는 이점을 알아본다. 의존성 관리에 도움이 되는 Dagger, Hilt 및 Koin과 같은 프레임워크를 소개한다.
14장, ‘코루틴 및 플로우’에서는 코루틴과 플로우를 사용해 백그라운드 작업과 데이터 조작을 수행하는 방법을 소개한다. 플로우의 다양한 연산자와 LiveData 변환을 사용해 데이터를 조작하고 표시하는 방법도 알아본다.
15장, ‘아키텍처 패턴’에서는 안드로이드 프로젝트를 구조화하기 위해 사용할 수 있는 아키텍처 패턴을 설명한다. 이 패턴은 여러 구성 요소로 프로젝트를 분리해 각각의 기능을 명확하게 나누는 데 도움이 된다. 이를 통해 코드를 개발, 테스트, 유지 관리하기 쉽게 만들 수 있다.
16장, ‘CoordinatorLayout과 MotionLayout을 사용한 애니메이션 및 전환’에서는 Coordinator Layout과 MotionLayout을 사용해 애니메이션과 뷰 전환으로 더 나은 앱을 만드는 방법을 알아본다.
17장, ‘구글 플레이에 앱 출시하기’에서는 앱을 구글 플레이에 출시하는 방법을 알아보며 이 책을 마무리한다. 출시 준비부터 구글 플레이 개발자 계정 생성, 마지막으로 앱을 출시하는 과정을 다룬다.
◈ 지은이의 말 ◈
지난 10년 동안 안드로이드는 앱 시장을 지배해 왔으며 개발자들은 점점 더 자신만의 안드로이드 앱을 만들기 위해 노력하고 있다. 이 책은 안드로이드 개발의 기초부터 시작해 안드로이드 앱 개발을 위한 코틀린 프로그래밍 언어와 안드로이드용 통합 개발 환경(IDE, Integrated Development Environment)인 안드로이드 스튜디오(Android Studio)의 사용법을 알려준다.
그런 다음 실습을 통해 앱을 만들고 가상 기기에서 앱을 실행하는 방법을 살펴본다. 앱 구조화부터 액티비티, 프래그먼트, 다양한 내비게이션 패턴을 사용해 사용자 인터페이스(UI, User Interface)를 구축하는 안드로이드 개발 기초를 다룬다. 각 장을 진행할수록 안드로이드의 RecyclerView를 사용해 데이터 목록을 효율적으로 표시하고 웹 서비스에서 데이터를 가져오고 이미지를 처리하는 데 익숙해질 것이다.
또한 매핑, 위치 서비스, 권한 모델에 대해 알아보고, 알림과 데이터 영속화 방법에 대해 알아본다. 그 후 젯팩 컴포즈(Jetpack Compose)를 사용해 사용자 인터페이스를 구축한다. 그다음으로 테스트를 다루면서 테스트 피라미드 전반에 대해 이해하게 될 것이다. 안드로이드 아키텍처 구성 요소(AAC, Android Architecture Components)를 사용해 코드를 깔끔하게 구조화하는 방법도 알아보고, 다양한 아키텍처 패턴과 의존성 주입의 장점도 알아본다.
비동기 프로그래밍을 위해 코루틴(Coroutine)과 플로우(Flow API)를 다룬다. 그 후에는 다시 UI에 초점을 맞춰 사용자가 앱과 상호작용할 때의 움직임과 전환 효과를 추가하는 방법을 알아본다. 마지막으로 인기 있는 영화를 검색하고 보여주는 재밌는 앱을 만들고, 구글 플레이에 앱을 출시하는 방법을 알아본다.
이 책을 마치면 코틀린을 사용해 완전한 기능을 갖춘 안드로이드 앱을 만드는 데 필요한 기술과 자신감을 갖게 될 것이다.
◈ 옮긴이의 말 ◈
안드로이드는 오늘날 가장 널리 사용되는 모바일 플랫폼 중 하나로, 그 영향력은 스마트폰을 넘어 다양한 기기로 확장되고 있다. 빠르게 변화하는 기술 트렌드와 복잡한 생태계는 개발자들에게 새로운 도전 과제를 끊임없이 던져준다. 이러한 상황에서, 실무에 바로 적용 가능한 최신 개발 기법과 기술을 다룬 양질의 자료를 만나는 것은 매우 중요한 일이다.
이 책은 안드로이드 개발의 최신 흐름을 따라가며, 개발자가 실무에서 꼭 알아야 할 핵심 기술들을 명확하고 체계적으로 설명하고 있다. 젯팩 컴포즈(Jetpack Compose), 안드로이드 아키텍처 구성 요소, 코루틴과 플로우를 비롯해 최신 기술과 다양한 아키텍처 패턴을 다루며, 안드로이드 개발 환경 전반을 폭넓게 탐구할 수 있도록 구성돼 있다.
이 책을 번역하며 감명받았던 점은, 단순히 기술을 나열하는 것이 아니라 독자가 실제로 작동하는 앱을 만들고 이를 완성해 가는 과정을 하나하나 안내한다는 점이었다. 특히 플레이스토어에 앱을 배포하는 과정을 포함해 개발의 시작부터 끝까지 실무 전반을 아우르는 종합적인 내용을 제공한다는 점이 인상적이었다. 실제로 이 책을 따라가다 보면 단순히 동작하는 앱을 만드는 것을 넘어 유지 보수와 확장이 용이한 실무 수준의 애플리케이션을 개발할 수 있는 자신감을 얻게 될 것이다.
번역 과정에서 특히 중점을 둔 부분은, 독자 여러분이 한국어로 된 내용을 통해 원활히 학습하고 실습할 수 있도록 최신 기술 용어와 코드를 현지화하면서도 원작자가 전달하고자 했던 의도와 맥락을 온전히 살리는 것이었다. 뿐만 아니라 번역 과정에서 최신 안드로이드 버전에 맞춰 코드를 업데이트해 독자가 최신 환경에서도 어려움 없이 학습하고 실습할 수 있도록 배려했다. 새로운 버전에 맞춘 코드와 번역이 실무 환경에서도 효과적으로 적용되기 바란다. 부족한 부분이 있다면 너그럽게 이해해 주길 부탁드리며, 이 책이 여러분의 개발 여정에 훌륭한 동반자가 되길 진심으로 바란다.
작가 소개
지은이 : 알렉스 포레스터
모바일 및 웹 개발, 콘텐츠 관리 시스템 분야에서 20년 이상 일해 온 경험 많은 소프트웨어 개발자다. 2010년부터 안드로이드를 다뤘고, 스카이(Sky), 자동차 협회(The Automobile Association), HSBC, 디스커버리 채널(Discovery Channel) 및 O2와 같은 대기업을 대상으로 다양한 산업에서 주요 앱을 개발했다. 아내, 딸과 함께 하트퍼드셔에 거주하고 있다. 개발 작업 이외에는 칠턴 힐스에서 럭비와 러닝을 즐긴다.
지은이 : 알렉산드루 덤브라반
안드로이드 앱 개발 분야에서 10년 이상의 경력을 가진 안드로이드 개발자로, 2016년 런던으로 이사한 이후 주로 핀테크 앱에 집중하고 있다. 여가 시간에는 비디오 게임, 영화 그리고 가끔씩 체육관 방문을 즐긴다.
지은이 : 조마르 티그칼
모바일 및 소프트웨어 개발 분야에서 14년 이상의 경력을 가진 안드로이드 개발자다. 2012년부터 소규모 스타트업과 대기업들을 대상으로 안드로이드 앱 개발의 여러 단계에 참여해 왔다. 또한 안드로이드에 대한 강연, 교육 및 워크숍을 진행해 왔다. 여가 시간에는 달리기와 독서를 즐긴다. 아내 셀린과 함께 캐나다 브리티시 컬럼비아주 밴쿠버에 거주하고 있다.
지은이 : 에란 부즈나
데스크톱 앱, 웹 사이트, 상호작용형 놀이기구 및 모바일 앱 개발 분야에서 20년 이상의 경력을 가진 개발자다. 2011년부터 안드로이드를 다뤘으며, 스타트업(JustEat와 Plume Design)부터 대규모 회사(Sky 및 HSBC) 및 기업 군까지 다양한 클라이언트를 위해 앱을 개발하고 모바일 팀을 이끌었다. 보드게임에 열정적이며(수백 개의 컬렉션을 소유하고 있다) 트랜스포머 컬렉션을 가진 것을 자랑스러워한다. 아내인 레아와 함께 잉글랜드의 브렌트우드에 거주하고 있다.
목차
1부 - 안드로이드 기초
01장 첫 번째 앱 만들기
__기술적 요구 사항
__안드로이드 스튜디오를 사용한 안드로이드 프로젝트 생성
____실습 1.01: 앱을 위한 안드로이드 스튜디오 프로젝트 생성
__가상 기기 설정 및 앱 실행
____실습 1.02: 에뮬레이터 설정 및 에뮬레이터에서 앱 실행
__안드로이드 매니페스트
____실습 1.03: 안드로이드 매니페스트 인터넷 권한 설정
__그래들을 사용한 앱 빌드, 구성 및 종속성 관리
____프로젝트 수준의 build.gradle 파일
____앱 수준의 build.gradle 파일
____실습 1.04: 앱에 테마를 적용하기 위해 머티리얼 디자인을 사용하는 방법
__안드로이드 앱 구조
____실습 1.05: 커스텀 인사말 표시를 위한 대화형 UI 요소 추가
____레이아웃 파일에서 뷰에 접근
____추가적인 입력 유효성 검사
____과제 1.01: RGB 색상을 생성하는 앱 제작
__요약
02장 사용자 화면 흐름 생성
__기술적 요구 사항
__액티비티 생명주기
____실습 2.01: 액티비티 콜백 로깅
__액티비티 상태 저장 및 복원
____실습 2.02: 레이아웃에서 상태 저장 및 복원
____실습 2.03: 콜백을 사용해 상태 저장 및 복원
__인텐트를 통한 액티비티 간 상호작용
____실습 2.04: 인텐트 소개
____실습 2.05: 액티비티에서 결과 받기
__인텐트, 태스크 및 실행 모드
____실습 2.06: 액티비티 실행 모드 설정
____과제 2.01: 로그인 양식 만들기
__요약
03장 프래그먼트를 사용한 UI 개발
__기술적 요구 사항
__프래그먼트 생명주기
____onAttach
____onCreate
____onCreateView
____onViewCreated
____onActivityCreated
____onStart
____onResume
____onPause
____onStop
____onDestroyView
____onDestroy
____onDetach
____실습 3.01: 기본 프래그먼트 추가 및 프래그먼트 생명주기
____실습 3.02: 액티비티에 정적 프래그먼트 추가
__정적 프래그먼트와 듀얼 패인 레이아웃
____실습 3.03: 정적 프래그먼트를 사용한 듀얼 패인 레이아웃
__동적 프래그먼트
____실습 3.04: 액티비티에 동적 프래그먼트 추가
__젯팩 Navigation
____실습 3.05: 젯팩 Navigation 그래프 추가
____과제 3.01: 행성 퀴즈 만들기
__요약
04장 앱 내비게이션
__기술적 요구 사항
__내비게이션 개요
__내비게이션 드로어
____실습 4.01: 내비게이션 드로어를 포함한 앱 개발
__바텀 내비게이션
____실습 4.02: 앱에 바텀 내비게이션 추가
__탭 내비게이션
____실습 4.03: 앱 내비게이션을 위한 탭 사용
____과제 4.01: 기본 및 보조 내비게이션 구성
__요약
2부 - 네트워크 호출 표시
05장 필수 라이브러리: Retrofit, Moshi, Glide
__기술적 요구 사항
__REST, API, JSON, XML 소개
__네트워크 엔드포인트에서 데이터 가져오기
____실습 5.01: API에서 데이터 읽기
__JSON 응답 파싱
____실습 5.02: API 응답에서 이미지 URL 추출
__원격 URL에서 이미지 로드
____실습 5.03: 획득한 URL에서 이미지 로드
____과제 5.01: 현재 날씨 표시
__요약
06장 RecyclerView 생성 및 상호작용
__기술적 요구 사항
__레이아웃에 RecyclerView 추가
____실습 6.01: 기본 액티비티에 RecyclerView 추가
__RecyclerView 채우기
____실습 6.02: RecyclerView 채우기
__RecyclerView 클릭 응답
____실습 6.03: 클릭에 대한 응답
__다양한 아이템 유형 지원
____실습 6.04: RecyclerView에 제목 추가
__스와이프를 통한 아이템 제거
____실습 6.05: 스와이프 삭제 기능 추가
__인터랙티브하게 아이템 추가
____실습 6.06: 고양이 추가 버튼 구현
____과제 6.01: 목록 관리
__요약
07장 안드로이드 권한 및 구글 맵스
__기술적 요구 사항
__사용자 권한 요청
____실습 7.01: 위치 권한 요청
__사용자 위치 지도 표시
____실습 7.02: 사용자의 현재 위치 얻기
__지도 클릭과 커스텀 마커
____실습 7.03: 클릭한 위치에 사용자 지정 마커 추가
____과제 7.01: 자동차의 주차 위치를 찾는 앱 만들기
__요약
08장 서비스, WorkManager, 알림
__기술적 요구 사항
__WorkManager를 사용한 백그라운드 작업 시작
____실습 8.01: WorkManager 클래스로 백그라운드 작업 실행
__사용자가 인지할 수 있는 백그라운드 작업: 포어그라운드 서비스
____실습 8.02: 포어그라운드 서비스로 고양이 비밀 요원 작업 현황 파악
____과제 8.01: 물 마시기 알림
__요약
09장 젯팩 컴포즈를 사용한 사용자 인터페이스 구현
__기술적 요구 사항
__젯팩 컴포즈란?
____실습 9.1: 첫 컴포즈 화면
__사용자 액션 처리
____실습 9.02: 사용자 입력 처리
__컴포즈 테마 설정
____실습 9.03: 테마 적용
____기존 프로젝트에 컴포즈 적용
____과제 9.01: 첫 컴포즈 앱
__요약
3부 - 테스트 및 코드 구조
10장 JUnit, Mockito, Espresso를 사용한 단위 테스트와 통합 테스트
__기술적 요구 사항
__테스트 유형
__JUnit
__안드로이드 스튜디오 테스팅 팁
__Mockito
____실습 10.01: 숫자의 합 테스트
__통합 테스트
____Robolectric
____Espresso
____실습 10.02: 이중 통합
__UI 테스트
____젯팩 컴포즈 테스트
____실습 10.03: 랜덤 대기 시간
__TDD
____실습 10.04: TDD를 사용한 숫자 합 계산
____과제 10.01: TDD로 개발하기
__요약
11장 안드로이드 아키텍처 구성 요소
__기술적 요구 사항
__안드로이드 컴포넌트 개요
__ViewModel
____실습 11.1: 공유 ViewModel
__데이터 스트림
____LiveData
____실습 11.02: 라이브 데이터로 관찰
____추가 데이터 스트림
__룸
____엔티티
____DAO
____데이터베이스 설정
____서드파티 프레임워크
____실습 11.03: 간단한 룸 데이터베이스 만들기
____과제 11.01: 쇼핑 메모 앱
__요약
12장 데이터 저장
__기술적 요구 사항
__프리퍼런스와 데이터 스토어
____SharedPreferences
____실습 12.01: SharedPreferences 래핑
____DataStore
____실습 12.02: 프리퍼런스 DataStore
__파일
____내부 저장소
____외부 저장소
____FileProvider
____저장소 액세스 프레임워크(SAF)
____에셋 파일
____실습 12.03: 파일 복사
__범위 지정 저장소
____카메라, 미디어 저장소
____실습 12.04: 사진 촬영
____과제 12.01: 강아지 다운로더
__요약
13장 Dagger, Hilt, Koin을 사용한 의존성 주입
__기술적 요구 사항
__의존성 주입의 필요성
__수동 DI
____실습 13.01: 수동 주입
__Dagger 2
____컨슈머
____프로바이더
____커넥터
____한정자
____스코프
____서브컴포넌트
____실습 13.02: Dagger 주입
__Hilt
____실습 13.03: Hilt 주입
__Koin
____실습 13.04: Koin 주입
____과제 13.01: 주입된 리포지토리
__요약
4부 - 앱 다듬고 배포하기
14장 코루틴 및 플로우
__기술적 요구 사항
__안드로이드에서 코루틴 사용
____코루틴 생성
____프로젝트에 코루틴 추가
____실습 14.01: 안드로이드 앱에서 코루틴 사용
__LiveData 변환
____실습 14.02: LiveData 변환
__안드로이드에서 플로우 사용
____안드로이드에서 플로우 수집
____플로우 빌더로 플로우 생성
____플로우와 연산자 사용
____실습 14.03: 안드로이드 앱에서 플로우 사용
____과제 14.01: TV 가이드 앱 만들기
__요약
15장 아키텍처 패턴
__기술적 요구 사항
__MVVM으로 시작하기
____안드로이드에서 데이터 바인딩 사용
____실습 15.01: 안드로이드 프로젝트에서 데이터 바인딩 사용
__Retrofit과 Moshi 사용
____리포지토리 패턴 구현
____실습 15.02: 안드로이드 프로젝트에서 룸과 함께 리포지토리 사용
__WorkManager 사용
____실습 15.03: 안드로이드 프로젝트에 WorkManager 추가
____과제 15.01: TV 가이드 앱 업데이트
__요약
16장 CoordinatorLayout과 MotionLayout을 사용한 애니메이션 및 전환
__기술적 요구 사항
__액티비티 전환
____XML로 액티비티 전환 추가
____코드로 액티비티 전환 추가
____액티비티 전환을 적용한 액티비티 실행
____실습 16.01: 액티비티 전환 생성
____공유 요소 전환 추가
____공유 요소 전환을 적용한 액티비티 실행
____실습 16.02: 구성 요소 전환 생성
__CoordinatorLayout을 사용한 애니메이션
__MotionLayout을 사용한 애니메이션
____MotionLayout 추가
____MotionLayout으로 애니메이션 생성
____실습 16.03: MotionLayout으로 애니메이션 추가
____모션 에디터
____MotionLayout 디버깅
____MotionLayout 경로 수정
____실습 16.04: 키프레임을 사용한 애니메이션 경로 수정
____과제 16.01: 비밀번호 생성기
__요약
17장 구글 플레이에 앱 출시하기
__출시를 위한 앱 준비
____앱 버저닝
____키스토어 생성
____실습 17.01: 안드로이드 스튜디오에서 키스토어 생성
____키스토어와 비밀번호 저장
____릴리스용 앱 서명
____실습 17.02: 서명된 APK 생성
____안드로이드 앱 번들
____실습 17.03: 서명된 앱 번들 생성
____구글 플레이 앱 서명
__개발자 계정 생성
__구글 플레이에 앱 업로드
____스토어 등록 정보 생성
____출시 준비
____배포
__앱 출시 관리
____릴리스 트랙
____단계적 출시
____관리 게시
____과제 17.01: 앱 게시
__요약