Computer >> 컴퓨터 >  >> 시스템 >> Android

2019년 안드로이드 앱 개발 완벽 가이드: '새로운' 안드로이드 정복기

비토차브(Bitotsav) '19 앱은 어떻게 현실이 되었는가

배경: 판테온(Pantheon) '17 ⏪

약 2년 전인 2017년 9월, 친구 아샹크 안슈만(Ashank Anshuman)이 저에게 우리 대학 기술 축제를 위한 앱을 만들어 보자고 권했습니다. 우리는 약 2주 동안 밤낮없이 작업해 축제 시작 직전에 출시할 수 있었습니다. 비록 몹시 지쳤지만, 사람들이 실제로 사용하는 결과물을 세상에 내놓았다는 사실은 정말 짜릿한 경험이었죠! 이 앱은 주최 측이 참가자들에게 모든 정보를 손쉽게 전달한다는 목적을 완벽히 해냈습니다.

Pantheon '17 — Google Play에서 확인하기
청년들이 자신의 기술 역량을 뽐낼 수 있는 전국 단위 무대를 제공하기 위해…

앱은 약 120개의 리뷰에서 4.9점이라는 평점을 받았습니다(어떤 이유에서인지 구글 봇이 리뷰를 삭제해 버렸지만, 그 이야기는 나중에 하기로 하죠). 소스 코드를 공개해 달라는 요청도 몇 차례 있었지만 여러 이유로 거절했습니다. 무엇보다 코드, 특히 마감 직전 급하게 작성한 부분에 만족하지 못했기 때문입니다. 남들이 배우고 활용할 만한 수준의 코드를 작성할 만큼의 시간과 경험이 없었으니까요.

다시 시작합니다! ?

시계를 2018년 11월로 돌려보겠습니다. 안킷 아그라왈(Ankit Agrawal, 흔히 말하는 '축제 담당자')이 연례 사회문화 축제인 비토차브 팀에 합류해 달라고 제안했고, 저는 안드로이드를 다시 만질 명분을 찾고 있던 참이라 기꺼이 수락했습니다. 이번에는 아샹크를(상당히 오래 설득해야 했죠!) 다시 앱 개발에 동참시켰습니다.

12월에는 크게 진전된 것이 없었지만, 아키텍처 컴포넌트(Architecture Components), AndroidX, Jetpack 등에 관한 자료를 읽으며 준비했습니다. 또한 지난 몇 달간 코틀린에 익숙해지고 있었는데, 두 강좌가 결정적인 도움이 됐습니다. 저명한 하디 하리리(Hadi Hariri)의 2부 구성 강좌와, 스베틀라나 이사코바(Svetlana Isakova)와 안드레이 브레슬라프(Andrey Breslav)가 KotlinConf 2018에서 소개한 최신 강좌였죠. 그래서 코틀린은 이 앱의 당연한 선택지였습니다.

Introduction to Kotlin Programming
Kotlin 1.0은 2016년 2월에 출시된 이후 전 세계 개발자들의 사랑을 받고 있습니다…
Kotlin for Java Developers | Coursera
JetBrains의 'Java 개발자를 위한 Kotlin' — 더 많은 것을 제공하는 현대적 프로그래밍 언어…

핵심 결정 사항 ?

1월 상순에도 별다른 코드가 작성되지 않았습니다. 바쁜 일정 때문에 1월 16일에야 학교에 도착할 수 있었거든요. 그럼에도 우리는 몇 가지 중요한 결정을 내렸습니다:

  • 코틀린(Kotlin)만을 사용한다
  • 기능(feature) 기반 패키징을 적용한다
  • AndroidX와 함께 Jetpack 아키텍처 컴포넌트를 사용한다
  • 최소 API를 21로 설정한다 (22였다면 더 나았을지도 모릅니다)
  • Android Studio 카나리아 버전을 사용한다
  • Git Flow와 SemVer를 따른다
  • 축제가 끝난 후 공개해도 부끄럽지 않은 수준의 코드를 작성한다 ?
2019년 안드로이드 앱 개발 완벽 가이드:  새로운  안드로이드 정복기
AndroidX와 함께하는 Jetpack

