[Android] Worker Pool 패턴을 통한 작업의 효율/안정성 올리기
·
작업 일지
[Android] API의 배치 처리와 동시성 처리 : chunked vs semaphore기존 문자를 전송하는 로직은 chunked(10)를 통해 10개의 배치를 만들고 배치 내부는 비동기로 실행하되, 배치 내부의 작업이 모두 끝나면 다음 배치로 넘어가는 순차 방식으로 구현을 했다. // sendMmogyong.tistory.com지난번에 다량의 API 호출 건에 대해 리스트의 chunked와 코루틴의 semaphore를 비교해 보고 semaphore를 사용하려 했다. 하지만 semaphore를 사용했을 때 구조 상 처리할 데이터의 수량만큼 코루틴을 생성해야 하는 문제가 발목을 잡았는데, Worker Pool 패턴에 대해 알게 되었다.Worker Pool / Producer-Consumer / Wor..
[Android] ConnectivityManager로 데이터 절약 모드 감지하기
·
작업 일지
운영 중인 앱의 기능으로 오전 08:00가 되면 WorkManager를 통해 고객에게 문자를 전송하고 있다. 만약 문자 전송에 실패할 경우 에러 내역을 파일로 저장하고, 미전송 내역을 남겨 수동으로 전송할 수 있다. stackTrace: java.net.ConnectException: Failed to connect to ... 어느 날 '예약 문자 전송이 며칠 동안 안 돼서 수동으로 계속 보내고 있다.'는 내용으로 문의가 들어왔다. 에러 내역을 확인해 보니 위와 같은 문구를 확인할 수 있었다. 이 문구는 서버와의 연결에 실패했다는 내용으로 순간적으로 서버가 다운이 되었을까 생각이 들었지만 며칠 동안 동일 시간에 다운이 발생했을 거 같지는 않고, 다른 고객에게서 정상적으로 전송된 로그가 보였다. 특히나..
[Android] API의 배치 처리와 동시성 처리 : chunked vs semaphore
·
작업 일지
운영중인 앱에는 문자를 전송하는 기능이 있다. 문자를 전송하는 로직은 chunked()를 통해 배치를 만들고, 배치 내부는 비동기로 실행하되, 배치 내부의 작업이 모두 끝나면 다음 배치로 넘어가는 순차 방식으로 구현이 되어 있었다. // mmsList: Listval result = mmsList.chunked(10).flatMap { batch -> batch.map { job -> async { sendMms(job) } }.awaitAll()}위 방식은 단건씩 처리하는 것과 비교했을 때 효율을 높이고, 처리량을 조절함으로써 로컬과 서버에 부담을 주지 않는다는 장점이 있다. 하지만 현재 배치의 작업이 지연이 생겼을 때 다음 배치의 시작이 지연되어 처리 속도가 떨어질 수 있다.코..
[Android][Compose] WorkManager & AlarmManger로 특정 시간에 백그라운드 작업 예약하기
·
Android/기타
안드로이드에서는 백그라운드 작업을 돕는 요소들이 있다. 그 요소들 중에서 AlarmManager와 WorkManager를 다뤄 보려고 한다. AlarmManager는 안드로이드 프레임워크에서 제공하는 API로 시스템 레벨의 알람 서비스에 접근하게 해 준다. 정확한 시간에 대한 작업이 필요한 경우에 사용되며, WorkManager가 없던 시절에는 BroadcastReceiver나 JobScheduler를 함께 사용하여 백그라운드 작업을 수행했다. WorkManager는 백그라운드에서의 작업을 보장하는 안드로이드 Jetpack 라이브러리이다. 사용자가 화면을 벗어나거나, 앱이 종료가 되더라도 예약한 기능을 안정적으로 수행할 수 있다. 또한 기기의 상태(네트워크 연결, 저장공간, 충전 상태)와 같은 제약 조건..
[Android] Could not create task ':app:kspDebugKotlin'.
·
Android/이슈 처리
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'. > Could not create task ':app:kspDebugKotlin'. > Cannot query the value of task ':app:kspDebugKotlin' property 'classpathSnapshotProperties.useClasspathSnapshot' because it has no value available.프로젝트를 새로 만들고 의존성을 추가 후 앱을 실행했더니 위와 같은 에러가 발생했다. 의존성을 추가하고 sync에서 문제가 발생하지 않아서 조금 헤매었는데, 이 에러는 KGP와 KSP의 버전이 불일치할 때 자주 나타..
[Android] 인앱 업데이트(in-app update) 적용하기
·
Android/기타
인앱 업데이트 | Other Play guides | Android Developers이 페이지는 Cloud Translation API를 통해 번역되었습니다. 인앱 업데이트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 사용자는 기기에서 앱을 최신 상태로developer.android.com플레이스토어에 앱을 최신 버전으로 배포했을 때, 앱을 사용하던 유저에게 업데이트 할 것을 알리고 싶을 때가 있다. 인앱 업데이트(in-app update)는 이것을 가능하게 하는 Google Play Core 라이브러리 기능이다.◾ 업데이트 방식1. 유연한 업데이트(Flexible udpates)유연한 업데이트는 사용자가 업데이트를 하는 동안 앱을 사용하는 경우에 적합하다. 이..
[Android] WebView에서 다운로드 동작이 안 되는 이유
·
작업 일지
공지사항 화면을 WebView로 관리하고 있는데, 게시글 중에서 apk를 다운로드할 수 있는 링크를 클릭했는데 아무 이벤트가 동작하지 않는 문제가 생겼다. 신기한 점은 다른 WebView에서 똑같은 url로 같은 화면을 띄우는데, 다운로드 동작이 정상적으로 되었다. 해당 부분을 찾아보니 WebView를 사용할 때 WebViewClient를 적용한 경우 WebView의 기본 동작을 WebViewClient의 shouldOverrideUrlLoading()이 대신 수행한다고 한다. 그래서 WebViewClient를 적용 안 한 WebView의 경우 다운로드와 같은 특수 MIME 타입은 자동으로 외부 브라우저로 넘겨 처리를 하기 때문에 다운로드가 정상으로 동작한다. 하지만 WebViewCilent를 적용하면 ..
[Android] Multi Module + build-logic + hilt
·
Android/Architecture
최근에 프로젝트에 새로 들어가면서 구조를 설계하게 되었다. presentation-domain-data로 틀을 잡고 다른 필요한 부분(common 등)은 모듈로 추가하는 방식을 썼는데, 이번에 Now In Android(NIA)의 구조를 참고하면서 그 내용을 정리해 봤다. NIA와 차이가 있는데, feature-core 대신 feature-domain-data로 틀을 잡고 core 모듈에 common과 di 등을 두는 걸 생각했다.◾ 모듈 생성하기File > New > New Module을 통해 모듈을 생성할 수 있다.모듈을 생성할 때 Templates 항목에 여러 가지가 있는데, 사용하는 항목들은 아래와 같다. 1. Phone&Tablet앱 실행에 필요한 모든 요소(Activity, Manifests,..
[Android][Compose] kizitonwose/Calendar, 캘린더 라이브러리 사용기 #3
·
Android/UI
[Android] kizitonwose/Calendar, 캘린더 라이브러리 사용기 #2[Android] kizitonwose/Calendar 캘린더 라이브러리 사용기 #1GitHub - kizitonwose/Calendar: A highly customizable calendar view and compose library for Android and Kotlin Multiplatform.A highly customizable calendar view and compose library for Andogyong.tistory.comkizitonwose/Calendar, 캘린더 라이브러리 사용기 #2는 View 기반으로 작업을 하였다. 이번에는 Compose를 기반으로 사용해 봤다. Compose로 사용하..
[Android] kizitonwose/Calendar, 캘린더 라이브러리 사용기 #2
·
Android/UI
[Android] kizitonwose/Calendar 캘린더 라이브러리 사용기 #1GitHub - kizitonwose/Calendar: A highly customizable calendar view and compose library for Android and Kotlin Multiplatform.A highly customizable calendar view and compose library for Android and Kotlin Multiplatform. - kizitonwose/Calendargithub.com캘린ogyong.tistory.com지난번 kizitonwose/Calendar, 캘린더 라이브러리 사용기 #1에 이어서 몇 가지 기능을 추가해 보려고 한다.- CalendarVie..
[Android] kizitonwose/Calendar, 캘린더 라이브러리 사용기 #1
·
Android/UI
GitHub - kizitonwose/Calendar: A highly customizable calendar view and compose library for Android and Kotlin Multiplatform.A highly customizable calendar view and compose library for Android and Kotlin Multiplatform. - kizitonwose/Calendargithub.com캘린더에 날짜 이외에 다른 데이터를 함께 표시할 일이 생겨서 적합한 라이브러리를 찾던 중 kizitonwose의 Calendar 라이브러리를 발견했다. 해당 라이브러리는 캘린더를 개발자가 원하는 모습으로 꾸미는 것이 가능하다. 그리고 라이브러리를 사용하기 위한 샘플..
[Android] Warning: SDK processing. This version only ···
·
Android/이슈 처리
Warning: SDK processing. This version only understands SDK XML versions up to 3 but an SDK XML file of version 4 was encountered. 안드로이드 스튜디오를 미어캣( 2024.3.2)으로 업데이트를 하고서 빌드를 할 때 위의 에러가 발생했다. 안드로이드 스튜디오를 최신으로 업데이트 했으나 명령 도구가 구버전인 경우이거나, SDK Manager에서 최신 SDK 컴포넌트를 설치했으나 안드로이드 스튜디오가 구버전인 경우 내부에 있는 최신 XML 파일을 제대로 이해하지 못해서 발생한다는 에러라고 한다. SDK 내의 package.xml 파일이 버전 4인데 읽는 도구가 버전 3까지만 이해할 수 있다는 것 같다. 해결 ..