본문 바로가기

전체 글

(51)
[안드로이드] Dynamic Json Deserialization 최근 API의 Response 형태를 살펴보면 json이 다양한 형태로 응답을 주는 경우도 있습니다. 안드로이드에서 이러한 Dynamic JSON을 효과적으로 다루는 방법에 대해 포스팅하겠습니다.// 다양한 형태로 오는 json[ { "type": "USER", "name": "김철수", "age": 20, "birthday": "20001201" }, { "type": "GUEST", "nickname": "닉네임" }, ...]먼저 Data Class 정의 방법부터 살펴보겠습니다.1. Dynamic Json을 위한 Data Class 정의1-1. 모든 필드에 대해 nullable을 지정하는 방법 (Bad Case)d..
[안드로이드 Jetpack Compose] Custom Splash Activity 만들기 이번 포스팅에서는 안드로이드 Jetpack Compose 환경에서 Custom Splash Activity를 만들겠습니다. 그리고 Animatable() 함수를 이용하여 스플래시 화면이 서서히 나타나는 효과를 넣겠습니다. 안드로이드 12 이상부터는 SplashScreen API가 추가됐지만 Custom Splash Activity를 별도로 제작한 이유에 대해서도 설명하겠습니다. 1. 안드로이드 12 이상에서 제공하는 SplashScreen API의 장단점 해당 기능을 사용하면 별도의 Activity 없이 스플래시 화면을 구성할 수 있기 때문에 리소스와 시간을 절약할 수 있지만 정해진 규격대로만 설정할 수 있어서 디자이너와 기획자의 요구사항에는 부족할 수 있습니다. SplashScreen API의 장단점을..
[안드로이드 트러블 슈팅] 웹뷰 JavascriptInterface 난독화 주의할 점 안드로이드 앱에서 웹 콘텐츠와의 상호작용은 흔히 웹뷰(Webview)를 통해 이루어집니다. 특히 앱과 웹 서버 간의 통신을 위해 JavascriptInterface를 추가하는 경우가 많습니다. 이번 포스팅에서는 JavascriptInterface를 사용할 때 난독화 때문에 발생한 트러블 슈팅 경험에 대해 공유하고자 합니다. 1. 문제 상황 개발 중인 앱에서는 Firebase Cloud Messaging(FCM) 토큰을 서버에 전송해 푸시 알림을 받을 필요가 있었습니다. 이를 위해 웹뷰를 통해 로그인 시, 안드로이드에서 정의한 로그인 Data Transfer Object(DTO)를 Gson 라이브러리를 이용하여 JSON 문자열로 변환하고, Web Bridge 방식을 통해 데이터를 웹 서버로 전달하는 방식을..
[안드로이드 onBackPressedDispatcher] 뒤로 가기 두 번 눌러서 앱 종료하기 안드로이드 앱에서 제일 처음의 화면에서 뒤로 가기를 눌렀을 때 앱이 바로 종료되지 않고, 일정 시간 내에 뒤로 가기 버튼을 한번 더 눌렀을 때 앱이 종료되는 것을 많이 볼 수 있습니다. 이번 포스팅에서는 안드로이드 Jetpack의 OnBackPressedDispatcher를 활용해서 뒤로 가기를 두 번 눌렀을 때 앱이 종료되는 기능을 구현하겠습니다.1. OnBackPressedDispatcher란?onBackPressedDispatcher는 안드로이드 Jetpack 컴포넌트 중 하나로, 액티비티 뒤로 가기 버튼의 동작을 관리하고 있습니다. 기존에는 onBackPressed() 함수를 오버라이드해서 뒤로 가기 기능을 커스텀할 수 있었지만, API 33 이후부터 해당 함수가 Deprecated 되면서 onB..
[안드로이드 트러블 슈팅] 코틀린에서 가변인자(vararg)를 사용할 때 주의할 점 개발을 하다 보면 여러 가지 트러블 슈팅을 겪게 되는데 이번 포스팅에서는 안드로이드 코틀린에서 가변인자(vararg)를 사용할 때 발생한 문제와 주의할 점에 대해 공유하고자 합니다. 코틀린의 vararg 키워드는 함수에 가변 개수의 인자를 전달할 수 있어서 큰 유연성을 제공합니다. 그러나 제대로 알고 사용하지 않는다면, 예상치 못한 결과에 직면할 때가 있는데 vararg를 사용하다가 발생한 문제와 해결 과정에 대해 포스팅하겠습니다.1. 문제 상황코틀린에서 vararg를 사용해서 문자열 리소스 ID와 포맷 인자를 받아 로컬라이즈 된 문자열을 반환하는 함수를 따로 구현했었습니다. 제가 개발했던 서비스는 다국어를 지원하고 있었고 앱 내에 언어를 선택하는 기능이 있었기 때문에 Context.getString()..
[안드로이드 Coroutine Flow] 코틀린 Flow에 대해서 안드로이드 앱 개발에 있어서 비동기 프로그래밍은 중요한 부분을 차지합니다. UI가 반응성 있게 동작하도록 하기 위해서 네트워크 요청, 데이터베이스 작업 등 시간이 걸리는 작업을 메인 스레드에서 분리해서 처리하게 됩니다. 이러한 작업을 리액티브 프로그래밍으로 처리하면 코드 관리 측면에서 유리해지는데, 안드로이드 코틀린 Coroutine의 Flow는 데이터 스트림으로써 리액티브 프로그래밍을 지원합니다. 1. Kotlin Flow 소개 코틀린 Flow는 코루틴을 기반으로 한 리액티브 프로그래밍을 가능하게 하며, 시간에 따라 여러 값을 방출할 수 있는 콜드 스트림(cold stream)입니다. 콜드 스트림은 아래와 같은 특징이 있습니다. 데이터를 내부에서 생성 소비자가 구독할 때, 데이터를 생성 하나의 생산자에..
[안드로이드 Coroutine Flow] State Flow 원자성 보장 안드로이드의 State Flow는 Kotlin Coroutine의 일부로, 상태 관리를 위해 만들어진 Flow입니다. 상태가 없는 Flow에 상태를 보유할 수 있는 기능을 추가해서 개발자가 상태를 보다 쉽고 편리하게 관리할 수 있게 해 줍니다. 이번 포스팅에서는 이러한 State Flow를 사용할 때 발생할 수 있는 문제와 원자성을 보장하기 위한 해결방법에 대해 알아보겠습니다. 1. StateFlow 사용방법 안드로이드에서 UI에 상태를 유지하고 변경할 때, StateFlow를 많이 사용합니다. 예를 들어, 아래와 같이 data class로 생성된 상태 홀더를 StateFlow로 관리할 수 있습니다. data class UiState( val name: String = "", val checked: Bo..
[안드로이드 ViewModel] Single State와 Multiple State의 차이 최근 안드로이드에서는 View에 State를 제공하는 형태로 UI에 데이터를 보여주고 있습니다. 이때, 상태를 제공하는 방법으로는 크게 2가지로 나뉘게 됩니다. 바로, Single State와 Multiple State입니다. 각 방법마다 장단점이 존재하고 어려운 개념이 아니기에 코드 예제와 함께 설명하겠습니다. 먼저, 아래의 3개의 변수가 필요한 상황이라고 가정하겠습니다. 제목 내용 체크박스 1. Single State를 사용한 경우 Single State는 하나의 data class로 묶어서 처리하는 것을 뜻합니다. 제목, 내용, 체크박스 상태를 관리하기 위해서 아래처럼 CardUiState라는 data class를 만듭니다. data class CardUiState( val title: String..