결국 2017년 앱 개발 경험을 모두 접어두고, 2019년의 최첨단 기술로 완전히 새롭게 시작하는 셈이었습니다. 정말 흥미진진하면서도 동시에 큰 도전이었죠.

코딩, 코딩, 또 코딩! ?

우리는 판테온 '17 때처럼 역할을 분담했습니다. 아샹크는 앱의 백엔드(DB·네트워킹, FCM 알림, 백그라운드 처리)를, 저는 프론트엔드와 통합을 맡았습니다. 시작할 때부터 작업 내내 수많은 자료가 도움이 됐지만, 그중 단연 최고는 구글이 제공하는 훌륭한 코드랩(codelab)들이었습니다:

  • Room with a View - Kotlin (ViewModel, LiveData, Room, 코루틴)
  • Using Kotlin Coroutines in your Android App
  • Data Binding 코드랩
  • Navigation 코드랩 (Navigation Architecture Component)
  • WorkManager를 활용한 백그라운드 작업
Google Codelabs
구글 개발자 코드랩은 단계별 안내형 실습 코딩 경험을 제공합니다…

또한 구글의 Sunflower와 Google IO 18 앱은 참조용 코드베이스로 완벽했습니다. Android Dev Summit 앱도 좋은 참고 자료였겠지만, 존재 자체를 너무 늦게 알았죠!

googlesamples/android-sunflower
Android Jetpack으로 안드로이드 개발 모범 사례를 보여주는 원예 앱…

이런 무기를 갖춘 채 코딩을 시작했습니다. 저는 새로운 내비게이션(Navigation) 아키텍처 컴포넌트를 활용한 단일 액티비티(single-Activity) 아키텍처를 구현하기로 했고, 아샹크는 Room과 FCM으로 작업을 시작했습니다. 저는 IoC를 위해 Koin을 도입할까 고민하고 있었지만 확신이 서지 않았습니다.

마침 그 즈음 조 버치(Joe Birch)가 caster.io에서 Koin 강좌를 출시했습니다(전문가가 진행하는 짧고 알찬 강좌들로, 출시 첫 주에는 무료!). 그래서 Koin을 채택하기로 했고, 이 선택을 전혀 후회하지 않았습니다. 진지하게 말해서, 안드로이드 지원은 훌륭하고 문서도 환상적입니다 ❤️

Koin
이 강좌에서는 의존성 주입 프레임워크인 Koin을 배우며 완전히 동작하는 앱을 만듭니다…

내비게이션과 Koin 설정이 끝나자 UI 작업에 착수했습니다. UI는 머티리얼 디자인 컴포넌트(Material Design Components)만을 사용하기로 했고, 가이드라인과 문서가 큰 도움이 됐습니다. 그리고 저는 반드시 Data Binding을 사용해야 했습니다. 제가 너무 좋아하니까요! 한편 아샹크는 WorkManager를 구현했습니다. Firebase Job Dispatcher 대신 WorkManager를 사용하기로 결정했으니, 온전히 Jetpack으로 간 것이죠.

제가 처음 개발한 것은 일정(Schedule) UI였고, 이를 통해 아키텍처 컴포넌트에 익숙해졌습니다. 이어서 앱에서 가장 복잡한 부분인 등록(Registeration) 플로우 UI로 넘어갔습니다. LiveData와 Navigation을 고급스럽게 활용해 실시간 유효성 검증 폼이 있는 3단계 화면을 구현해야 했죠(이것만으로 하나의 블로그 포스트가 나올 만한 내용입니다. 곧 다룰까요?!). 이 작업을 통해 해당 컴포넌트들에 대한 자신감이 크게 붙었고, 이후 진행은 순탄했습니다. 계획한 기능을 모두 완성하고, 함정들을 발견하고, 버그도 잡았습니다.

출시 ?

주요 기능 구현을 마친 뒤 UI를 다듬고, 남은 TODO를 처리하고, 출시 준비를 마쳤습니다! 마지막 마무리로, 늘 계획해 오던 기능을 추가했습니다.

바로 설정 변경(configuration change)이 일어날 때마다 색상 테마가 바뀌는 기능입니다. 축제의 테마인 'Colours of Asia(아시아의 색)'에 어울리도록 만든 것이죠.

