7월, 2024의 게시물 표시

Android Kotlin Queue refactoring

이미지
사용 버전: Android Studio Koala 2024.1.1 안드로이드 코틀린 Queue refactoring을 알아보겠습니다. Queue(큐)는 기본적인 자료구조에 많이 등장하는 것으로 들어간 순서대로 나옵니다. 보통 배열로 사용하는 List보다 빠릅니다. 4년 전에 작성한 코드입니다. 나름 생각해서 만든 코드인데요. 광고가 4번째 칸마다 들어가도록 만든 로직입니다. 현재 보니 충분히 Queue로 로직을 변경할 수 있을 것 같아 보이네요. 원래 item(아이템)들을 하나의 큐에 넣고 광고를 또 다른 큐에 넣어줍니다. 두 개의 큐 중에 하나라도 다 떨어질 때까지 진행하면서 4번째 차례마다 광고를 꺼내서 넣어줍니다. 무한 반복이 끝난 후, 만약 남은 원래 item이 있다면 차례로 넣어줍니다. Kotlin에 있는 ArrayDeque(어레이 덱)를 사용해봅시다. Double Ended Queue의 준말입니다. https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-deque/ 다음과 같이 refactoring(리펙토링) 되었습니다. 끝. 카테고리: Android

Android Unit tests with an android dependency

사용 버전: Android Studio Koala 2024.1.1 안드로이드 Unit tests with an android dependency를 알아보겠습니다. Unit(유닛) test(테스트) 또는 Local(로컬) test는 JVM에서 실행됩니다. 즉, Android와 관련된 패키지가 있다면 정상적으로 작동하지 않는다는 얘기입니다. 제 앱에 Unit test를 추가하다가 발견한 문제입니다. Domain(도메인)에 있는 Usecase(유즈케이스)가 test에 사용되었습니다. import android.net.InetAddresses import android.os.Build IP(아이피) 주소를 확인하기 위한 InetAddresses와 OS(운영체제)의 SDK(개발자 도구) 버전을 확인하기 위한 Build.VERSION.SDK_INT를 사용하였습니다. 보시다시피 android에 dependency(의존성)를 가집니다. 이러한 것을 해결하는 방법으로는 Mockito(모키토)를 사용하거나 android 의존성을 없애거나, Instrumented(계측) test에서 test를 진행하는 것입니다. 저는 InetAddresses를 Guava 라이브러리로 대체하며 os.Build도 같이 제거하였습니다. 이렇게 제거하니 test가 정상적으로 작동되더군요. import com.google.common.net.InetAddresses 끝. 카테고리: Android

Android Jetpack Navigation with multi-module

이미지
사용 버전: Android Studio Koala 2024.1.1 안드로이드 Jetpack Navigation with multi-module을 알아보겠습니다. 현재 하나의 module(모듈)로 구성된 제 앱을 multi-module(멀티 모듈)로 변경하고 있습니다. 그러다 만난 난관이 있는데요. 바로 Jetpack(잿팩) Navigation(내비게이션)입니다. Navigation은 Fragment 간의 화면을 전환하는 데 도움을 주는 라이브러리입니다. 문제는 여기서 발생합니다. 제 앱이 이런 식으로 Modularization(모듈화)을 진행합니다. :app -> :feature -> :ui :app에 navigation.xml 파일을 두게 되면, :feature에서 :app을 보지 못해 navigate를 사용할 수 없게 됩니다. 반대로 이것을 :ui에 두게 되면, :ui는 :feature(피처)를 참조할 수 없어서 navigation.xml에 fragment(프레그먼트)를 참조할 수 없게 됩니다. 어떻게 해야 할까요? 저는 이렇게 해결했습니다. Navigation Graph(그래프)를 Kotlin DSL로 전환합니다. https://developer.android.com/guide/navigation/design/kotlin-dsl 그리고, navigation library는 Kotlin DSL에서 Type Safe Args를 사용할 수 있는 2.8.0-alpha08 이상으로 해줬습니다. https://developer.android.com/jetpack/androidx/releases/navigation#2.8.0-alpha08 Navigation graph를 다음과 같이 설정해 줍니다. 이것을 MainActivity에서 호출해 줍니다. Serializable은 :Model 모듈에 만들었습니다. 이러한 navigation.xml은 kotlin DSL로 변환하면, 이렇게 됩니다. 전체적인 구조는 :app, :features -> :model ...

Android BuildConfig

이미지
사용 버전: Android Studio Koala 2024.1.1 안드로이드 BuildConfig를 알아보겠습니다. BuildConfig(빌드 컨피그)는 Build(빌드) 시에 자동으로 정보를 생성하여 Runtime(런타임)에 참조할 수 있도록 만들어주는 기능입니다. 참고 문서: https://developer.android.com/build/gradle-tips 현재 제 앱에서는 MainActiivty의 companion object에 Debug를 설정하는 코드를 사용하고 있습니다. 직접 Debug 모드를 설정할 수 있다는 점이 좋았는데요. 문제는 앱 구조를 Official android architecture(공식 안드로이드 아키텍처)로 변경하면서 MainActivity 의존성을 제거해야 하는 것이었습니다. 의존성 분리도 하고, DEBUG(디버그)를 확인할 때 좋은 것이 바로 BuildConfig 기능입니다. 사용할 module(모듈)의 gradle(그레이들)에 갑니다. buildFeatures 안에 buildConfig = true를 적어줍니다. Sync Now 및 Build를 해줍니다. 그 뒤 사용은 이렇게 합니다. 참고로 Build type에 따라서 새로운 buildConfigField를 만들 수도 있습니다. 아래는 IS_DEBUG라는 Field(필드)를 새로 만들어 봤습니다. BuildConfig 생성 위치는 module 이름 - build - generated - source - buildConfig - flavor 이름 - 패키지 이름 - BuildConfig.java입니다. BuildConfig.java를 보시면 이렇게 잘 들어간 모습을 볼 수 있습니다. 끝. 카테고리: Android