본문 바로가기

분류 전체보기143

[Android/Kotlin] Jetpack Compose + Paging3로 무한 스크롤 구현하기 사진 리스트처럼 무한히 스크롤되는 데이터를 효율적으로 불러오려면, 모든 데이터를 한 번에 불러오는 것이 아니라 필요할 때 필요한 만큼만 로드하는 방식이 필요합니다.Jetpack Compose에서는 Paging3와 함께 이를 쉽게 구현할 수 있습니다.이 글에서는 Unsplash API를 예시로, PagingSource, Pager, PagingData, 그리고 LazyPagingItems를 어떻게 연결하는지를 공부한 내용을 기반으로 정리해보았습니다.1. 의존성 추가먼저 build.gradle에 아래와 같이 Paging 관련 의존성을 추가합니다.// 필수: Paging 로직의 핵심 구성implementation("androidx.paging:paging-runtime:3.3.2")// 선택: Paging 데.. 2025. 5. 15.
[Android/Kotlin] Jetpack Compose에서 Flow.debounce()로 검색 요청 최적화하기 프로젝트에서 실시간 사진 검색 기능을 구현하던 중, 검색어 입력 시마다 API가 호출되는 문제가 있었습니다.예를 들어 사용자가 "dinosaur"를 입력하면 "d", "di", "din" 등 입력하는 매 글자마다 API 요청이 발생했기 때문에 불필요한 호출이 많아지고 사용자 경험에도 영향을 주고 있었습니다.이 문제를 해결하기 위해 Flow.debounce()를 적용해 검색 흐름을 개선해보았습니다.문제 상황: 과도한 API 호출처음에는 TextField의 onValueChange에서 바로 API를 호출하고 있었기 때문에, 아래와 같이 입력할 때마다 로그가 찍히고 요청이 전송되었습니다. 이처럼 한 글자 입력할 때마다 API 요청이 발생해 사용량이 과도하게 늘고로딩 UI가 계속 깜빡이는 등 UX에도 부정적인 .. 2025. 5. 7.
[Android/Kotlin] Room + Flow 조합으로 즐겨찾기 화면 자동 갱신하기 Jetpack Compose로 마이그레이션을 진행하면서, 기존 LiveData 기반의 ViewModel 코드를StateFlow + Flow 중심 구조로 함께 개선했습니다.특히 즐겨찾기 화면에서는 그동안 LiveData 기반으로 onResume() 시점마다 수동으로 데이터를 다시 불러와야 했는데요,이번에는 StateFlow와 Room + Flow 조합을 통해 자동으로 갱신되는 UI 흐름으로 전환하게 되었습니다.이를 통해 어떤 점이 개선되었고, 실제로 어떤 구조의 차이가 있었는지 정리해보고자 합니다.기존 방식: 수동 갱신이 필요했던 구조기존에는 ViewModel 내부에서 다음과 같이 데이터를 불러오는 방식을 사용하고 있었습니다.private fun loadFavoritePhotos() { viewMod.. 2025. 4. 24.
[Android/Kotlin] BaseViewModel을 걷어내고 원본 비율을 살린 Masonry 레이아웃 개선기 Pinterest 스타일의 UI를 구현하기 위해, 저는 처음에 각 이미지 카드의 높이를 랜덤하게 설정하는 방식으로 StaggeredGrid를 구성했습니다.이때는 ViewModel에 높이 계산 로직을 두고 position을 기준으로 랜덤한 값을 생성해서 캐싱했으며, 이를 여러 Fragment에서 공통으로 사용하기 위해 BaseViewModel을 상속받는 구조를 사용했었습니다.하지만 프로젝트의 주요 UI를 Jetpack Compose로 마이그레이션하면서,사진 콘텐츠를 더 자연스럽고 의미 있게 표현하기 위한 Masonry 스타일의 본질을 다시 생각하게 되었고, 그 결과 ViewModel 기반 구조는 제거하고 확장 함수를 활용한 방향으로 리팩터링하게 되었습니다.문제점: 랜덤한 높이는 시각적 흥미를 줄 수 있지만.. 2025. 4. 14.
[Android/Coroutine] Cold Stream vs Hot Stream 쉽게 이해하기: 언제 어떤 것을 써야 할까? 코루틴을 사용하다 보면 Flow, StateFlow, SharedFlow와 같은 다양한 스트림 타입을 접하게 됩니다.이때 함께 따라오는 개념이 바로 Cold Stream과 Hot Stream입니다.처음에는 문서에 나와 있는 특징들을 정리하며 각각을 구분해보려 했지만,막상 실제 코드에 적용해 보려 하니 어떤 상황에서 무엇을 선택해야 할지 명확하게 감이 오지 않았습니다.그래서 이 개념들을 좀 더 쉽게, 감각적으로 이해할 수 있는 방법이 없을까 고민하게 되었고,그 과정에서 일상에서 흔히 겪는 상황들을 비유로 떠올려 보며 Cold Stream과 Hot Stream의 차이를 정리해 보았습니다.Cold Stream이란?Cold Stream은 collect가 시작되어야 비로소 동작하는 스트림입니다. 대표적으로 Kot.. 2025. 3. 28.
[Android/Kotlin] Kotlin 컬렉션 확장 함수 정리: associateBy 사용법 Kotlin에서는 리스트나 배열과 같은 컬렉션을 다룰 때 유용한 확장 함수(Extension Function)들이 많이 제공됩니다. 그 중에서도 associateBy는 컬렉션을 Map으로 변환할 때 자주 사용되는 함수입니다.이 글에서는 associateBy의 기본 개념부터 실전 예제까지 정리해보았습니다.associateBy란?associateBy는 컬렉션(List, Array 등)의 요소를 기준값으로 묶어 Map으로 변환해주는 확장 함수입니다.즉, 리스트의 각 요소에서 특정 값을 꺼내 Key로 삼고, 해당 요소를 Value로 하여 Map을 만드는 방식입니다.기본 사용법val resultMap = list.associateBy { it.someProperty } someProperty는 각 요소에서 추출한.. 2025. 3. 27.
[Android/Compose] collectAsState()를 활용한 상태 관리 Jetpack Compose에서 Flow 또는 StateFlow를 UI에서 구독할 때, 상태를 효율적으로 관리하는 것이 중요합니다.이때 collectAsState()를 사용하면 Flow를 State로 변환하여 UI가 자동으로 최신 상태를 반영할 수 있습니다.이번 글에서는 collectAsState()가 무엇이며, 어떻게 사용해야 하는지 공부 한 내용을 정리하겠습니다.1. collectAsState()란?collectAsState()는 Jetpack Compose에서 Flow나 StateFlow를 구독하여 State로 변환하는 함수입니다.이 함수를 사용하면 Composable 내부에서 Flow를 안전하게 수집(collect)할 수 있으며, 값이 변경될 때 자동으로 UI가 갱신됩니다.또한, State로 변환.. 2025. 3. 20.
[Android/Coroutine] SharingStarted.WhileSubscribed(): 효율적인 Flow 공유 전략 Flow를 UI에서 구독할 때 불필요한 리소스 낭비를 방지하는 것이 중요합니다.SharingStarted.WhileSubscribed()를 사용하면 구독자가 있을 때만 데이터를 방출하고, 없으면 정지하는 방식으로 Flow를 최적화할 수 있다는 것을 알게 되었습니다.이번 글에서는 SharingStarted.WhileSubscribed()가 무엇인지, 그리고 어떤 상황에서 유용한지 공부한 내용을 정리해두겠습니다.1. SharingStarted란?SharingStarted는 Flow를 여러 곳에서 공유할 때 흐름을 언제 시작하고, 언제 중지할지를 결정하는 전략입니다.이를 활용하면 ViewModel에서 Flow 데이터를 공유하고, UI에서 구독할 때 불필요한 연산을 줄일 수 있습니다.SharingStarted .. 2025. 3. 20.
[Algorithm/Kotlin] 백준 30804번 과일 탕후루: 투 포인터(슬라이딩 윈도우)로 최적화 문제 설명은하는 긴 막대에 N개의 과일이 꽂혀있는 과일 탕후루를 만들었습니다.과일의 종류는 1부터 9까지 있으며, 막대에는 앞쪽부터 차례대로 S1,S2,...,SN번 과일이 꽂혀 있습니다.그러나 주문을 다시 확인해 보니 과일을 두 종류 이하로 사용해야 한다는 요청이 있었습니다.새로 만들 시간이 없는 은하는 앞쪽에서 a개, 뒤쪽에서 b개의 과일을 빼서 두 종류 이하의 과일만 남기기로 했습니다.즉, 막대의 연속된 구간 중에서 과일 종류가 2개 이하인 가장 긴 부분을 찾아야 합니다.이때, 남아 있는 과일 개수가 가장 많은 경우를 구하는 것이 목표입니다.입력첫 줄에 과일의 개수 N이 주어집니다. (1≤N≤200,000)둘째 줄에 탕후루에 꽂힌 과일을 나타내는 NNN개의 정수 S1,S2,...,SN​이 공백으로 .. 2025. 3. 17.
반응형