Compose UI 매커니즘Compose는 데이터를 UI로 변환하기 위해 아래와 같은 세 가지 주요 단계를 통해 UI를 그리는 매커니즘을 사용합니다. Composable 함수들은 UI를 그리기 위해 각 단계를 매번 수행해야 합니다. 하지만, 동일한 입력일 때 동일한 결과를 계산하는 반복 작업은 불필요합니다. 그래서 Compose에서는 Recomposition에서 이전과 동일한 입력이 보장된다면, 동일한 결과를 계산하는 반복 작업(세 단계의 작업)을 생략합니다. 동일한 입력인지 판단히기Recomposition은 입력 매개변수가 변경될 떄, 트리거됩니다. Compose Runtime은 이전 매개변수 값을 기록해 뒀다가, `equals()`를 사용해서 새롭게 변경된 매개변수 값과 비교합니다. `equ..
사진: Unsplash의Nick Russill 코루틴을 언제 사용하는가?여러 작업을 동시에 수행하는 애플리케이션을 만들기 위해, 즉 "동시성"을 구현하기 위해 Kotlin은 코루틴을 사용합니다. JVM과 Kotlin/Native 환경에서, 코루틴을 포함한 모든 동시성 코드는 OS가 관리하는 스레드 위에서 실행됩니다. 코루틴은 스레드를 블로킹(Blocking)하지 않고 실행을 중단(Suspend) 할 수 있습니다. 이를 통해 하나의 코루틴이 어떤 데이터가 도착하기를 기다리며 중단되어 있는 동안, 같은 스레드에서 다른 코루틴이 실행될 수 있어, 시스템 자원을 효율적으로 사용할 수 있습니다. 코루틴과 스레드 비교스레드는 운영체제가 관리합니다. 스레드는 여러 CPU 코어에서 작업을 병렬로 실행할 수 있으며..
사진: Unsplash의Vidar Nordli-Mathisen 이번 게시글에서 Compose Navigation을 사용하면서 발생한 Recomposition 문제, 그리고 그 원인과 해결방안에 대해 이야기해보려고 합니다. Recomposition으로 인한 문제 발생어느 때와 같이 안드로이드 개발을 하던 도중 문제가 발생했습니다. 바로 NavHost가 리컴포지션 되면, 현재 화면이 계속 startDestination으로 되돌아간다는 문제였습니다. 제가 정의한 NavHost는 다음과 같습니다.NavHost( navController = navigator.navController, startDestination = navigator.startDestination,) { composabl..
사진: Unsplash의Towfiqu barbhuiya 면접에서 아키텍처 패턴에 대한 이야기를 할 때, 자주 나오는 질문이 MVI와 MVVM의 차이에 대해 묻는 것입니다. 이번 게시글에서는 이 질문에 대한 저의 답변을 한번 작성해보고자 합니다. 지극히 개인적인 생각이므로, 잘못되거나 다른 의견이 있으시다면 댓글로 작성해주시길 바라겠습니다. 두 아키텍처 패턴의 차이에 대해 말하려면, 먼저 각 아키텍처 패턴에 대해 이해하고 있어야 합니다. 그래서 차이에 대해 말하기 전에 각 패턴에 대해 알아보겠습니다. MVVM란?다음은 위키피디아에서 말하는 MVVM의 정의와 이미지 입니다.위키피디아: Model–View–ViewModel(MVVM)은 컴퓨터 소프트웨어에서 사용되는 아키텍처 패턴으로, 그래픽 사용자 인터페..
사진: Unsplash의Kelly Sikkema 최근 개발을 하면서 다른 사람들의 GitHub을 뒤져보다가, TextField를 너무나도 간단하게 사용하는 사례를 발견했습니다. 제가 기존에 사용하던 방식과 비교했을 때 너무 간단해져서 사용을 고려했지만, 결국 어떠한 이유로 사용하지 않게 되었기에, 이 경험을 공유해보고자 합니다. 기존 방식제가 이전에 사용했던 방식은 ViewModel에서 상태를 관리하는 형태였습니다.@HiltViewModelclass NameViewModel @Inject constructor() : ViewModel() { private val _name = MutableStateFlow("") val name: StateFlow get() = _name fun se..
사진: Unsplash의Elena Mozhvilo 이번 게시글에서는 WebSocket에 대해 알아보고 멀티 모듈 환경에서 WebSocket을 사용해보려고 합니다. WebSocket이란?WebSocket은 웹 환경에서 실시간, 양방향 통신을 지원하는 프로토콜입니다. 한 번 연결을 맺으면, 서버와 클라이언트가 끊임없이 데이터를 주고받을 수 있습니다.WebSocket 연결이 생성되면 TCP 소켓 기반으로 통신이 시작됩니다.소켓이란 네트워크에서 데이터를 주고받은 두 장치 간의 종단점을 의미합니다. 한 번 연결을 맺으면, 서버와 클라이언트가 끊임없이 데이터를 주고받을 수 있습니다. WebSocket 통신은 아래와 같은 과정으로 진행됩니다.WebSocket HandshakeTCP 기반 통신소켓 종료 WebS..
이번 게시글에서는 안드로이드에서의 MessageQueue에 대해 알아보고자 합니다. MessageQueue란?MessageQueue는 특정 스레드에서 실행될 작업들(Message, Runnable)의 목록을 저장하는 큐입니다. 안드로이드 앱에서는 버튼 클릭, UI 갱신 등 다양한 이벤트가 발생합니다. 이런 작업들을 한 번에 처리하지 않고, 메시지 형태로 큐에 넣어 순서대로 처리하기 위해 MessageQueue가 사용됩니다. 당연하게도, MessageQueue만으로는 원하는 작업을 처리할 수 없고 안드로이드는 두 가지 핵심 도구인 Looper와 Handler를 사용하여 작업을 진행합니다.RunnableRunnable은 1개의 메서드를 갖는 함수형 인터페이스입니다. 하나의 작업 단위를 정의하여 실행 가능..
이번 게시글에서는 Flow의 생산자에 대해서 알아봅니다. Flow 생산자 (Producer)Flow란?우리가 사용하는 Flow는 아래와 같은 인터페이스입니다. 이 인터페이스는 `collect`라는 중단 함수를 가지고 있습니다. public interface Flow { public suspend fun collect(collector: FlowCollector)} collect 함수는 `FlowCollector`를 인자로 받아 Flow가 발생한 데이터를 수집합니다. 즉, Flow가 데이터를 발행하고, `FlowCollector`가 그것을 처리하는 구조입니다. `FlowCollector`는 Flow가 발행한 데이터를 실제로 처리하는 객체입니다. `FlowCollector`의 핵심 메서드인 `emi..