앱은 2019년 2월 11일 플레이 스토어에 정식 출시되었습니다! ??

Bitotsav '19 — Apps on Google Play
빌라 인스티튜트 오브 테크놀로지 메스라(Birla Institute of Technology, Mesra)의 29회 연례 사회문화 축제 비토차브 '19…
2019년 안드로이드 앱 개발 완벽 가이드:  새로운  안드로이드 정복기
Bitotsav '19 앱

버그 수정 및 업데이트

출시 몇 시간 만에 (유일하게!) 두 개의 버그가 발견됐고, 즉시 수정했습니다. 첫 번째는 DAO 메서드에 suspend가 붙어 생긴 문제였는데, 지금도 정확한 원인은 100% 확신하기 어렵습니다 ?. 두 번째는 난독화(obfuscation)로 인한 직렬화 실패였고, @Keep 애노테이션 하나로 간단히 해결됐습니다.

이후 곧바로 다음 업데이트 작업에 들어가 피드에 리더보드를, 일정에 축제의 심야 행사를 추가했고, 그 외에도 몇 가지 변화를 반영했습니다. 세 번째 업데이트에서는 사소한 기능들을 몇 개 더 추가했습니다.

축제는 성공적으로 끝났고, 앱은 1,000명이 넘는 참가자들에게 사용되었습니다!

물론 친구 수샨트 굽타(Sushant Gupta)가 서버에 잘못된 DB 엔트리를 넣어 작은 문제가 있긴 했습니다. 그는 훗날 이 사건에 관해 꽤 드라마틱한 블로그 포스트를 작성했죠.

Bitotsav '19 웹사이트에 대한 DDoS 공격
이것은 기술 문서가 아니라, 여러 웹·앱 개발자에게 교훈이 될 수 있는 이야기입니다…

축제가 끝난 후 최종 업데이트를 배포했습니다. 행사 상세 정보와 피드 등을 JSON 형태로 앱에 포함시켜 저장하고, 개인정보 보호를 위해 주최측 연락처를 삭제했습니다.

오픈소스 공개!

이제 코드를 오픈소스로 공개할 때입니다! 이번에는 이해하기 쉬운 코드를 작성하는 데 신경 썼기 때문에 세상에 내놓을 준비가 되어 있었습니다. 깔끔한 README를 준비했고, 저장소 히스토리에서 연락처를 완전히 제거하기 위해 훌륭한 BFG Repo-Cleaner 도구를 활용했습니다.

Bitotsav '19 앱의 코드는 이제 누구나 검토하고, 참고하고, 배우고, 활용할 수 있도록 공개되어 있습니다! 꼭 들러서 스타 ⭐ 하나 남겨주세요 ?

aksh1618/Bitotsav-19
Bitotsav '19 공식 앱. GitHub에서 계정을 만들어 aksh1618/Bitotsav-19 개발에 기여하세요.

개발 중 마주한 어려움 ?

개발 과정에서 몇 가지 어려움이 있었습니다:

  • 시간 부족: 가장 큰 어려움은 완전히 새로운 개념을 배우고, 이를 수백 명이 사용할 앱으로 만들어야 하는데 시간이 극도로 촉박했다는 점입니다. 이로 인해 연속적인 장시간 작업이 이어져 스트레스와 피로가 쌓였지만, 끝까지 버텨내고 결과물을 완성했습니다!
  • 코루틴과 WorkManager: 기술적인 측면에서는 WorkManager와 코루틴 조합에서 사소한 문제들이 있었지만 모두 극복했습니다. 안드로이드 SDK 전반에서 코루틴 지원이 더욱 개선되기를 바랍니다 ?.
  • API 21: 대부분의 안드로이드 기기가 API 21 이상이므로 구버전 대응을 피하기 위해 최소 API 21을 선택했습니다. 그런데 의외로 일부 기능이 API 21에서 동작하지 않았습니다. 특히 뷰 배경(view backgrounds)이 그랬죠. 정말 답답해서 최소 API를 22로 설정할걸 후회했는데, 막상 확인해 보니 앱이 설치된 API 21 기기는 우리가 테스트한 두 대뿐이더군요 ?.
  • 테스트 기기 부족: 테스트할 기기가 충분하지 않은 것도 어려움이었습니다. 판테온 '17 때는 약 200명이 사는 기숙사가 있어 테스트가 수월했지만, 이번에는 대부분 인턴으로 떠난 상황이라 코드에 대한 확신에 의존할 수밖에 없었습니다!
  • 코드 리뷰어 부재: 우리가 사용한 것들 대부분이 처음 접하는 기술이었고, 올바르게 하고 있다는 확신을 가지려 최선을 다했습니다. 하지만 리뷰어가 있었다면 큰 도움이 됐을 겁니다. 지금이라도 코드를 가볍게 리뷰해 주실 분이 있다면 진심으로 감사하겠습니다!
  • '종말' 사건: 앞서 언급한 'DDoS' 문제도 겪었습니다. 위에 링크한 수샨트의 블로그 포스트를 꼭 읽어보세요. 후회하지 않으실 겁니다!

