본문 바로가기

전체 글

[Android] Android 앱 아이콘을 클릭하는 순간부터 화면에 그려지기까지 안드로이드와 관련된 공부를 하다보면 뷰는 어떻게 그려지는지, API를 호출할 땐 어떻게 비동기를 활용하는지 등등 다양한 기술을 고민하게 되는데요, 앱을 클릭하는 시점부터 앱이 화면에 그려지는 과정까지 자세하게 살펴본 적이 있나요? 생각해보니 과연 이 과정을 자세하게 설명할 수 있을까 하는 생각이 들어,, 🤔Android 앱 아이콘을 누를 때부터 화면에 그려지는 시점까지 내부에서 일어나는 일을 정리해보려고 합니다. 우리는 보통 `MainActivity`가 실행된다고 생각하지만, 실제로는 (어떻게 보면 당연한..?) 그 전에 여러 시스템 컴포넌트가 협력하여 앱 프로세스를 생성하고 Activity를 시작하는 과정이 존재합니다. 1️⃣ 사용자가 앱 아이콘을 클릭한다사용자가 홈 화면에서 앱 아이콘을 클릭하면 .. 더보기
[Android] Compose가 UI를 그리기까지의 과정 지난번엔 XML에서 View를 그리는 과정에 대해 글을 작성했었는데요, 이번엔 Compose에서 View를 그리는 과정에 대해 작성해보려고 합니다. XML에서는 `setContentView()` 한 줄로 화면이 뜨지만, 그 뒤에서는 XML 파싱 -> View 트리 생성 -> Measure .. 등과 같은 파이프 라인이 돌아갑니다. 이번 글은 같은 질문을 Jetpack Compose 버전으로 작성하는 글입니다. Compose는 "View를 생성해서" 그리는 게 아니라, "UI를 설명하는 트리"를 만들고, 그 결과를 "Canvas에 그려서" 보여줍니다.그리고 또 다른 포인트 하나!Composable은 View가 아닙니다. 하지만 Compose UI는 결국 하나의 Android View(ComposeView).. 더보기
[Android] XML이 View를 그리기까지의 과정 안드로이드 개발을 하다 보면 XML에 View를 선언하고 setContentView() 한 줄만 호출해도 화면이 그려집니다.(물론 요즘은 XML 보단 Compose를 많이 사용하는 추세이지만, XML을 알고 Compose를 알면 더 좋을 것 같아서 XML의 과정을 먼저 정리해보려 합니다.) 하지만 막상 XML이 실제 View 객체가 되고, 화면에 그려지기까지의 흐름을 정확히 설명하려고 하면 애매해지는 경우가 많습니다.이번 글에서는 XML → View 객체 → Measure → Layout → Draw 이 전체 과정을 흐름 위주로 정리해보겠습니다. 1️⃣ setContentView()가 호출되면 무슨 일이 벌어질까?Activity에서 가장 흔히 보는 코드부터 시작합니다.setContentView(R.l.. 더보기
[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은 아래와 같.. 더보기