Effective cold flow

unsplash.com

우리는 애플리케이션을 개발하면서 단일 데이터가 아닌 서로 연관된 일련의 데이터들, 즉 데이터 스트림을 다루어야 할 경우가 있습니다. 지속적으로 변화하는 센서의 측정 데이터나 큰 파일을 이루는 각 청크 데이터 등을 그 예로 들 수 있습니다. 이러한 데이터들을 다룰 때 언어 레벨에서 지원하는 Stream API 를 사용하거나 ReactiveX 구현체 같은 라이브러리를 이용할 수도 있지만, 코틀린 코루틴에서는 Flow 를 사용할 수 있습니다.

이 글은 Manuel Vivo 님의 A Safer way to collect flows from Android UIs 를 기반으로 작성되었습니다.

Flow(Stream)는 크게 Cold Fl …


Coroutine flow under the hood (cold flow)

요즘 많은 안드로이드 프로젝트들이 Java -> Kotlin 전환을 하면서 데이터 스트림 처리에 RxJava/Kotlin 을 사용하던 부분들이 Coroutine Flow 로 많이 전환되고 있습니다. RX 에 비해서 내장 오퍼레이터 및 스트림 윈도우 컨트롤 등의 자체 제공되는 기능이 많지 않지만 그 덕에 더 가볍게 사용할 수 있고, 오퍼레이터가 중단함수를 지원함으로써 더 직관적으로 스트림 체인을 구성할 수 있어 많이 이용되고 있습니다.
(물론 안드로이드 JetPack 의 많은 라이브러리들이 중단함수를 지원하고 있고, 이를 이용할 수 있는 것은 …


코루틴 공식 가이드 읽기 Part 9 — Dive1

unsplash.com

우리는 애플리케이션을 개발할 때 필연적으로 “상태”와 “이벤트” 를 다루게 됩니다.

상태(State)

UI 애플리케이션에서 다루는 상태에 대해 생각해봅시다.
우선 사용자의 인증 상태를 생각해 볼 수 있습니다. 사용자의 인증 상태는 크게
“로그아웃”, “로그인”, “계정 잠김” 등으로 정의 될 수 있으며 반드시 한가지 상태를 갖고 있습니다.
또 한가지는 화면에 표현하기 위한 데이터의 상태를 생각해 볼 수 있습니다.
이는 “로딩중”, “데이터 이용가능”, “오류” 등으로 정의 될 수 있으며 역시 반드시 한가지 상태를 갖고 있습니다.

애플리케이션은 필요한 상태 머신을 정의하고, UI 변경이나 비지니스 로직의 수행 등에 따라 상태를 전이해 가며 …


Deeper look into coroutine’s dispatchers

unsplah.com

앞선 주제들에서 우리는 코루틴 내부에서 중단 함수 및 디스패처가 동작하는 원리에 대해서 알아 보았습니다.

- 중단함수란 무엇이고, 어떻게 동작할까?
- 코루틴은 왜 스레드보다 가볍다고 할까?

해당 주제들에서 살펴 본 것처럼 우리는 코루틴 프레임워크 사용 시 launch {}, async {} 등의 코루틴 빌더를 통해 코루틴을 생성 및 실행합니다. 이 때, 코루틴이 속한 코루틴 스코프에 어떠한 디스패쳐도 설정되어 있지 않다면 기본적으로 Dispatchers.Default 를 사용하게 됩니다. 만약 Default 디스패쳐를 사용하고 싶지 않다면 Dispatchers 에 1) 사전 정의 된 4가지 Dispatcher 중에 수행 …


Part 6 — KMM 샘플 프로젝트 회고

목차로 돌아가기 >

지금까지 KMP 와 KMM 이 무엇인지 알아보고 실제로 KMM 을 이용한 Android 와 iOS 앱을 지원하는 멀티 플랫폼 샘플 애플리케이션을 만들어 보았습니다.

KMM 을 통한 Android, iOS 샘플 애플리케이션을 제작 과정에서 느낀점은 잠시 뒤에 이야기 하기로 하고, 샘플 애플리케이션의 아키텍쳐로 인해 발생하진 않았지만 KMP 나 KMM 프로젝트 수행 시 겪을 수 있는 한가지 문제에 대해 먼저 공유하려고 합니다.

Concurrency in KMP and KMM

