Android67 Android Compose에서 시스템 바와 화면 크기 측정 추가 + 아래꺼는 기본적으로 paddingValues에 TopAppBar , Status bar, Navigation bar 가 자동적으로 잡힌다 이 내용을 추가해야한다.Scaffold안드로이드 앱을 개발하다 보면 상태 바(Status Bar), 네비게이션 바(Navigation Bar), 그리고 키보드(IME) 같은 시스템 UI와의 공존이 꽤 까다롭다. XML에서는 잘 정리되었는데 이번 Compose 개발 중 또 까다롭다 느껴 Compose 관점에서 정리해보겠다. 이 글에서는 WindowCompat.setDecorFitsSystemWindows()와 Compose의 시스템 바/키보드 패딩 처리를 한 번에 정리해본다.1. 시스템 바란?안드로이드의 시스템 바(System Bars)는 운영체제가 직접 관리.. 2026. 1. 9. [Android 16 타겟팅] 화면 회전 제한 해결하기 동작 변경사항: Android 16 이상을 타겟팅하는 앱 | Android DevelopersAndroid 16 이상을 타겟팅하는 앱에 영향을 미치는 Android 16의 변경사항을 알아봅니다.developer.android.com이번 Android 16에서 최소 너비가 600dp 이상인 디스플레이에서 앱의 orientation, resizability, aspect ratio 제한이 자동으로 무시된다.너무 폭력적인 정책이다;;; Android 15 이하(Before)위 설정은 모든 기기에서 세로 모드만 강제했다.Android 16 이상 (After) 태블릿이나 폴더블의 큰 화면에서는 이 설정이 자동으로 무시 된다.이번 변경사항 Google의 철학은 "큰 화면에서는 가로 모드도 지원해야 한다" 는 .. 2026. 1. 3. Compose에서 margin이 사라진 이유 123123 2026. 1. 2. Compose에서 ConstraintLayout이 사라진 이유 안드로이드 개발자라면 누구나 ConstraintLayout을 사용해봤을 거다. 그런데 Compose에서는 ConstraintLayout 을 지양한다.(사용은 가능함) 위의 사진은 Google이 ConstraintLayout을 공식적으로 지원하지 않거나, 새로운 안정화 계획이 없으면 라이브러리 자체를 deprecated 처리하겠다고 한다. 이렇게 ConstraintLayout이 사라지는 이유는 무엇일까? 또 그럼에도 ConstraintLayout 을 사용하고 싶은 순간이 있었을때 어떻게 변경했는가를 작성해보겠다.패러다임의 차이?내가 생각하는 근본적인 이유는 패러다임이라고 생각한다. ConstraintLayout은 XML 기반의 명령형(Imperative) 접근방식에서 탄생했다. "A 위젯이 B 위젯의 오른.. 2026. 1. 2. MVI는 왜 Compose 환경에서 피해야 할까? 최근 안드로이드 개발에서는 Jetpack Compose를 기반으로 한 선언형 UI가 급속히 보급되고 있고, 동시에 MVI(Model-View-Intent) 아키텍처도 많이 회자되고 있습니다. 하지만 MVI는 Compose 환경에서는 오히려 안티패턴에 가까울 수 있다는 점에서 제가 이해 한 것으로 작성하게 되었습니다.MVI라는 이름 자체의 어색함MVI는 원래 Elm이라는 함수형 언어의 아키텍처에서 유래했습니다. 이를 React 진영에서 Redux라는 상태 관리 라이브러리를 통해 가져왔고, 여기서 increment/decrement 예시가 유명해졌습니다.이 패턴이 이후 Jetpack Compose의 예시 코드에도 그대로 전파되면서, 많은 사람들이 이를 "정석"처럼 받아들이게 되었죠. 하지만 실제로는 "MV*.. 2025. 3. 25. Compose UI 컴포넌트 설계 Compose UI 컴포넌트 설계의 중요성안드로이드 Compose UI 설계는 단순히 화면을 구성하는 것을 넘어 재사용성과 테스트 용이성을 높이고, 잦은 변경 사항에도 유연하게 대처할 수 있는 구조를 만드는 것이 핵심입니다. 컴포넌트를 화면 단위로 설계하는 것과 의미 있는 단위로 분리하는 것 사이에는 큰 차이가 있습니다. 후자의 방식은 유지보수성과 코드의 가독성을 크게 향상시킵니다.Google의 Compose API 가이드라인에 따르면, 하나의 컴포넌트는 단일 문제를 해결하는 데 초점을 맞춰야 하며, 이를 통해 간결하고 사용하기 쉬운 API 설계를 지원할 수 있습니다. 또한, 선언형 UI의 대표 주자인 React의 설계 원칙과 선언적 컴포넌트 구조에서 배울 점이 많습니다. Compose는 React에 비.. 2024. 12. 13. XML 에서 Copose로 전환하면 좋은 이유 1. UI와 로직의 통합기존의 XML 방식은 UI와 로직을 분리되었을때의 문제점은 다음과 같습니다.1-1. 데이터 바인딩의 실행 순서 문제XML에서 DataBinding을 활용하여 UI와 데이터를 연결하는 경우, XML이 먼저 실행되고 로직이 나중에 실행됩니다. 이로 인해 다음과 같은 문제가 발생합니다.초기 상태 비정상: UI 컴포넌트가 초기 상태를 올바르게 반영하지 못하거나, 데이터가 준비되기 전에 XML이 렌더링되어 잘못된 값을 표시할 수 있습니다.복잡한 상태 관리: XML의 뷰 상태와 로직의 데이터 상태를 일치시키기 위해 추가적인 코드가 필요합니다.1-2. 레이아웃 측정의 제약XML에서 커스텀 뷰를 만들거나 동적으로 뷰의 크기를 변경해야 하는 경우, onMeasure와 같은 메서드에서 크기를 측정하.. 2024. 12. 13. Android Test - 3. Instrumented Test 안드로이드 프레임워크가 연관되는 모듈은 jvm 위에서는 실행할 수가 없다. 따라서 테스트를 에뮬레이터나 실기기 위에서 수행해야 되는데 이것을 인스트루먼티드 유닛 테스트라고 합니다 여기서는 예제로 메인 액티비티를 생성한 다음에 그 라이프사이클 상태를 확인하는 인스트루먼티드 테스트를 해보겠습니다 우선은 테스트에 필요한 Dependency를 추가해줍니다 androidTestImplementation "androidx.test:core:1.5.0" androidTestImplementation "androidx.test.ext:trush:1.5.0" androidTestImplementation "androidx.test:rules:1.5.0" 다음은 MainActivity 클래스로부터 테스트를 작성해 보겠습니.. 2024. 3. 31. Android Test - 2. Local Test Build.Gradle 아래와 같이 기본으로 아래와 같이 Testing에 관련된 라이브러리가 추가 되어 있다. 이 testImplement와 androidTestImplementation 키워드를 볼 수 있다. jvm 만으로 수행할 수 있는 로컬 단위 테스트에 사용되는 Dependency 는 testImplement 이고 안드로이드 에뮬레이터나 실기기를 필요로 하는 계측 단위 테스트에 사용되는 Dependency는 androidTestImplementation 이다. 그러므로 이 기본 프로젝트에는 로컬 테스트용으로 JUnit4가 추가되고 계층 테스트용으로 JUnit Extension 그리고 Espresso가 추가되는 것 이다. 여기에 Assertion을 더 읽기 용이하게 해주는 Truth와 테스트를 크기.. 2024. 3. 31. Android Test - 1. Basic 이번 글은 TestCode 도입에 앞서 지식에 대해서 정의하려고 한다. The History of Software Testing에서는 소프트웨어 테스팅이 1822년 찰스 베비지의 차분 엔진 제작과 함께 시작되었다고 하고 Bug라는 단어는 토마스 에디슨이 1878년 동료에게 보내는 편지에서 처음 사용된 것으로 알려져 있다. 따라서 테스트 방법론에서는 서로 대립하는 수많은 주장이 긴 시간동안 개발되어져 왔다. 테스트 유형이 피라미드 구조를 가져야 한다는 사람도 있고 아이스크림 콘 형태를 가져야한다는 사람도 있다. 또 테스트 커버리지는 100%를 목표해야 한다는 사람도 있고 혹은 100%를 목표하는 것은 무의미한 일이라고 말하기도 한다. 또 테스트를 먼저할지 구현이 먼저되어야 하는지에 대한 의견이 분분하다. .. 2024. 3. 31. Bitrise를 도입해 보자! 🛠 ■ Bitrise CI/CD 도입을 통한 배포 과정 자동화 및 효율성을 향상 시킨 경험 Background 리딩앤 서비스는 하나의 프로젝트와 사내 디자인 시스템, Utils, Viewer 등 5개 이상의 공통 모듈이 결합하여 형성되어 있음. 배포를 위해서는 프로젝트와 공통 모듈의 버전을 세팅한 후 APK를 추출하고, 이를 다운로드 할 수 있는 웹 페이지를 생성하여 QA 팀에 전달. Problem Situation 개발자의 실수로 잘못된 버전의 모듈로 APK 파일을 추출하여 전달해 잘못된 파일을 QA 검증하는 경우가 있었음. 웹페이지 생성 및 전달, Slack 알림 등 복잡하고 많은 리소스가 필요함. Troubleshooting & Result 사내 모바일 개발자들과 함께 Bitrise를 도입하여 CI.. 2024. 3. 23. 디자인 시스템의 텍스트 크기 문제 해결 경험 ■ 디자인 시스템의 텍스트 크기 문제 해결 경험 Background 사내 디자인 시스템에서 텍스트 크기는 DP(Density Pixel) 단위로 정의되어 있었으며, SP(Scale Pixel) 단위의 크기는 고려되지 않고 있었음. 사내 안드로이드 개발자들은 관습적으로 SP 단위로 개발해왔음. Problem Situation 리딩앤 서비스는 10세 미만의 어린이와 부모가 사용하기 때문에, 안드로이드 디바이스의 폰트 설정을 바꾸는 경우가 종종 있어 고려되지 않았던 SP 단위에 의해 예상하지 못한 UI가 나타나는 문제가 발생함 Troubleshooting 디자이너와 개발자들에게 이 문제를 주도적으로 알리고, 디자인 시스템의 Typography 크기에 대한 규칙을 재 정의하고 수정함 ■ 텍스트 컴포넌트 개선을 .. 2024. 3. 23. Android Build process 훑어보기 (1) - 빌드, 배포, 컴파일,런타임 빌드와 배포 서버에 기능을 추가 하려면 개발자가 로컬 PC에서 개발을 하고 테스트까지 진행한 뒤에 문제가 없을 경우 사용자가 사용할 수 있도록 수정된 코드를 실 서버에 반영해야 한다. 실서버에 반영을 하는 것을 "배포"라고 하고 배포를 하기 위한 과정을 "빌드"라고 한다. 컴파일(Compile) 컴파일은 프로그램을 생성하기 위해 개발자가 작성한 소스코드을 "컴파일" 이라는 과정을 통해 기계가 알아들을 수 있는 과정을 말한다. 그러나 Java 와 kotlin은 조금 다른 과정을 거친다. (우리는 안드로이드 개발자이니 여기를 좀더 중점적으로 보자. 자바(확장자 : '.java')와 코틀린(확장자 : '.kt')으로 구성된 파일이 있을때 각각의 javac 와 kotlinc에 의해서 자바 바이트 코드로 컴파일 .. 2024. 3. 5. Serializable의 위험성을 알아보자!!! 이전 버전의 호환성을 고려한 앱 업데이트 및 이슈 대응 경험 Background 자동 로그인을 위해 Serializable로 로컬에 저장하던 데이터 클래스가 존재함. 이전 버전에서 새 버전으로 업데이트하는 과정에서 역직렬화 에러가 발생 하여 자동로그인이 되지 않음. Problem Situation 새 버전 개발 도중 데이터 클래스를 수정 했고 이전 버전에서 저장된 데이터와 새 버전에서 수정된 데이터의 형태 차이로 역 직렬화 과정에서 Exception 발생 역 직렬화 오류 Exception이 OS 버전에 따라 다르게 발생. OS 6 버전 이하 : IllegalArgumentException OS 6 버전 초과 : InvalidClassException Troubleshooting & Result OS 버전.. 2024. 2. 15. 하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(1) - BuildType, productFlavors 이 글을 앞서 먼저 예시의 상황을 만들어 보자. 먼저 당신은 서비스를 개발하기 전 다양한 형태의 서비스를 제공하기 위해 설계를 해야한다. 여기서 다양한 형태란 무엇일까? 개발용 debug, 구글 플레이스토어에 올라갈 실제 유저가 사용될 release 두 가지의 빌드 타입 무료버젼과 유료버젼 등 다양한 버젼 딥링크를 활용한 서비스 지원 라이브러리화하여 외부 업체 지원 하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자! 시리즈는 위의 다양한 형태에 대해서 작성해보려 한다. 2편 : 하나의 프로젝트에서 여러 다른 버전의 앱을 만들어 보자!(2) - DeepLink 3편 : 하나의 프로젝트에서 여러 다른 버젼의 앱을 만들어 보자!(3) - Link 이번 글은 빌드 타입과 버젼을 지정할 수 있는 방법에 대해.. 2024. 1. 28. 이전 1 2 3 4 5 다음