Kongjak's IT Factory
WRITING / 5 POSTS

개발

개발/안드로이드

Offline-first: 네트워크 없이도 작동하는 앱 만들기

배경필자가 활동하고 있는 교내 동아리 BCSD에서는 코인이라는 교내 커뮤니티 서비스를 개발하고 있다. 최근 재학생들을 대상으로 만족도 및 의견에 대한 설문을 진행했고, 저번주 쯤 결과를 받아보게 되었다.PM을 통해 5개 정도의 핵심 인사이트를 도출했는데, 그 중 우리가 해결해야 할 문제가 있었다.앱 성능·접속 문제발생 빈도는 낮지만, 겪는 순간 다른 개선이 무의미해지는 유형의 문제기획 / 디자인 등 다른 직군에 관련 없이, 전적으로 우리 안드로이드 개발자들의 책임이었다.무엇이 문제인가실제로 어떤 문제가 발생하는지, 어떤 상황에서 발생하는지를 먼저 파악해야 했다.다행이도, 우리 팀에서는 Firebase Crashlytics로 크래시 로그를 수집하고 있었다.최근 1주일 사이의 크래시 로그를 보면, 200건이..

Read article ↗
개발/안드로이드

난독화와 R8 Full mode 적용하기

AGP 8.0부터는 R8의 Full mode가 기본적으로 활성화되었습니다.코인 프로젝트는 이미 AGP 8.0 이상을 사용하고 있었지만, R8 Full mode를 적용하지는 않고 있었습니다.본 글에서는 난독화 및 R8 Full mode를 적용하기 위한 선행 작업과, 적용 전후를 비교합니다.R8 Full modeR8은 크게 Compatibility mode와 Full mode로 나뉩니다.Full mode는 Compatibility mode보다 더 공격적으로 최적화를 수행하며, 추가적인 Proguard rules가 필요할 수 있습니다.Full mode의 자세한 차이점이 궁금하다면?R8 공식 문서에서 자세한 차이점을 확인할 수 있습니다.R8 Full mode, 왜 써요?공식 문서에서는 다음과 같은 언급이 있습니..

Read article ↗
개발/안드로이드

Kotlin DSL을 활용한 에러 핸들링 설계

과거 코인에서는 ErrorHandler를 이용해 에러를 처리하였다.다만 현재 팀원 중에는 그 구조를 직접 사용해 본 사람이 없고, 따라 Result 기반으로 에러를 명시적으로 다루는 방향으로 정리되었다.Result.failure 분기처리처음에는 아래와 같이 코드를 작성하였다.return runCatching { remoteCall()}.onFailure { exception -> return Result.failure( when (exception) { is HttpException -> { when (exception.code()) { 401 -> UnauthorizedException() ..

Read article ↗
개발/안드로이드

Compose contentDescription null과 ""의 차이

Compose에서 Image나 Icon과 같이, 이미지를 보여주는 컴포넌트를 사용할 때는 contentDescription을 사용해야 한다.이 contentDescription이 무엇인지 정확하게 알아보기 위해, Image Composable의 주석을 읽어보았다.@param contentDescription text used by accessibility services to describe what this image represents. This should always be provided unless this image is used for decorative purposes, and does not represent a meaningful action that a user can take. Th..

Read article ↗
개발/안드로이드

Retrofit2 난독화 했을 때 NullPointException 해결

Retrofit2를 사용하는 프로젝트를 개발하던 중, Proguard를 적용하여 난독화를 진행하면 NPE가 발생하는 문제를 직면했다.난독화가 적용되지 않은 빌드에서는 발생하지 않던 문제였기에, 난독화 과정에서 발생한 문제임을 유추할 수 있었다. Retrofit에서는 JSON의 키 값을 Java의 POJO에 맞게 매핑하기 위해 @SerializedName 어노테이션을 추가한다. 나 같은 경우 JSON의 키 값과 Kotlin의 data class의 변수 이름이 다른 경우가 있어, 통일성을 위해 모든 값에 @SerializedName을 붙여둔 부분이 문제가 되었다. 난독화 과정에서 @SerializedName 또한 난독화가 진행되었고, 데이터를 정상적으로 받아오지 못하게 되면서 NPE가 발생한 것이다. 이를..

Read article ↗