CMP 의존성 선언 방식 — libs.versions.toml vs compose accessor

요약
Compose Multiplatform(CMP) 프로젝트에서 libs.compose.material3로 의존성을 선언했더니 IDE에서 import androidx.compose.material3.Card를 인식하지 못했다. 빌드는 성공하는데 IDE만 빨간 줄 — 원인과 해결을 정리한다.

TL;DR

1
2
3
4
5
6
7
8
9
문제:  직접 지정한 버전(1.11.0-alpha02)이
CMP 플러그인 버전(1.10.0)과 불일치
→ iOS용 artifact가 해당 버전에 존재하지 않음
→ commonMain 의존성 해석 실패
→ IDE에서 모든 Compose import 인식 불가

해결: compose.material3 accessor 사용
→ 플러그인이 자기 버전에 맞는 타겟별 좌표를 자동 매핑
→ 모든 타겟에서 해석 성공
자세히 보기

[Android] BottomNavigationView의 탭을 눌러도 선택되지 않는 문제

문제

개인 프로젝트로 개발 중인 앱에서 별다른 버그가 없는가 밥을 먹으며 이리저리 클릭하던 중 특정 상황에 하단 탭의 선택 효과가 동작하지 않는 문제를 발견하여 이를 해결하면서 공부한 내용을 정리했습니다. 문제의 화면과 프로젝트의 내비게이션 그래프의 구성은 아래와 같습니다.

자세히 보기

[Kotlin] 코루틴의 취소와 예외 처리 파고들기

코루틴을 막 학습한 사람에게 코루틴은 매우 간단하고 자바스크립트의 async, await와 비슷하게 보이기도 해서 비동기 프로그래밍을 위한 아주 쉽고 훌륭한 도구로 보일 수 있습니다. 실제로 쉽고 훌륭한 도구이긴 하지만요.

하지만 코루틴을 더 깊게 살펴보면 실제로 걸리기 쉬운 함정들이 많이 존재합니다. 예외 처리나 취소를 try-catch 블록을 통해 간단히 할 수 있으리라 생각하지만 실제로는 복잡한 매커니즘으로 동작하고 있기에 많은 것들이 잘못될 수도 있습니다.

자세히 보기

Android Navigation에서 chrome의 의미

요약

chorme은 사용자에게 화면의 콘텐츠(해당 콘텐츠의 일부가 아님)에 대한 정보 또는 작업 명령을 제공하는 시각적 디자인 요소입니다. 이 디자인 요소는 운영체제, 웹사이트, 애플리케이션과 같은 기본 시스템에서 제공되며 사용자 데이터를 둘러싸고 있습니다.

자세히 보기

제어의 역전(Inversion of Control, IoC) 파헤치기

Inversion of Control(IoC), _제어의 역전_이라고도 번역되는 이 개념은 Dependency Injection(DI)에 대한 개념을 찾아보면 반드시 등장하는 개념입니다. 처음 접했을 땐 여러 블로그의 설명을 읽어도 확실하게 이해가 되지 않아서 사전적인 정의와 예시 코드 정도만 정리하고 넘어갔었는데 안드로이드의 DI 라이브러리인 Hilt에 대해 복습을 하던 중 IoC를 간단명료하게 설명해주는 유튜브 영상을 발견하여 스스로 IoC에 대해 다시 한 번 정리하고자 글을 작성합니다.

자세히 보기

[Android] Context의 정의와 종류, 예시

안드로이드 개발에서 ContextContext.getString(…)을 통해 _strings.xml_의 문자열 리소스를 가져올 때나 View와 관련된 작업을 별도의 클래스나 함수로 분리하기 위해 파라미터로 Context를 넘기는 등 애플리케이션 내에서 매우 광범위하게 사용된다.

광범위하게 사용된다는 말은 라이프 사이클을 고려해야 된다는 것과 이어질 수 있는데, Context는 잘못 사용하면 애플리케이션의 메모리 누수를 발생시킬 수 있으므로 매우 주의해야 한다! Context가 필요한데 이것을 어디에서 땡겨와야할지 고민하다가 잘못된 Context를 참조하는 경우가 발생할 수 있는데, 이 글을 통해 Context의 개념에 대해 정의하고 내가 개발하면서 어떤 Context를 참조해야할지 고민되었던 코드를 예시로 정리하고자 한다.

자세히 보기