본문 바로가기

전체 글

[Android] Mutex와 Coroutine으로 동시성 문제 해결하기 Kotlin으로 안드로이드 개발을 하며 네트워크 로직 및 비동기 처리에는 주로 Coroutine + suspend 함수를 사용해왔었는데요, 최근 동시성 이슈를 막기 위해 Coroutine + Mutex 조합을 사용하게 되었습니다. 네트워크 로직 처리를 위해 Coroutine만을 생각했었는데 Mutex와 함께 사용해야 하는 필요성을 느낀 과정과 이유를 작성해 보려 합니다. 🤔 Coroutine은 '비동기'를 해결하지만, '동시성'을 해결하지는 않는다"코루틴을 쓰고 있으니까 동시에 여러 요청 문제는 없지 않을까?" 저 역시 그랬듯, 많은 분들이 헷갈릴 수 있는 부분일 것이라고 생각이 드는데요Coroutine의 역할은 비동기 작업을 쉽게 도와주는 것이지 '이 함수는 동시에 한 번만 실행된다'는 것을 보장.. 더보기
[Android] Build Variant는 왜 필요할까: 안드로이드 빌드 관리하기 사이드 프로젝트를 진행할 땐 빌드를 debug와 release모드 두개면 충분했습니다.그런데 실무에서 프로젝트를 진행하다보니 debug, release 외에도 다양한 빌드 환경이 필요함을 느끼게 되었습니다. 매번 패키지명, 설정 등을 바꾸면서 빌드하기엔 시간도 오래 걸리고 너무 귀찮은 작업이니 이걸 빌드 관리로 손쉽게 하면 좋겠죠?먼저 가볍게 빌드 관리와 관련된 개념들을 정리해 보려고 합니다. 🛠️ Build Variants 안드로이드 스튜디오의 다양한 기능들 중 Build Variants 라는 것을 발견할 수가 있는데요,Android 프로젝트에서 여러 빌드 구성을 조합해 만들어지는 개념으로, 정확히는 안드로이드 Gradle이 만들어내는 실제 빌드 결과물의 단위 입니다. 보통 우리가 인식하는 deb.. 더보기
[Android] 결제에서 Consume은 왜 필요할까? 안드로이드에서 인앱 결제를 구현하다 보면 반드시 마주치는 개념이 있는데요, 바로 consume입니다.저는 처음 Conosume이라는 개념을 보았을 때 무엇을 소비한다는거지..? 하고 개념이 확 와닿지 않았는데요.결제 과정에 대한 전체 흐름을 살펴보니 그제서야 조금씩 consume에 대한 개념이 이해가 되기 시작했습니다.공식 문서에는 보통 이렇게 적혀 있습니다.“소모성 상품은 consume 해야 다시 구매할 수 있다.”https://developer.android.com/google/play/billing/integrate?utm_&hl=ko#consumable_products하지만 실제로 개발을 해보면 이런 의문이 듭니다.왜 굳이 consume이라는 단계를 따로 둘까?consume을 안 하면 정확히 뭐가.. 더보기
[Android] Kotlin 버전을 올렸는데 왜 Gson에서 이슈가 발생할까? 최근 Gson을 사용하다가 난독화와 관련된 이슈가 발생하였는데요,Kotlin 버전을 올렸더니 ` Missing field or token 'xxx'` 과 같은 에러가 발생하였습니다. 🤔 처음엔 단순히 "코틀린 버전 때문인가?" 싶었지만, 실제 원인은 코틀린 → Gradle Plugin → R8 → 난독화 → Gson으로 이어지는 복합적인 문제였습니다. 어떤 이유로 이렇게 연결이 되는 문제인지 하나씩 살펴보려 합니다. 👀 Kotlin 버전을 올렸더니 Gson이 깨진 이유?Kotlin 버전을 올렸더니 앱 실행 시점에서 Gson 파싱이 깨졌습니다. 예를 들어 아래와 같은 클래스가 있을 때, data class User( val userId: String, val userName: String.. 더보기
[Android] api와 implementation, 무엇이 다를까? 안드로이드 프로젝트를 진행하며 라이브러리를 추가할 때 implementation을 자연스럽게 많이 사용한 경험이 있으실 것 같은데요,그렇다면 api와 implementation의 차이점을 알고 사용하고 계신가요? 프로젝트를 진행하다보면 `build.gradle` 안에서 `api` 와 `implementation` 을 언제 써야 할지 헷갈릴 때가 있습니다.둘 다 의존성을 추가하는 키워드처럼 보이지만, “노출 범위”가 완전히 다르다는 것 알고 계셨나요!? 🤓 api와 implementation의 차이점먼저, api와 implementation에 대해 한 줄로 요약하자면 `implementation` 은 내부 전용, `api` 는 외부에도 공개되는 의존성입니다.보통 implementation은 아래와 같.. 더보기
[Android] Portrait? Landscape? screenOrientation 이해하기 안드로이드 사이드 프로젝트를 진행하며 반자동적으로 세로모드만 지원을 하며 screenOrientation을 주로 portrait만 사용을 했었는데요, 실무에서 프로젝트를 진행하다보니 가로/세로 모두를 지원해줘야 했습니다. 그러던 도중 엔진이 래핑한 안드로이드 Manifest 파일을 확인하다가 screenOrientation 값이 상수로 되어있는 것을 발견하게 되었습니다. 그래서 다시 안드로이드 스튜디오에서 screenOrientation 코드를 살펴보니 attrs_manifest.xml 파일 안에 상수와 함께 정의된 screenOrientation 값들을 찾을 수 있었습니다.그 과정에서 정의된 screenOrientation 값들이 보며 screenOrientation 설정 값이 이렇게 많았나!? 싶었고.. 더보기
[Android] 안드로이드 스튜디오에서 웹뷰 스크롤 늘려보기 프로젝트를 진행하며 안드로이드 스튜디오에서 웹뷰를 띄우는 작업을 진행하게 되었습니다. 웹뷰에서는 input 칸에 유저의 정보를 입력하는 단계가 진행되었는데요, 프로젝트의 특성 상 상단 바, 네비게이션 영역들을 (inset들) 없애자 웹뷰에서 스크롤이 되지 않는 문제가 발생하였습니다. 웹뷰에서 스크롤이 되지 않으니 유저의 정보를 입력할 때 키보드에 input 칸이 가려져 입력 내용이 보이지 않고 매우 불편한 UX가 되었습니다. 그래서 웹뷰에 강제로 스크롤을 되게 만들어야 했습니다. 그런데..! 단순히 웹뷰에 제가 스크롤 기능을 넣는다고 스크롤이 되는 것이 아니였습니다.그래서 문제점을 찾아 차차 스크롤의 원리부터 다시 이해해 보았습니다. 오늘 포스팅에서 이 과정을 차근 차근 설명해 보겠습니다. 🤔 원.. 더보기
[Android] Crashlytics 전에 StrictMode 최근 strict mode라는 것을 알게 되었는데요,안드로이드에서 제공하는 개발 단계에서 앱의 잘못된 동작 (특히 메인 스레드에서의 과도한 작업이나 자원 누수)을 탐지하고 경고해주는 디버깅 도구라고 합니다. 사실 저 역시 최근에 처음 알게 되었는데, 찾아보니 안드로이드 초창기에 (2010년~2011년쯤?) 많이 사용되던 디버깅 도구라고 하네요.요즘은 워낙 좋은 디버깅 도구가 많이 나와서 저 같은 주니어 개발자들은 접할 기회가 거의 없었던 것 같아요. 비교적 옛날(?) 디버깅 도구임에도 불구하고 StrictMode를 주제로 블로그 글을 쓰기로 한 이유는, 이 도구가 안드로이드 앱 성능 문제가 발생하는 원인과 이를 가장 기본적인 수준에서 탐지하는 방법을 이해하는 데 좋은 출발점이 될 수 있다고 생각했기 때문.. 더보기