KMP 나 KMM 프로젝트를 수행할 때 iOS 와 같이 Kotlin/Native 를 통한 모듈 공유가 필요한 플랫폼을 지원한다면 JVM 기반에서의 구현과는 조금 다른 동시성 모델과 …


Part 5— 샘플 프로젝트 iOS 앱 개발

목차로 돌아가기 >

이제부터 영화 검색 및 스크랩 앱을 위해 생성한 공통 모듈을 이용하여 iOS App 을 만들어 보겠습니다.

샘플 프로젝트에서 iOS App 은 Project Root 에 iosApp 디렉토리에 위치합니다. 애플리케이션 코드 전체를 설명하기 보다 구조에 대한 설명과 더불어 공통 모듈을 사용하는 부분을 집중적으로 다루겠습니다. 🙌

먼저 iOS App 에서 사용한 라이브러리 및 기본 구조에 대해 알아보겠습니다. iOS App 에서 사용한 주요 라이브러리는 다음과 같습니다.

iOS App 은 UIT …


Part 4— 샘플 프로젝트 Android 앱 개발

목차로 돌아가기 >

이제부터 영화 검색 및 스크랩 앱을 위해 생성한 공통 모듈을 이용하여 Android App 을 만들어 보겠습니다.

샘플 프로젝트에서 Android App 은 Project Root > androidApp 디렉토리에 위치합니다. 애플리케이션 코드 전체를 설명하기 보다 구조에 대한 설명과 더불어 공통 모듈을 사용하는 부분을 집중적으로 다루겠습니다. 🙌

먼저 Android App 에서 사용한 라이브러리 및 기본 구조에 대해 알아보겠습니다. Android App 에서 사용한 주요 라이브러리는 다음과 같습니다.


Part 3— 샘플 프로젝트 공통 모듈 개발

목차로 돌아가기 >

먼저 샘플 프로젝트 공통 모듈(shared)의 build.gradle.kts 파일부터 살펴보도록 합시다. 포스트의 스크롤이 길지만 모두 코드 때문입니다. 😅

처음 생성되는 shared 모듈의 기본 빌드 스크립트는 다음과 같거나 비슷할 것 입니다 (KMM 이 업데이트 되면서 프로젝트 기본 템플릿에 일부 변경이 있을 수 있지만 그 경우에도 흐름을 이해하는데는 무리가 없을 것이라 생각합니다).

제일 위에서부터 살펴보면 kotlin-multiplatform, com.android.library, kotlin-android-extensions 플러그인이 적용되어 있는데 kotlin-android-extension …


Part 2— KMM 으로 샘플 프로젝트 개발 준비

목차로 돌아가기 >

이제 실제로 KMM 을 이용한 멀티플랫폼 지원 샘플 프로젝트를 작성해 보면서 KMM 이 상용 제품에 쓸만한 수준인지 알아보도록 하겠습니다. 포스팅이 너무 길어지는 것을 방지하기 위해서 주요 코드 및 프로젝트 진행 중 발생 가능한 몇몇 예외 상황들에 대한 해결책 위주로 설명하겠습니다.
(샘플 프로젝트의 전체 코드는 이곳에서 확인하실 수 있습니다.)

그럼 시작해 봅시다.🔥

이번에 KMM 을 이용하여 만들어 보고자 하는 샘플 앱은 사용자가 영화를 검색해 보고 검색 결과 중 마음에 드는 영화는 스크랩 해 놓았다가 나중에 찾아볼 수 있는 기능을 제공하는 앱을 만들어 보려고 합니다.
이 샘플 앱의 각 플랫 …


Part 1 — KMP 와 KMM 이란 무엇인가?

목차로 돌아가기 >

먼저 KMP 와 KMM 에 대해서 알아 보도록 하겠습니다.
KMP(Kotlin MultiPlatform) 는 멀티 플랫폼을 타겟으로하는 프로젝트를 수행할 때 Kotlin 을 이용하여 공통 모듈을 개발하고 이를 각각의 플랫폼에서 공유하여 개발할 수 있도록 지원해 줍니다. KMM(Kotlin Multiplatform Mobile) 은 KMP 에서도 특히 모바일 플랫폼(Android/iOS) 간 코드 공유를 위해 특화된 서브셋 이라고 볼 수 있습니다.

먼저 KMP 에서 Kotlin 으로 작성되는 공통 모듈은 다음과 같이 다양한 플랫폼을 타겟으로 빌드될 수 있습니다.

가장 가운데 Common Kotlin(보라색

Myungpyo Shim

App Developer

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