반응형

전체 글 106

Flutter 프로젝트에 Firebase Functions 연동하기

기존 Flutter 프로젝트에서 Firebase Functions를 추가하면서 진행했던 과정을 정리해 보았습니다.이미 Firebase(Core, Auth, Firestore 등)는 연결되어 있다는 가정이며, Functions만 추가하는 과정을 다룹니다.개발 환경FlutterFirebaseNode.jsTypeScriptFirebase CLI1. Firebase CLI 설치먼저 Firebase CLI가 없다면 설치합니다.npm install -g firebase-tools설치 확인firebase --version2. Firebase 로그인firebase login브라우저가 열리면 로그인합니다.로그인 확인firebase projects:list현재 접근 가능한 프로젝트 목록이 출력되면 정상입니다.3. 프로젝트..

개발일기 2026.07.22

StateFlow vs SharedFlow, 진짜 차이가 뭔지 이제야 알았다

지난 글에서 "왜 쓰는지 아는 개발자"가 되겠다고 선언했다.그 첫 번째 주제로 StateFlow를 골랐다. 이유는 단순하다. 매일 쓰는데, 설명하라고 하면 막혔기 때문이다."왜 StateFlow를 써요?" "초기값이 있어서요."틀린 말은 아니다. 근데 그게 전부인가? SharedFlow는 언제 쓰는 건지, 내부적으로 뭐가 다른지 — 솔직히 몰랐다. 이번에 제대로 파봤다.먼저, 둘 다 Hot Stream이다Flow에는 Cold와 Hot이 있다.Cold Stream은 collect할 때마다 처음부터 데이터를 새로 만든다. 구독자가 없으면 아무것도 안 한다. 일반 flow { } 빌더가 여기에 해당한다.Hot Stream은 구독자 유무와 상관없이 독립적으로 동작한다. 구독자가 나중에 붙으면 그 시점 이후의 데..

카테고리 없음 2026.04.20

3년차 안드로이드 개발자가 "왜 쓰는지 아는 개발자"가 되기로 한 이유

코드는 짤 줄 안다. 근데 설명은 못 한다.안드로이드 개발을 시작한 지 3년이 넘었다.Jetpack Compose로 UI를 구성하고, MVVM과 Clean Architecture로 구조를 잡고, Hilt로 의존성을 주입하고, Coroutines와 Flow로 비동기를 처리한다. 현대적인 안드로이드 스택은 어느 정도 갖춰진 것 같았다.그런데 어느 날 문득 이런 생각이 들었다."나는 왜 StateFlow를 쓰고 있지?""초기값이 있어서요." — 맞는 말이다. 근데 그게 전부인가?그럼 SharedFlow는? LiveData와 차이는? Compose에서는 State로 바로 써도 되는데 왜 ViewModel에서 굳이 StateFlow로 노출하지?막혔다.쓸 줄은 아는데, 설명은 못 하는 상태였다. 아마 이 코드를 처..

카테고리 없음 2026.04.10

OkHttp Interceptor로 공통 로깅 및 에러 처리하기

안드로이드 앱에서 네트워크 요청은 Retrofit과 OkHttp를 함께 사용하는 경우가 많습니다. 이때 공통 로깅, 인증 토큰 주입, 에러 처리 등을 Interceptor에서 처리하면 코드를 깔끔하게 유지하고, 모든 API 요청·응답을 일관되게 다룰 수 있습니다.1. Interceptor란?OkHttp의 Interceptor는 네트워크 요청(Request)과 응답(Response)을 가로채어 추가 로직을 삽입할 수 있는 기능입니다. Retrofit의 OkHttpClient에 추가해 사용하며, 크게 두 가지로 나눕니다. Application Interceptor: 애플리케이션 레벨에서 실행 (요청/응답 변환, 공통 헤더 추가 등) Network Interceptor: 실제 네트워크 I/O 직전에 ..

개발일기 2025.09.22

멀티 모듈 + Clean Architecture로 Compose 앱 설계하기

대형 Compose 앱을 설계할 때는 모듈 분리(멀티 모듈)과 Clean Architecture를 결합하면 유지보수성과 빌드 속도, 테스트 용이성이 크게 개선됩니다. 이번 글에서는 권장 모듈 구조, Gradle 설정 팁, 의존성 주입(예: Hilt) 적용 방식, 모듈 간 경계 규칙과 테스트 전략까지 실무 관점에서 정리합니다.1. 왜 멀티 모듈 + Clean Architecture인가? 빌드 시간 단축: 변경 범위를 작은 모듈로 제한하면 빌드/증분 컴파일이 빨라집니다. 명확한 책임 분리: presentation / domain / data 레이어가 물리적으로 분리되어 코드 품질 향상. 재사용성 증가: 공통 UI, 유틸, 네트워크 모듈을 여러 앱에서 공유 가능. 테스트 편의성: 작은 단위 모듈을 독..

