Kotlin 1.4 Online Event — State of Kotlin in Android 영상 정리

hongbeom
hongbeom
Oct 15 · 6 min read

코틀린 1.4버전이 출시 됨에 따라 안드로이드에 어떤 영향을 끼쳤는지 살펴봅니다.

이 글에서 등장하는 예시와 설명은 아래 영상에서 더 자세하게 확인해 볼 수 있습니다.

Kotlin 1.4 Release

코틀린 1.4버전이 지난 8월 17일에 출시 되었으며 10월 12일 부터 온라인 이벤트가 진행되었습니다. 이번에 발표한 1.4버전은 품질과 성능 향상에 초점을 맞추었다고 합니다. 또한 온라인 이벤트에 안드로이드의 어떤 부분에 영향을 끼쳤는지에 관한 영상이 올라왔으며 이를 간략히 한국어로 정리해보았습니다.

Jetpack Compose

Google I/O에서 소개된 Jetpack Compose 라이브러리는 코틀린을 기반으로 만들어졌으며 모던하고 선언적인 UI 툴킷입니다. 이것을 사용하면 UI 함수를 선언형으로 작성하여 앱의 UI 엘리먼트로 사용할 수 있게 됩니다.

기본적인 구조를 살펴보면 high-order function, 람다식은 물론 기본 인자에 의존하는 모습을 띄고 있습니다. 여러 코틀린 관용구를 잘 활용한다면 쉽게 UI를 구성할 수 있습니다.

AsyncTask

AsyncTask 클래스는 API R레벨에서 deprecated되어 더 이상 사용할 수 없습니다. 그렇다면 어떤 것으로 대체하여 사용할 수 있을까요? 우리에게는 약 5가지의 선택지가 존재합니다.

  • Thread

Coroutines

영상에서는 Coroutines을 강력하게 추천하고 있습니다. 코루틴은 코틀린에서 사용할 수 있는 비동기 프로그래밍입니다. 코루틴은 다음과 같은 4가지 특성을 가지고 있습니다.

  • 구조화된 동시성 — 개발자가 작업의 범위를 애플리케이션 라이프사이클로 지정할 수 있으며 메모리 누수를 방지할 수 있도록 지원합니다.

코틀린 1.3에서 컴파일러 지원을 하기 시작했으며 kotlinx.coroutines 라이브러리와 함께 사용할 수 있습니다. 아래는 코루틴을 사용하는 작은 예제입니다.

위 코드를 보면 비동기적으로 서버를 통해 데이터를 가져온 후 데이터를 로컬 데이터베이스에 저장한 후 UI를 업데이트하고 있습니다. 위 코드에서 코루틴 코드는 모두 스코프(1번 라인)에서 실행되며 안드로이드의 라이프사이클을 따라갑니다. 그리고 2번 라인에서 Dispathers를 통해(백그라운드 IO 스레드) 네트워크와 데이터베이스 접근 작업을 실행합니다. 또한 UI 스레드를 블로킹하지 않고 데이터베이스에 데이터를 저장합니다(4번 라인). 마지막으로 9번 라인에서 officeStatusLiveData에 value를 넣어줌으로써 UI를 업데이트합니다.

또한 IDE는 비동기적인 행위를 하는 코드가 있다면 왼쪽 위에 아이콘을 표시하여우리에게 알려줍니다.

Room

JetPack 라이브러리 중의 하나인 Room은 우리가 코루틴을 통해 데이터베이스에 메인 스레드의 블로킹 없이 쉽게 접근할 수 있도록 도와줍니다.

모든 데이터 상태에 접근할 수 있으며(insert, update, delete, query) suspend 지정자를 사용하여 백그라운드 스레드를 통해 데이터베이스에 접근하도록 할 수 있습니다.

물론 Flow로 리턴값을 받을 수도 있습니다. 이 때 suspend 함수를 사용하지 않아도 됩니다. 이것은 우리가 데이터베이스에서 무슨 일이 일어나고 어떤 변화가 일어나는지 관찰할 수 있게 합니다.

WorkManager

한편, 오래 실행되어야하는 작업은 WorkManager 내부의 작업을 통해 모델링할 수 있습니다. CoroutineWorker를 사용하여 우리는 모델링한 작업을 쉽게 취소할 수 도 있습니다.

Paging3

기존에 존재했던 라이브러리인 Room과 WorkManager에서는 익스텐션 함수나 ktx 아티팩트를 제공해주도록 구현했었는데, 새로운 라이브러리에서는 코루틴으로 시작하도록 만들었다고 합니다. 그에 대한 좋은 예시로는 Paging 3.0 라이브러리가 있습니다.

예를 들어, 화면에 표시할 사용자 목록의 소스를 정의해야 한다고 할 때 우리는 PagingSource를 구현하고 load 메소드를 오버라이드해주어야 합니다. 이 때 우리는 load 함수 안에서 suspend 함수를 사용하여 쉽게 백엔드에서 데이터를 요청할 수 있습니다.

그런 다음 paging을 통해 PagingDataflow를 처리할 수 있습니다. 이를 통해 우리는 데이터를 보다 유연하고 세부적으로 제어할 수 있게 됩니다.

DataStore

코루틴과 플로우를 기반으로 구축된 라이브러리의 또 다른 예시로는 DataStore가 있습니다. DataStore는 SharedPreferences를 대체하기 위한 새롭고 보다 향상된 데이터 스토리지 솔루션입니다. 또한 두 가지의 다른 구현을 제공해줍니다. Proto DataStore는 타입이 지정된 객체를 저장할 수 있으며 Preferences DataStore는 키-값 쌍으로 데이터를 저장합니다. 데이터는 비동기적으로 코루틴을 사용하여 저장되며, Flow를 사용하여 검색할 수 있습니다.

예시 코드를 보면, DataStore에서 setting을 가져오고 있으며, 항상 setting은 변경될 수 있고, myCounterFlow는 새로운 값을 방출합니다.

또한 Jetpack Compose는 코루틴과 통합 기능을 제공하므로, 예제에서 composable한 scope에서 코루틴을 launch 할 수 있습니다. 이렇게 우리는 우리의 composable에 있는 suspend 함수를 호출할 수 있습니다.

Conclusion

결론적으로, 이 영상에서는 안드로이드 개발을 할 때, 코틀린을 권장하며, 비동기 작업을 실행할 경우에는 코루틴을 강력하게 추천하고 있습니다. 아직 자바로 앱을 개발하고 계시다면, 이제 코틀린으로 언어를 변경하고 코루틴을 이용하여 간단하게 비동기 작업을 구현하여 앱을 제작해보시길 권유드립니다.

읽어주셔서 감사합니다.🙌

hongbeomi dev

hongbeomi 개발블로그

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store