한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
Google I/O 2018 for Android 소스를 공개합니다
2018년 9월 12일 수요일
<블로그 원문은
이곳
에서 확인하실 수 있으며 번역 리뷰에는
정승욱(Android GDE)
님이 참여해 주셨습니다.>
게시자: Shailen Tuli, DPE
오늘 Google은 공식
Google I/O 2018
for Android 앱의
소스 코드
를 공개할 예정입니다.
2018 버전에서는 앱 소스 코드를 광범위하게 다시 작성했습니다. 이 앱은 오랫동안 ContentProvider + SyncAdapter 아키텍처를 사용해왔습니다. 우리는 올해
아키텍처 컴포넌트
를 사용해 앱을 다시 작성하고 최신 앱 빌드를 위한 Android 팀의 현행 권장 사항과 코드를 동기화했습니다.
아키텍처
우리는 앱의 아키텍처에 대한 결정을 내릴 때 테스트와 유지 관리가 가능한 모듈식 코드를 작성하기 위해
Guide to App Architecture
에서 제시하는 권장 사항을 따랐습니다. Activity와 Fragment에서 로직을 떼어내어
ViewModel
로 옮겼습니다.
LiveData
를 사용하여 데이터를 관찰하고
Data Binding Library
를 사용하여 레이아웃의 UI 컴포넌트를 앱의 데이터 소스에 바인딩했습니다.
앱의 전체 아키텍처를 다음 그림처럼 요약할 수 있습니다.
우리는 데이터 작업 처리를 위해 Repository 계층을 사용했습니다. IOSched의 데이터는 몇몇 서로 다른 소스에서 가져옵니다. 사용자 데이터는
Cloud Firestore
에 저장되고(원격으로 저장되거나 오프라인 사용 시에는 로컬 캐시에 저장됨) 사용자 기본 설정과 각종 설정은 SharedPreferences에 저장됩니다. 컨퍼런스 데이터는 원격으로 저장되고 앱에서 사용할 수 있도록 가져와 메모리에 저장됩니다. 그리고 저장소 모듈이 모든 데이터 작업을 처리하고 앱의 나머지 부분에서 데이터 소스를 추출하는 역할을 맡습니다. 아키텍처를 이렇게 구성해두었으므로, 혹시 앞으로 다른 데이터 소스에 대해 Firestore 백엔드를 바꾸고 싶을 때 쉽고 깔끔하게 바꿀 수 있습니다.
우리는 가벼운 도메인 계층을 구현했는데, 데이터 계층과 프레젠테이션 계층 사이에 있는 이 계층은 UI 스레드에서 떨어져 나온 개별 비즈니스 로직을 처리합니다 (
예
시보기)
우리는 종속성 주입을 위해
Dagger2
를 사용하고 상용구 코드를 추출하는 데는 주로
dagger-android
를 사용했습니다.
기본적인 계측 테스트에는
Espresso
를 사용하고 단위 테스트에는 JUnit과
Mockito
를 사용했습니다.
Firebase
Firebase 플랫폼이 성숙 단계로 접어들면서 앱에서 Firebase 기술 사용 비중도 커졌습니다. 2018 버전에서는 다음과 같은 Firebase 컴포넌트를 사용합니다.
Cloud Firestore
는 모든 사용자 데이터(사용자가 시작하거나 예약한 이벤트)를 위한 Google의 소스입니다. Firestore가 자동으로 동기화하고 오프라인 기능도 완벽하게 관리해주었습니다.
Firebase Cloud Functions
를 통해 백엔드 코드를 실행할 수 있었습니다. 예약 기능은 Functions에 주로 의존하여 사용자의 상태를 확인하고(참석자만 예약할 수 있도록 허용되었음) 공간 가용성을 확인하고 Firestore에서 예약 상태를 지속했습니다.
Firebase 클라우드 메시징
을 사용하면 서버에서 컨퍼런스 데이터 변경 내용을 앱에 알릴 수 있습니다. 컨퍼런스 데이터는
주로
정적인 상태로 유지되지만, 때때로 바뀌는데 특히 컨퍼런스의 기조연설 후에 바뀝니다. 앱은 지금까지 컨퍼런스 데이터로 작업할 때 주로 '핑하고 가져오기' 모델을 사용했는데, 올해 역시 그런 사용 방법을 그대로 유지했습니다.
원격 구성
은 인앱 상수를 관리하는 데 도움이 되었습니다. 예년에는 컨퍼런스 일정에 직접 관련되지 않은 데이터(예: WiFi 정보, 컨퍼런스 장소로 운행되는 셔틀 운행 일정 등)가 예기치 않게 변경될 때 사용자에게 알릴 수 없다는 사실을 깨달았습니다. 그런데 원격 구성 덕분에 이러한 값을 쉽고 가볍게 업데이트할 수 있었습니다.
Kotlin
우리는 최신 Android 아키텍처에 적합하게 맞추려면 앱을 처음부터 다시 작성해야 한다는 결정을 일찍부터 내렸습니다. 재작성에 Kotlin을 사용하자는 선택은 쉽게 할 수 있었습니다. Kotlin은 다양한 표현을 간결하면서도 강력한 구문으로 처리할 수 있는 점이 마음에 들었기 때문입니다. Null 허용 여부와 불변성을 포함한 안전 기능을 위한 Kotlin의 지원으로 코드의 복원성이 더욱 좋아졌다는 점도 강점이었습니다. 또한
Android KTX Extension
에서 제공하는 향상된 기능을 활용할 수 있는 이점도 있었습니다.
머티리얼 디자인
I/O 2018에서 머티리얼 디자인 팀은 제품 브랜드 가치를 더욱 높이기 위해 머티리얼 디자인을 훨씬 더 유용하고 강력하게 사용자설정하는 능력을 앱에 제공하는
머티리얼 테마 설정
기능을 발표했습니다. 머티리얼 테마 설정보다 앞서 이 앱을 출시했으므로 새로운 컴포넌트를 전부 사용하지는 못했지만, Floating Action 버튼을 끼워 넣은 새로운
Bottom App Bar
처럼 두어 가지 기능을 슬쩍 집어넣을 수는 있었습니다. 또한 컨퍼런스 브랜딩 요소를 다수 포함할 수 있었습니다.
향후 계획
앱을 다시 작성함으로써 앱 빌드에 관해 Android가 고집하는 권장 사항에 맞춰 코드가 동기화되므로, 코드베이스가 더욱 깔끔해지고 유지 관리하기도 좋아졌습니다. 우리는 계속 앱의 개선 작업을 진행할 예정입니다. 그래서 JetPack 컴포넌트가 출시되면 이를 통합하고 앱에 꼭 맞는 플랫폼 기능을 보여줄 기회를 계속 모색할 것입니다. 개발자는
GitHub
에서 코드 변경 사항을 계속 확인하실 수 있습니다.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed