[KMP] Android Studio 에서 데스크톱(jvm) 앱 실행하기

Fleet도 훌륭한 IDE지만 아직 프리뷰 수준이라 미흡한 점이 있고, 기존 Android Studio(=IntelliJ) 에 익숙한 개발자는 Fleet 보다는 Android Studio를 선호할 수 있다. Android Studio 에서 iOS와 Android 앱은 이미 개발할 수 있도록 플러그인을 지원하는데, 데스크탑은 그렇지 않다. IDE 에서 지원안할 뿐 어짜피 Gradle을 통해 빌드하기 때문에 데스크탑 실행을 위한 태스크만 더보기…

[KMP] 데스크탑(jvm)용 웹뷰 구현하기

Compose Multiplatform 에서는 플랫폼별 공통으로 사용가능한 WebView를 제공하고 있지 않으므로, expect/actual 키워드를 활용하여 플랫폼별로 웹뷰를 구현해야 한다. 처음에는 https://github.com/KevinnZou/compose-webview 라이브러리를 활용하여 구현하고자 했으나, 개발환경 버전과 일치하지 않아 문제가 생겼다. 이 포스팅에서는 직접 JavaFX를 활용하여 desktop(jvm)을 위한 웹뷰 구현방법을 소개하고자 한다. JavaFX란? “JavaFX is an open source, next generation client application 더보기…

나의 코틀린 멀티플랫폼 프로젝트 실패기

Kotlin Multiplatform(KMP)란? 코틀린 멀티플랫폼을 사용하면 Server, Android, iOS, Desktop, Web 여러 플랫폼에서 단일 코드베이스로 모든 애플리케이션간에 로직을 공유할 수 있게 된다. 심지어 컴포즈 멀티플랫폼을 사용한다면 일반적인 UI를 모든 플랫폼에서 공유할 수 있다. KMP 도입배경 첨부된 이미지와 같이 사용자가 업로드 하고자 하는 이미지의 대표 색상을 추출하는 로직이 필요했다. 안드로이드의 경우 Palette 더보기…

Android MVI 라이브러리 Orbit-MVI

이전 포스팅 Android 프로젝트에 MVI 도입하기 를 먼저 읽는 것을 권장합니다. Orbit 개요 Orbit은 안드로이드 뿐만 멀티플랫폼을 지원하는 Redux/MVI 같은 라이브러리 이며, 쉽고 가벼운 것이 특징이다. 자세한 내용은 아래의 링크에서 참조하자 orbit-mvi github 저장소 공식 페이지 orbit을 프로젝트에 추가하기 위해 build.gradle에 다음 의존성을 추가 할 수 있다.(최신버전 확인) Orbit은 다음과 더보기…

생명주기에 맞춰 안전하게 코루틴 사용하기

생명주기에 안전한 코루틴 lifecycle 컴포넌트를 사용한다면, 생명주기를 인식하는 코루틴을 만들 수 있다. LifecycleOwner로써 취급되는 AppCompatActivity(ComponentActivity) 또는 Fragment를 일반적으로 사용할 때 lifecycle 컴포넌트를 사용하게 되는데 이때 lifecycleScope를 사용할 수 있다. 일반적은 코루틴 스코프와 마찬가지로 launch를 async와 같은 함수 호출을 통해 suspendable 한 작업을 할 수 있다. lifecycleScope.launch { // 코루틴 작업 더보기…

콜드 스트림을 핫 스트림으로 변경하기 (shareIn, stateIn)

MutableSharedFlow를 사용하여 값을 발행하고 다른 한편에서는 이를 수집할 수 있는 수단을 제공한다. 그러나 다른 코드에 있는 콜드 플로우를 가져와서 이 업스트림을 수집하고 SharedFlow로 내보낼 수 있는 편리한 방법도 있다. 바로 ShareIn 연산자를 사용하는 것이다. ShareIn 연산자 shareIn 연산자는 다음과 같이 생겼다. 이 연산자를 사용하면, Flow(콜드스트림)를 주어진 코루틴 스코프(scope) 내에서 시작되는 더보기…

[이펙티브 코틀린 요약] 효율적인 컬렉션 처리

컬렉션은 중요한 개념이며, 안드로이드에서도 일반적으로 RecyclerView, LazyColumn 등을 사용할 때 컬렉션을 사용하게 된다. 현대적인 프로그래밍 언어는 대부분 컬렉션 처리를 굉장히 잘 지원해주며, 코틀린도 강력한 컬렉션 처리를 지원한다. 컬렉션을 처리하는 부분의 최적화는 성능에 큰 영향을 미치므로 굉장히 중요하다. 이번 포스팅에서는 효율적인 컬렉션 처리를 하는 방법에 대해서 알아본다. 하나 이상의 처리단계를 가진 더보기…

오토박싱 및 언박싱 그리고 JVM내 캐시에 대하여

Autoboxing vs Unboxing 오토박싱(Autoboxing)은 Java 컴파일러가 원시 타입(Primitive types)과 해당 객체 래퍼 클래스 간에 수행하는 자동 변환을 말한다. 예를 들어 int를 Integer로, double을 Double로 변환하는 식이다. 변환이 다른 방향으로 진행되는 경우 이를 언박싱(unboxing)이라고 한다. 다음 간단한 오토박싱 예제를 살펴보자. ‘a’의 타입은 char인데 Character에 대입했다. 이렇게 해도 호환이 되며 이것이 오토박싱이다. 더보기…

[이펙티브 코틀린 요약] 비용 줄이기

과거에는 메모리가 비쌌고 하드웨어적인 제약이 컸기 때문에 효율성(efficiency) 및 최적화에 많은 노력을 기울였다. (1985년에 출시한 게임, 마리오 브라더스 용량이 약 40kB이였던 것에 대해 생각해보자) 하지만 오늘날에는 상대적으로 하드웨어보다 개발자의 몸값이 비싸기 때문에 과거보다는 효율성에 대해 상대적으로 관대하게 바라본다.하지만 여러가지 측면에서 최적화는 여전히 중요하다. 조금만 최적화에 신경을 써도 사용자 및 기업이 더보기…

처음 시작하는 코루틴, 기본적인 용어와 이해

코루틴(Coroutines)이란? 코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다. 코루틴은 다음과 같은 특징을 갖는다. 경량화 메모리 누수 감소 계층적 구조를 통한 취소 전달 Jetpack과의 통합 Suspend function suspend(유예하다, 연기하다) vs block(막다, 차단하다) blocking과 suspending의 차이에 대해서 먼저 알아보자. 단일 쓰레드에서 네트워크 요청(FUNCTION A)과 같은 더보기…

글쓴이 Charlezz,