OkHttp Authenticator에서 runBlocking 제거하기
·
Android
안드로이드 개발에서 멀티플랫폼을 사용하지 않는 이상 대부분의 네트워크 통신은 Retrofit을 기반으로 합니다. Retrofit은 내부적으로 OkHttp 위에서 동작하고 토큰 기반 인증 로직을 구현하려면 결국 OkHttp의 특성을 직접 다루게 됩니다.특히 리프레시 토큰을 이용한 토큰 재발급 과정은 단순히 새 토큰을 받아오는 것이 아니라 여러 요청이 동시에 들어오는 상황에서의 동시성 문제까지 함께 고민해야 해서 생각보다 까다롭습니다.이 글은 OkHttp + Retrofit + Coroutines 조합을 사용하면서 Authenticator 안에 runBlocking을 섞어 쓰던 구조를 어떻게 리팩토링했는지를 정리한 기록입니다. 최근 코루틴을 공부하다가 문득 동기와 비동기의 경계를 runBlocking으로 이..
Compose에서 안전하게 Side Effect 처리하기 (flowWithLifecycle)
·
Android/Compose
Compose에서 개발을 하다보면 ViewModel에서 발생한 이벤트를 LaunchedEffect로 수집하여 스낵바를 표시하거나 화면을 전환하는 패턴을 자주 사용합니다. 하지만 LaunchedEffect는 안드로이드 생명주기를 인식하지 못해 백그라운드 상태에서도 계속 동작하는 경우가 있어요.이번 글에서는 flowWithLifecycle API를 활용하여 생명주기에 맞는 이벤트 처리 방법과 이를 재사용 가능한 확장 함수로 구현한 경험을 정리했습니다. [REF/#180] Use collectSideEffect extension for side effect handling by angryPodo · Pull Request #181 · Hi-lingual/Hilingual-AnRelated issue 🛠 ..
[Kotline Coroutine] OnFailure에 로그적기 귀찮아
·
Kotlin
안녕하세요! 오늘은 Result를 사용할 때 실패 시마다 반복해서 적던 로그 코드를 줄이기 위해 만든 확장 함수를 소개하려고 합니다. 사실 정말 간단해요ㅎㅎ1. 왜 만들었어요?제가 참여중인 Spoony에서는 런캐칭으로 감싸 뷰모델에서 onSuccess와 onFailure로 결과값을 처리하고 있었어요. 그러나 작업자마다 로그를 찍는 게 일관적이지 않았고 매번 실패 시에 Timber.e(e)를 적는 게 귀찮게 다가왔어요. 사용되는 부분이 많다 보니 매번 팀버 코드를 작성해야 했고 확장함수로 만드면 어떻냐는 팀원의 아이디어가 나왔어요.그래서 바로 작업에 들어갔습니다.2. Result 실패 처리 반복현재 ViewModel에서 다음과 같이 runCatching과 Result를 조합해 API 호출의 성공/실패를..