개발일기 2025.09.19

Compose + Paging 3로 무한 스크롤 구현하기

모바일 앱에서 무한 스크롤은 필수적인 UI 패턴 중 하나입니다. Jetpack의 Paging 3 라이브러리와 Jetpack Compose를 결합하면 복잡한 리스트 페이징을 간단하게 구현할 수 있습니다. 이번 글에서는 Compose와 Paging 3를 활용해 무한 스크롤 리스트를 구현하는 방법을 살펴보겠습니다.1. Paging 3 기본 구조 PagingSource: 데이터 페이지를 로드하는 클래스 Pager: PagingSource를 사용해 Flow를 생성 PagingData: UI로 전달되는 페이징 데이터 컨테이너2. PagingSource 구현class UserPagingSource( private val api: ApiService) : PagingSource() { overrid..

개발일기 2025.09.18

안드로이드 네트워크 + 로컬 캐싱 전략 (Room + Flow)

네트워크 요청만으로 데이터를 처리하면 속도 저하와 오프라인 이슈가 발생할 수 있습니다. 이런 문제를 해결하기 위해 로컬 캐싱을 도입하면 앱의 안정성과 사용자 경험이 크게 향상됩니다. 이번 글에서는 Room + Flow를 활용해 네트워크와 로컬 캐시를 결합하는 방법을 소개합니다.1. 로컬 캐싱의 필요성 네트워크 불안정 시에도 데이터 유지 앱 시작 속도 개선 서버 트래픽 절감2. Room 데이터베이스 설정Room은 SQLite 기반의 ORM 라이브러리로, Flow와 결합하면 자동 데이터 갱신이 가능합니다.@Entitydata class UserEntity( @PrimaryKey val id: Int, val name: String)@Daointerface UserDao { @Quer..

개발일기 2025.09.11

안드로이드 에러 처리 및 UI 피드백 전략

네트워크 기반 앱 개발에서 에러 처리는 사용자 경험을 좌우하는 중요한 요소입니다. 단순히 Toast로 에러를 띄우는 방식은 사용자에게 불친절하고, 유지보수도 어렵습니다. 이번 글에서는 일관된 에러 처리 방식과 UI 피드백 전략을 소개합니다.1. 에러 처리의 기본 원칙 에러를 숨기지 않고 사용자에게 알린다 개발자용 로그와 사용자 피드백을 분리 일관된 구조로 에러를 다룬다 (ex: sealed class)2. 에러 상태를 UiState에 포함하기앞선 글에서 사용한 UiState 패턴을 확장하여 에러 상태를 처리합니다.sealed class UiState { object Loading : UiState() data class Success(val data: T) : UiState() ..

개발일기 2025.09.10

Jetpack Compose와 네트워크 계층 연결하기

앞선 글들에서 Retrofit + Coroutines, Kotlin Flow, OkHttp Interceptor를 활용해 네트워크 계층을 안정적으로 구성하는 방법을 다뤘습니다. 이번 글에서는 Jetpack Compose와 이 네트워크 계층을 연결하여, 실제 UI 상태를 관리하고 화면에 반영하는 방법을 소개합니다.1. Compose에서 상태(State) 관리Compose는 선언형 UI이므로 네트워크 응답을 받아오면 State를 갱신하여 UI를 그립니다.@Composablefun UserScreen(viewModel: UserViewModel) { val uiState by viewModel.uiState.collectAsState() when (uiState) { is UiStat..

개발일기 2025.09.09

안드로이드 앱 네트워크 최적화 (캐싱, 연결 관리, 성능 개선)

이전 글에서는 네트워크 계층 단위 테스트 & 통합 테스트 전략을 다뤘습니다. 이번 글에서는 실제 서비스 운영 단계에서 중요한 네트워크 최적화 기법에 대해 정리합니다. 앱의 성능과 사용자 경험을 크게 좌우하는 핵심 포인트는 캐싱, 연결 관리, 성능 개선입니다.1. 캐싱(Cache) 전략네트워크 호출을 최소화하고 성능을 높이는 대표적인 방법이 캐싱입니다. OkHttp는 자체적으로 Cache 기능을 지원하며, API 응답을 로컬에 저장해 네트워크 비용을 줄일 수 있습니다.// OkHttp 캐시 설정val cacheSize = 10L * 1024 * 1024 // 10MBval cache = Cache(context.cacheDir, cacheSize)val client = OkHttpClient.Buil..

개발일기 2025.09.05
반응형