안드로이드에서 네트워크 상태에 따라 API를 재호출해보자
·
Android
모바일 환경에서는 네트워크 연결이 끊기는 상황이 매우 빈번하게 발생합니다. 만약 이에 대한 적절한 대응이 없다면, 사용자는 네트워크를 연결한 뒤 화면을 다시 열거나 앱을 재시작하는 것 외에는 앱을 계속 사용할 수 없습니다. 이러한 경험은 UX 측면에서 매우 불친절하며, 장기적으로 사용자 이탈로 이어질 수 있습니다.목표API 호출 시 네트워크가 연결되어 있지 않으면 ConnectException이 발생합니다. 이를 방지하기 위해 API 호출 전 네트워크 연결 상태를 확인하여 네트워크가 연결이 되어 있을 때만 API를 호출하며, 실패한 API 요청을 적절히 재시도하는 방법을 소개합니다.ConnectivityConnectivity는 기기의 네트워크의 다양한 연결 상태를 추적할 수 있는 API로, 단순한 네트워..
Retrofit Internals - Retrofit In Coroutine
·
Android
이전 글에서는 Retrofit이 동적 프록시와 리플렉션을 활용해 서비스 인터페이스의 구현체를 생성하는 과정을 살펴보았습니다. 이를 통해 Retrofit이 어떻게 인터페이스 메서드 호출을 가로채고, 내부에서 HTTP 요청 처리를 위한 준비를 하는지 이해할 수 있었습니다. 이번 글에서는 코루틴을 지원하는 Retrofit의 동작 방식을 자세히 들여다보며, HttpServiceMethod가 어떻게 다양한 호출 방식(suspend 함수, 일반 함수, Response, Call)을 처리하는지, 그리고 네트워크 요청을 어떻게 수행하는지 알아보겠습니다.# ContinuationRetrofit이 코루틴을 다루는 방법을 이해하기 위해선 먼저 suspend 함수에 대한 지식이 필요합니다. 이를 위해 간단한 예시 코드를 한..
Retrofit Internals - Retrofit은 어떻게 인터페이스의 구현체를 만들까 ?
·
Android
서론Retrofit을 사용해 네트워크 요청을 만들 때 서비스 인터페이스를 구현하는 것 만드로 API 요청을 구현할 수 있습니다. 어떻게 구현체가 없는 인터페이스를 실행 가능한 형태로 만드는 걸까요? 이 글에서는 Retrofit이 내부적으로 서비스 인터페이스의 구현체를 생성하는 과정과 이를 통해 API 요청을 수행하는지를 단계별로 살펴보겠습니다.create( ) 메서드는 두 단계를 걸쳐 서비스 인터페이스의 구현체를 생성합니다. 이를 단계별로 분석해 보겠습니다.Step1. 서비스 인터페이스 검증 (validServiceInterface())Retrofit은. create()를 통해 전달된 클래스가 정상적인 인터페이스인지 먼저 확인하고 아닐 시 예외를 던집니다.private void validateServi..
ViewModel의 One Time Event를 다루는 다양한 솔루션
·
Android
서론ViewModel에서 발생하는 이벤트를 소비하는 방법엔 Channel, SharedFlow, State 등 다양한 방법이 있습니다. 프로젝트를 Compose로 Migration 하는 과정에서 이에 대한 솔루션이 필요해 여러 자료를 통해 프로젝트에 채택한 방법을 소개하겠습니다. 해당 글은 Youtuber Phillipp Lackner님의 영상을 번역한 자료로 필자는 영어를 잘 못하기 때문에... 유튜브 영상의 스크립트를 해석한 내용으로 잘못된 내용이 있을 수 있습니다.0. 필요 조건One Time Event를 위한 API는 다음 조건이 필요합니다.Event 발생 후 앱이 백그라운드로 내려갈 시 UI에선 구독을 중지해야 한다.동일한 Event를 중복해서 발생시키지 않아야 한다.(Ex. 같은 화면을 두 ..
안드로이드 클린아키텍처 에러 핸들링 (부제: 상속을 지양하자)
·
Android
서론다온길 프로젝트를 진행하며 네트워크 에러처리에 대한 부분을 구현하며 상속에 대한 문제점을 알게 되었습니다. 그 과정을 기록하며 상속의 문제점과 상속을 회피할 수 있는 몇 가지 대안을 알아보겠습니다. 이번 글은 이펙티브 코틀린 36장 "상속보다 컴포지션을 사용하라"를 기반하여 작성됩니다.1. 기존 코드를 살펴보자📌 Domain Layersealed class NetworkError : Throwable(){ abstract override val message: String}data object ConnectError : NetworkError() { override val message: String get() = "서버에 연결할 수 없습니다. \n인터넷 연결을 확인한 후 다시 시..
[Android]프로젝트를 클린 아키텍처로 마이그레이션해보자
·
Android
🧑🏻‍💻오늘의 할 일 오늘은 프로젝트를 하면서 설계한 아키텍처와 의존성 주입에 대해 기록해 보겠습니다. 세상엔 저보다 너무나도 정리를 잘 한 글들이 많기 때문에 이 글에선 클린 아키텍처와 힐트에 관한 기본적인 내용은 아마 다루지 않을 것 같습니다. 대신 Hilt를 사용하면서 알게 된 성능 팁에 관한 내용을 다루겠습니다. 아키텍처를 구성하는 각 구성 요소와 비즈니스 로직을 구현하면서 마주했던 많은 고민들을 기록하면서 좀 더 좋은 아키텍처를 설계하기 위한 발판을 만들어 보겠습니다. 1. 모듈을 나누자 프로젝트를 만들고 가장 먼저 할 일은 클린 아키텍처에 기반하여 모듈을 나누는 일입니다. Presentation과 Data, App은 플랫폼의 의존성을 가져야 하기 때문에 Android Library로, D..
ViewLifeCycleOwner 제대로 알고 사용해보자
·
Android
👩‍💻 오늘의 할 일그동안 단순히 액티비티와 프래그먼트에서는 생명주기를 가지는 컴포넌트에서는 해당 컴포넌트의 생명주기에 종속되는 코루틴을 사용해야 한다고 알고 있었습니다. Activity에서는 lifeCycleScope, Fragment에서는 ViewLifeCycleOwner를 사용하는게 바로 이 이유죠.  그렇다면 왜 두 컴포넌트는 각각 다른 코루틴을 사용하는 걸까요? 이는 Fragment의 두 가지 생명주기와 깊은 연관이 있습니다. 저도 안드로이드 개발을 시작한지 약 반년이 다되어 가도록 이 프래그먼트의 두 가지 생명주기에 대해 놓치고 있던 내용이라 한 번 정리하겠습니다.  📖 Fragment의 두 가지 생명주기처음 Fragment LifeCycle에 대해 공부할 때도 봤던 그림인데 제가 간과한..
Room Like + StateFlow debouce와 Throttle
·
Android
👩‍💻 오늘의 할 일 오늘은 Room의 검색 기능에서 사용되는 Like, StateFlow에서의 Debounce와 Throttle를 실제 프로젝트에 적용하기 위해 사전 공부를 해보겠습니다. Room과 StateFlow의 새로운 기술이라니 벌써부터 두근두근 잼있을거 같네요! 📖 SQL LIKE SQL Query에서의 Like는 특정 문자가 포함되어 있는지 검색할 때 사용됩니다. Like는 ' % ' 로 표현되는데, 그 위치에 따라 다르게 동작하게 됩니다. 1. 특정 문자로 시작하는 데이터 검색 SELECT * FROM STORE_INFO WHERE STORE_NAME LIKE '%짱구'; 2. 특정 문자로 끝나는 데이터 검색 SELECT * FROM STORE_INFO WHERE STORE_NAME LIK..