핵심 교훈 ✅

  • Kotlin + Jetpack = ❤️ : 가장 큰 교훈은 안드로이드 개발이 놀랄 만큼 발전했으며, Kotlin과 Jetpack을 활용하면 훨씬 재미있고 순수하게 즐겁다는 사실입니다! 정말로, 코딩 과정 중 여러 번 그런 순간들을 경험했습니다!
  • 불가능은 없다: 좀 진부하지만 사실입니다. 열심히 하려는 의지만 있다면 아무리 어려운 일도 해낼 수 있습니다. 물론 스트레스 받는 순간들이 있겠지만, 계속 나아가세요. 자기 자신을 믿으세요!

아쉬운 점 ?

  • Instant App / App Bundle 미적용: 이건 그냥 놓쳤습니다. 생각조차 못 했죠. 뭐, 다음 기회에.
  • 테스트 부재: 네, 이건 큰 문제죠! 제대로 된 테스트가 있었다면 많은 도움이 됐을 겁니다. 하지만 시간이 촉박해 테스트는 '나중에' 작성하기로 미뤘고, 그 '나중'은 아직 오지 않았습니다 ?.

TL;DR. ?

2019년에 새 앱을 시작하려면?

Kotlin과 코루틴을 사용하세요

  • Kotlin을 배우고, 오직 Kotlin만 사용하세요!
  • 안드로이드에서 코루틴을 활용하는 법을 익히세요.

AndroidX와 함께 Jetpack 컴포넌트를 사용하세요

  • 단일 액티비티 아키텍처를 위해 Navigation Component를 익히세요.
  • UI를 위해 Lifecycle 컴포넌트를, 영속화를 위해 Room을 익히세요.
  • 부디 Data Binding을 사용하세요. 후회하지 않을 겁니다!
  • 백그라운드 처리를 위해 WorkManager를 익히세요.

Material Components를 사용하세요

  • Material Components 가이드라인
  • Material Components Android 문서

테스트를 작성하세요!

저희는 못 했지만, 여러분은 꼭 작성하세요! 테스트는 절대 건너뛰지 마세요.

참조용 소스 코드를 활용하세요

이런 기능을 구현한 앱들의 코드를 살펴보세요: Sunflower 앱, IO 앱, Dev Summit 앱, 그리고 물론 Bitotsav '19 앱! (스타 ⭐도 부탁드립니다 ?)

최신 동향을 놓치지 마세요

블로그와 뉴스레터를 구독해 최신 정보를 유지하세요! 시작으로 좋은 곳들: Android Weekly, ProAndroidDev, AndroidPub, Kotlin Weekly. 너무 방대하다고 느껴지시나요? 후옌 투 다오(Huyen Tue Dao)의 훌륭한 강연을 확인해 보세요:

Be Like Water: Keeping up with Android
모바일 업계의 유일한 상수는 끊임없는 변화라는 것…

자, 이것으로 마무리하겠습니다. 안드로이드 개발에 있어 지금은 정말 좋은 시기입니다. 여러분의 새 앱 개발을 시작하고, 그 과정에서 즐거움을 잊지 마세요!

도움이 되셨다면 댓글을 남겨주세요. 건설적인 비판은 언제나 환영입니다 ?

Twitter ?, LinkedIn ? 또는 GitHub ??에서 저를 찾아오세요.

다음에 또 만나요 ??