Mutipart 무엇인가? - Multipart는 HTTP에서 여러 종류의 데이터를 동시에 전송하기 위해 사용되는 방식입니다. - 'Content-Type' 헤더에 'multipart/form-data'값을 가지며 여러 개의 part로 구성됩니다. - 주로 파일 업로드나 폼 데이터 전송 등에 사용됩니다. Multipart 활용을 위한 Api 호출 함수 구성 @Multipart @PATCH("/api/v1/users/{id}") suspend fun editUserImage( @HeaderMap headers: HashMap, @Path("id") id: Int, @Part file: MultipartBody.Part ): Response @Multipart 어노테이션과 보낼 파일 데이터에 대해서는 @Pa..
Development/Android
SharedPreferences 정의 SharedPreferences는 안드로이드 애플리케이션에서 간단한 키-값 쌍을 저장하고 검색하기 위한 인터페이스를 제공하는 클래스입니다. 이를 통해 애플리케이션 데이터를 저장하고 필요할 때 검색하여 사용할 수 있습니다. https://developer.android.com/training/data-storage/shared-preferences?hl=ko SharedPreferences로 단순 데이터 저장하기 | Android 개발자 | Android Developers DataStore는 로컬 데이터를 저장하는 최신 방법을 제공합니다. SharedPreferences 대신 DataStore를 사용해야 합니다. 자세한 내용은 DataStore 가이드를 참고하세요. ..
DiffUtil 이란? 안드로이드의 RecyclerView에서 데이터 변경 시, oldList와 newList의 차이를 계산하여 이를 기반으로 변경된 부분만 업데이트를 진행시켜 업데이트의 효율성을 증가시키는 유틸리티 클래스입니다. https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil DiffUtil | Android Developers androidx.appsearch.builtintypes.properties developer.android.com DiffUtil 적용 전과 후 갱신 속도 비교 아래는 공식 문서에 기재된 DiffUtil을 적용하기 전과 후의 갱신 속도 비교표입니다. DiffUtil을 사용했을 경우, 평..
Compose-Lottie 애니메이션 동작 후, Intent로 Activity 전환하기 저는 평소에 Splash Activity를 별도로 Custom 하게 생성 후, Lottie 애니메이션을 포함시켜 구성하는 형태를 많이 사용했었습니다. 그러다 보니 Compose를 공부하면서 똑같은 형태를 구현해 보게 되었네요. 앱 실행 시 기본 네트워크 및 DB 처리가 완료되는 시간을 5초로 간주하고 Lottie 애니메이션이 그동안 동작하고 MainActivity로 넘어가는 구조를 설명하겠습니다. 먼저 Lottie 홈페이지에서 모션 이미지를 선택하여 JSON 형태의 데이터를 다운로드합니다. 이후, res - raw 폴더를 생성하여 해당 폴더에 다운로드한 Lottie 파일을 삽입합니다. 다음, Custom Splash ..
안드로이드 스튜디오 와이파이 활용 무선 디버깅 연결 방법 안드로이드에서 무선 디버깅으로 유선 필요 없이 연결하는 방법을 소개해보겠습니다. 안드로이드 스튜디오는 최신 버전으로 유지해야 합니다. OS 버전은 Android 11 이상이어야 한다고 확인됩니다. https://developer.android.com/studio/run/device?hl=ko#wireless 하드웨어 기기에서 앱 실행 | Android 스튜디오 | Android Developers Android 디버그 브리지(ADB) 연결을 통한 테스트 및 디버깅을 위해 개발 환경 및 Android 기기를 설정하는 방법을 알아보세요. developer.android.com 먼저 설정 - 개발자 옵션을 활성화해야 합니다. 이제 목록에 '무선 디버깅'..
Room DB 기본 설정 후, 데이터 저장 및 가져오기 Room DB 살펴보기 사내 서비스에서 기존에 사용하고 있던 Database가 SQLite, Realm DB 두 가지 종류였는데, 이번에 새로운 테이블 구성이 필요해서 Jetpack에서 제공하는 Room DB를 사용해 봤다. https://developer.android.com/training/data-storage/room?hl=ko Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android 개발자 | Android Developers Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기 developer.android.com Room DB를 그냥 사용하려는 것은 아니고, 당연히 SQLite보다 장점이 있기에 사용하게 ..
앱 테스트 진행 중에 다음과 같은 Exception이 발생했다. Fatal Exception: java.util.ConcurrentModificationException 여러 스레드에서 하나의 컬렉션에 접근할 때, 동시성 문제가 발생하는 것으로 확인된다. 문제가 발생한 코드로 이동해 보니... object DataManager { private var dataInfos = ArrayList() ..... object Manager 내부의 dataInfos라는 리스트가 있고, 해당 DataManager가 외부에서 여러 스레드에 동시 호출되며 dataInfos에 접근하던 중 문제가 발생하는 것으로 확인했다. 싱글톤 하위 리스트를 여러 스레드 접근에 안전하도록 처리할 필요가 있었다. object DataMan..
System 상에서 현재 애플리케이션을 완전히 종료시키는 로직 fun killApp(activity: Activity) { ActivityCompat.finishAffinity(activity) exitProcess(0) } 1. ActivityCompat.finishAffinity(activity) : 주어진 Activity와 해당 Activity 위에 쌓인 모든 Activity를 종료 2. exitProcess(0) : 현재 프로세스를 종료. 0은 정상 종료를 의미하는 코드 값
사용자의 앱이 최신 버전인지를 판단하여 필요에 따라 플레이스토어에서 업데이트를 요구할 수 있는 로직이 필요했다. 마침 Android에서 제공하는 AppUpdateManagerFactory가 존재했다. https://developer.android.com/reference/com/google/android/play/core/appupdate/AppUpdateManagerFactory AppUpdateManagerFactory | Android Developers Stay organized with collections Save and categorize content based on your preferences. AppUpdateManagerFactory public final class AppUpdat..
사용자에게 좀 더 신속한 데이터 갱신 처리를 제공하기 위해 백그라운드 동기화 처리를 구현하기로 했다. Jetpack에서 지원하는 WorkManager를 사용해 보기로 했다. 먼저 build.gradle에 다음 설정을 추가해준다. implementation "androidx.work:work-runtime-ktx:2.8.1" 그리고 작업 정의를 위한 Worker 클래스를 생성한다. class SyncWorker(val context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { syncAndCallApi() return Result.success() } } doWork 내에서 비동기..