Development

- Glide는 다양한 형식과 빠른 이미지 로딩을 지원하는 이미지 라이브러리다. - Coil 또한 마찬가지다. 하지만 두 라이브러리 간에는 미세한 차이가 있어 구현 방식에 따라 선택할 수 있다고 본다. - 먼저 Glide는 스레드 풀 기반으로 동작한다. 이미지 요청이 들어오면 미리 만들어 둔 스레드 한 개를 할당해서 작업을 시키고, 쌓이는 대로 순차적 처리를 진행한다. 한 번에 캐싱 처리 없이 많은 요청이 들어올 경우 메모리에 부담을 줄 수 있다. - 하지만 그만큼 리소스 로딩에 대한 다양한 메서드를 제공하고, Gif 같은 형식을 로드할 때도 단순하게 사용하면 된다.@OptIn(ExperimentalGlideComposeApi::class)@Composablefun GlideWidgetImage() {..
- 기존 다음과 같은 EditTextBox 형식의 검색 바를 통해 검색어 입력 후, 키보드의 검색 버튼을 누르면 결과 확인이 가능한 로직이 있었다.Row(verticalAlignment = Alignment.CenterVertically) { OutlinedTextField( value = searchQuery, onValueChange = { searchQuery = it }, modifier = Modifier .weight(1f) .padding(end = 8.dp), placeholder = { Text("지하철역 검색") }, singleLine = true, keyboardO..
- 실제 서버 없이도 내가 구성한 ApiService가 응답 처리를 정상적으로 하는지 테스트해 볼 수 있다. - DTO 매핑이나 세그먼트 초기 구성 테스트에 적합하고, MockWebServer를 활용할 수 있다. - MockWebServer는 로컬에서 돌리는 가짜 HTTP로서, Retrofit / Okhttp 테스트 시에 임시로 붙어서 동작시켜 볼 수 있다. - 아래 설정들을 gradle에 추가해준다.testImplementation("com.squareup.okhttp3:mockwebserver:4.9.3")testImplementation("com.squareup.retrofit2:converter-moshi:2.9.0")testImplementation("com.squareup.moshi:moshi..
- 최근 내가 구성한 클린 아키텍처의 레이어는 프레젠테이션 - 도메인 - 데이터 레이어로 구성된다. - 여기서 도메인이란 무엇일까? 바로 비즈니스 로직과 함께 앱의 핵심적인 규칙을 정의하는 레이어다. - UseCase가 포함되며 UseCase는 애플리케이션의 구체적인 비즈니스 규칙을 캡슐화한 것이다. - 앱의 기능적인 부분이 변경된다? 이 도메인 레이어를 수정하게 된다. - 여기서 기능을 명확히 보자1. 사용자에게 스켈레톤 효과를 보여준다.2. 사용자에게 유저 데이터 조건 처리를 통해 이벤트 목록을 추천한다.3. 사용자가 선택한 이벤트를 로컬 DB에 저장한다. - 1번의 경우에는 순수 UI 동작이다. 안쪽 레이어로 들어올 이유가 없다. - 3번의 경우에는 로컬 DB에 저장하는 순수 서비스의 기능이다. 데..
Scaffold란?- Scaffold는 TopBar, BottomBar, FAB 등 전용 슬롯을 가지고 화면의 뼈대를 만들어주는 컴포저블이다.@Composablefun Scaffold( modifier: Modifier = Modifier, topBar: @Composable () -> Unit = {}, bottomBar: @Composable () -> Unit = {}, snackbarHost: @Composable () -> Unit = {}, floatingActionButton: @Composable () -> Unit = {}, floatingActionButtonPosition: FabPosition = FabPosition.End, containerC..
- 서비스 기능 중에 Custom Tabs로 자사 서버에서 제공해 준 url을 열고, 앱링크로 데이터를 수신받아 다시 앱을 열어주는 로직이 있었는데, 디바이스 기본 브라우저가 파이어폭스면 이 앱링크가 동작하지 않는 문제가 있었다. - 찾아보니.. 파이어폭스 자체 앱 말고 사이드 브라우저 통해서는 앱링크를 지원하지 않는 것으로 보인다....;https://connect.mozilla.org/t5/ideas/firefox-for-android-deep-link/idi-p/23741 Firefox for android - deep linkHello! I use firefox very long time - from version 6 or ssomething like this, i very love this br..
- 안드로이드에서는 Background Task 수행이 메모리, 배터리 등의 자원 문제로 제한적이다. - 기본적으로 안드로이드는 리눅스 커널 기반 운영 체제인데, 리눅스와는 달리 디스크 스왑 파티션이 없다. - 스왑 파티션 (Swap Space)이 무엇이냐? 램이 가득 찼을 때 사용되는 곳으로 메모리 상의 비활성화 데이터를 스왑 파티션으로 이동시킨다. - 하지만 그렇다고 스왑 파티션 자체가 램의 용량을 늘린다고는 할 수 없다. 액세스 타임이 느린 HDD 레벨에 존재하기 때문이다.- 안드로이드는 기본적으로 이 Swap Space가 없기 때문에 시스템이 메모리를 많이 잡아먹는 프로세스에 대해 백그라운드 동작을 하지 못하도록 강제 종료하고 여유 메모리를 확보한다. - 모든 프로세스는 액티비티 매니저가 부여한 ..
- 데이터를 로컬이나 서버로부터 가져오는 접근자인 데이터 소스 - 기존 프로젝트에서 급하게 먼저 출시하느라 DataStore에 값을 저장하고 가져오는 로직이 object로 단순하게 구성되어 있었다.object SettingsDataStore { private val Context.dataStore by preferencesDataStore(name = "settings") private val LAST_TRAIN_KEY = booleanPreferencesKey("last_train_enabled") private val DEST_ID = stringPreferencesKey("destination_id") private val DEST_NAME = stringPreferencesK..
- 백그라운드 작업을 예약하고 수행하기 위한 Jetpack 요소인 WorkManager를 클린 아키텍처 + Hilt 구조 프로젝트에 사용해 봤다.HiltWorker 구성- 먼저 WorkManager에 대한 gradle 의존성을 추가하되, Hilt worker에 대해서도 같이 추가해주어야 한다.implementation("androidx.hilt:hilt-work:1.2.0")implementation(libs.androidx.work.runtime.ktx)- Hilt와 Worker 간 브리지 역할을 해주는 설정이다. - Worker를 구성해 준다.@HiltWorkerclass JibroWorker @AssistedInject constructor( @Assisted context: Context, ..
- 최근 개인 제작 앱을 구글 플레이 스토어에 등록 심사를 요청했는데, ACCESS_FINE_LOCATION 권한에 대한 허가가 필요한 이유를 사용자에게 구체적으로 제공해야 한다고 하여 거절당했다. - 가볍게 Toast로 위치 권한이 필요합니다. 정도로는 납득시킬 수 없고, 적절한 기능 예시와 함께 사용자에게 권한 허가를 요청해야했다. - 먼저 해당 권한에 대한 기능 관련 화면 스크린숏을 3장 정도 수집했다. 그리고 drawable에 추가. - 나는 수평 슬라이드 페이징을 통해 예시 화면을 보여주고자 했다. - 대충 슬라이드 페이징 - 제목 - 설명 - Yes or No 버튼을 수직으로 배치하고자 Column을 최상단에 약간의 padding을 넣어 선언했다.Column( modifier = Modi..
SeungYong.Lee
'Development' 카테고리의 글 목록