모든 로그를 JSON으로 파싱하면 안 될까???
·
Android
안드로이드 개발을 하면서 로그캣을 통해 네트워크 로깅은 필수 입니다. 하지만 있는 그대로 JSON을 출력해보면 가독성이 매우 좋지 않죠..때문에 네트워크 통신 로그를 가독성 좋게 파악하고 싶어서 HttpLoggingInterceptor에 JSON Pretty Print 기능을 추가했었습니다. 개발 생산성은 확실히 좋아졌지만 문득 "이거 성능상 문제 없을까?"라는 의문이 들었습니다.이번 글에서는 작은 의문에서 시작해 성능을 95% 개선하기까지의 과정을 공유합니다.뭔가..뭔가 불편함…처음 작성한 로깅 코드는 이렇습니다.// NetworkModule.ktHttpLoggingInterceptor { message -> val log = runCatching { val jsonElement = ..
LifecycleEventEffect: DisposableEffect가 쓰기 좀 그렇다면..?
·
Android/Compose
프로젝트를 진행하면서 Compose의 생명주기를 다루는 방식에 대해 고민하게 되는건 당연한 것 같아요.특히 안드로이드의 생명주기와 컴포저블의 생명주기가 만나는 지점에서 어떤 선택을 해야 하는지는 항상 고민이 됩니다..최근 presentation:home 모듈을 리팩터링하면서 이 문제를 깊이 있게 들여다볼 기회가 있었는데요. 그 과정에서 배운 것들을 공유하고자 합니다😊문제를 보자면앱이 백그라운드에서 다시 활성화될 때마다 알림 권한 상태를 확인해야 하는 요구사항이 있었어요. 자연스럽게 DisposableEffect를 사용했습니다.@Composablefun HomeRoute(viewModel: HomeViewModel) { val lifecycleOwner = LocalLifecycleOwner.cur..
Android CI 빌드 속도 1분대로 줄여보기
·
Android
하이링구얼 프로젝트는 규모가 커짐에 따라 오타 수정 같은 경미한 변경에도 빌드 시간이 평균 10분~14분 소요되어 개발 효율이 저하되는 문제가 발생했어요.이를 해결하기 위해 Gradle 설정과 GitHub Actions 워크플로우를 최적화하여 빌드 시간을 1분대로 단축한 과정을 공유해요.1. 병목 원인 분석빌드 로그를 분석한 결과, 성능 저하의 주원인은 두 가지였어요.Gradle 설정 미흡: 병렬 빌드나 캐싱 같은 핵심 성능 옵션이 꺼져 있어 시스템 자원을 효율적으로 쓰지 못하고 있었어요.CI 캐싱 전략 부재: 기존 actions/cache는 Gradle의 복잡한 의존성 구조를 섬세하게 다루지 못해, 라이브러리 하나만 바뀌어도 캐시가 깨져(Miss) 매번 새로 다운로드해야 했어요.2. 해결 방법2.1. ..
OkHttp Authenticator에서 runBlocking 없이 토큰 갱신하기
·
Android
안드로이드 개발에서 멀티플랫폼을 사용하지 않는 이상, 대부분의 네트워크 통신은 Retrofit을 기반으로 합니다. 저도 예외는 아닌데요ㅎㅎ 잘 아시다시피 Retrofit은 내부적으로 OkHttp 위에서 동작하고, 토큰 기반 인증 로직을 구현하려면 결국 OkHttp의 특성을 직접 다루게 됩니다.특히 리프레시 토큰을 이용한 토큰 재발급 과정은 단순히 “새 토큰 받아오기”가 아니라 여러 요청이 동시에 들어오는 상황에서의 동시성 문제까지 함께 고민해야 해서 생각보다 까다로운데요... 동시성은 어느 언어든 개발자를 괴롭히네요... 😅이 글은 제가 OkHttp + Retrofit + Coroutines 조합을 사용하면서, Authenticator 안에 runBlocking을 섞어 쓰던 구조를 어떻게 리팩토링했는지..
Credential Manager로 로그인이 안돼요. 이유는 몰라요
·
Android
안녕하세요👋🏻 오랜만에 트러블 슈팅을 가져왔어요ㅎㅎ프로덕션 환경에서 Google 로그인을 사용하던 중 특정 사용자 기기에서 로그인 버튼을 눌러도 아무 UI가 보이지 않는 문제가 제보됐어요. 앱은 멈추지 않았고 크래시도 발생하지 않았으며 에러 로그도 남지 않았어요. 사용자 입장에서는 “아무 반응 없음”으로 보이는 상황이었어요.이 문제는 QA 환경에서는 재현되지 않았고 개발자 기기에서도 동일한 문제가 나타나지 않았어요. 소수의 기기에서만 발생했고 100여명의 안드로이드 유저중에 제보를 받은건 단 2건이었어요🥲원인을 찾기 위해 Credential Manager의 내부 동작 방식을 여러모로 뜯어봤는데요!이 글은 그 과정을 정리한 기록이에요. 저와 같은 현상을 겪으셨다면 스트레스 받지 마시고 해결하시길..1..
Kotlin 클래스 12개, 언제 뭘 써야 할까?
·
외부 활동/우아한테크코스 8기
Kotlin은 다양한 프로그래밍 시나리오에 맞춰 세분화된 클래스 유형을 제공해요. 우테코 프리코스를 진행한지 이제 4주차에 접어 들었는데, value class에 대한 인사이트를 얻어서 여태까지 안드로이드 개발을 하면서 잘 사용하지 않았던 클래스에도 관심을 가지고자 각 클래스가 어떤 목적으로 설계됐는지, 언제 사용해야 하는지 코드와 함께 정리했어요 👍🏻1. 일반 클래스 (Class)객체의 상태(State)와 기능(Function)을 정의하는 가장 표준적인 설계도예요.생성자를 통해 의존성을 주입받거나, 변경 가능한 내부 상태를 가져야 할 때, 또는 데이터 처리 로직을 포함해야 할 때 사용해요.class SessionStorage(private val filePath: String) { privat..