Android
-
ScrollableState recompostion을 막는 derivedStateOf 완전 이해하기Android 2025. 11. 28. 16:52
Jetpack Compose 를 쓰다 보면 스크롤할 때 Recomposition 이 미친 듯이 발생하는 경우가 종종 있다.특히 ScrollState.value 를 직접 읽어 UI를 제어하는 경우, 스크롤 1px 움직이는 순간마다 전체 UI가 재구성될 수 있다.오늘은 이 문제를 해결하는 마법 같은 도구👉 derivedStateOf를 이해하고, 실제로 얼마나 Recomposition이 줄어드는지 카운팅 예제까지 보여주겠다.문제의 코드: "스크롤 1px마다 재구성됩니다"다음 코드는 스크롤 시 바닥에 Fade Shadow를 표시하는 예제다.if (scrollState.maxValue > 0 && scrollState.value 여기서 문제는…scrollState.value 가 스크롤할 때 매 픽셀마다 업데이트..
-
Room에서 CASCADE ON DELETE + REPLACE(=DELETE + INSERT) 의 충돌시 전략 정리Android 2025. 11. 28. 16:32
Room 데이터베이스를 사용하다 보면, 두 테이블을 Foreign Key 로 연결해 참조 무결성(referential integrity) 을 유지하고 싶고, 동시에 Row 업데이트 시 CASCADE 를 통해 데이터 일관성을 유지하고 싶은 상황이 자주 생긴다.하지만 실제로 구현해보면 다음과 같은 문제가 생긴다.문제: CASCADE ON DELETE + REPLACE(=DELETE + INSERT) 의 충돌Room에서 @Insert(onConflict = REPLACE) 는 내부적으로 "DELETE → INSERT" 로 동작한다.이 때문에:부모 테이블에서 REPLACE 로 데이터를 삽입내부적으로 기존 row DELETECASCADE DELETE 발동 → 자식 테이블 row 모두 삭제됨이후 INSERT 로 새..
-
모듈 간 테스트 코드 공유하기 (Android Test Fixtures)Android 2025. 10. 26. 20:51
OKR (Objective & Key Results)Objective:Android Gradle의 testFixtures 기능을 이해하고,모듈 간 테스트 유틸과 더블(mock) 코드를 재사용할 수 있도록 한다.Key Results:testFixtures.enable = true의 역할을 명확히 설명할 수 있다.src/testFixtures 디렉토리를 구성해 공용 테스트 코드를 작성할 수 있다.다른 모듈에서 testFixtures를 불러오는 방법을 직접 적용할 수 있다.Test Fixtures란?테스트를 작성하다 보면 여러 테스트에서 공통으로 사용하는 코드가 생긴다.예를 들어 다음과 같은 코드들이다.테스트용 유틸리티 클래스더미 데이터 생성기Mock 객체공용 테스트 헬퍼이런 코드를 src/test/java에..
-
Android에서 Glide를 더이상 사용할 수 없는 이유Android 2025. 10. 21. 23:00
Kotlin 2.2.20 Exposed Visibility Warning 정리🧩 경고의 의미Kotlin 2.2.20부터 다음과 같은 새로운 컴파일러 경고가 추가됨:“A more visible declaration references a less visible declaration in its signature.”즉,더 넓은 가시성의 선언(public/internal 등)이 자신의 시그니처에 더 좁은 가시성(private/internal/package-private 등)을 사용하면 경고 발생.이 경고는 Kotlin 2.4부터는 에러로 승격될 예정임.📘 예시로 이해하기internal class Apublic fun foo(): A = A()// ❌ public 함수가 internal 타입을 반환 → 경고..
-
Android에서 Gson을 더 이상 사용하면 안 되는 이유와 Kotlinx.serialization 마이그레이션 가이드Android 2025. 10. 21. 22:55
📌 1. Gson을 Android에서 더 이상 권장하지 않는 이유Gson은 이제 Android 프로젝트에서 공식적으로 비권장(deprecated) 되는 방향입니다.이유는 단순한 JSON 변환 문제를 넘어, 성능·안정성·유지보수성 문제 때문입니다.https://github.com/google/gson/pull/2856🔍 주요 이유 요약항목설명1. 리플렉션 기반 구조Gson은 런타임에 리플렉션(reflection)으로 필드 접근 및 변환을 수행합니다. 👉 R8/ProGuard 난독화 시 필드명이 바뀌면 JSON 매핑이 깨질 위험이 있습니다.2. Kotlin 언어 지원 한계Kotlin의 data class, default parameter, nullable, sealed class 같은 기능을 제대로 지..
-
LiveData와 Flow: Android UI 데이터 관찰의 두 가지 접근 방식 비교Android 2024. 11. 26. 11:06
// LiveDataisViewVisible.asLiveData().observe(viewLifecycleOwner) { isVisible -> // ...}// FlowisViewVisible.collect { isVisible -> // ...}두 코드 스니펫은 `isViewVisible`이라는 상태를 관찰하여 UI를 업데이트하는 방식에서 차이가 있습니다. 이 두 가지 접근 방식의 주요 차이점은 다음과 같습니다.`asLiveData().observe()` 사용:LiveData: Android의 생명주기 인식 데이터 홀더 클래스로, 주로 UI 컴포넌트와 데이터의 동기화를 위해 사용됩니다.생명주기 인식: `observe(viewLifecycleOwner)`를 사용하면 관찰자가 `viewLifecycleO..
-
OpenGL Basics on AndroidAndroid 2024. 5. 3. 22:58
목표OpenGL 기본개념 알기Android에서 OpenGL로 삼각형 그리기OpenGL ES란?OpenGL ES는 3차원 컴퓨터 그래픽스 API인 OpenGL(Open Graphic Library)의 임베디드 시스템을 위한 버전이다. ES가 Embaedded System을 의미한다.OpenGL은 다양한 API를 제공하며 해당 API들을 통해 점, 선, 삼각형, 사각형, 빛 등을 화면에 그릴 수 있다. 즉, OpenGL은 화면에 뭔가 그릴 수 있도록 도와주는 API들로 이루어진 라이브러리다.비슷한 API로 Windows에는 DirectX가 있다. 차이점은 OpenGL은 크로스 플랫폼을 지원한다.Vertex3차원 그래픽의 가장 원자적인 요소정점의 정보를 가지고 있는 data structurePosition을 ..
-
Dependency Injection과 Hilt 맛보기Android 2024. 5. 3. 20:38
Dependency의존성 : A가 B를 의존한다. = A가 B를 참조한다.의존대상 B가 변하면, 그것이 A에 영향을 미친다.B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미친다.Car는 Engine이 없으면 동작하지 않는다.Engine은 Car의 의존성Car가 Engine에 의존한다. = Car가 Engine을 참조한다.// Without DIclass Car { private val engine: Engine = Engine() ... ...}Car class는 engine instance 생성과 어떻게 구성하는지까지 책임을 지고 있다.SRP(단일 책임 원칙) 위반하나의 Class에 하기에는 책임이 많다.Car와 Engine은 타이트한 의존성을 갖는다.Engine에 대..