Android62 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. OS14 알람 및 리와인더 권한 대응을 해보자 지난 주 월요일 저녁 퇴근 후, 급속도로 올라오는 Firebase CrashReport를 보며 무슨 일이 일어났겠구나. 라고 생각은 했지만 OS 업데이트로 인한 알람 권한 이슈가 올라 올 것이라고는 생각도 못했다... 이번 글은 지난 주에 있었던 일을 공유해보려 한다. 사건의 시작 FireBase CrashReport에 위와 같은 에러가 올라왔고 읽어보면 SecurityException이라고 되어 있는걸 보니 권한 이슈라고는 짐작했다. 그런데 이해가 안되는건 배포는 한참전에 되었는데 이제와서 갑자기??????? 일단 문제를 해결하기 위해 구글링을 해보니 아래와 같이 공식문서를 발견할 수 있었다. 공식문서 위의 내용을 간략하게 요약하면 OS14 부터 알람 권한(SCHEDULE_EXACT_ALARM)은 권한.. 2024. 1. 22. 안드로이드에서의 직렬화에 대해 알아보자 (Serializable, Parcelable) Info 나는 사이드 프로젝트 중 Clean Architecture로 레이어를 나눠 개발 중이였다. 현 상황은 UI레이어에서는 Domain의 Book이란 객체를 사용하고 있었다. JetPack Navigation을 이용해 이전화면에서 데이터를 넘김과 동시에 화면을 이동하려 하는데 Serializable 이나 Parcelabe이 아니면 객체를 넘기지 못했다. 이런 상황에서 Domain은 순수한 객체여야 하기에 Parcelabe 는 Android SDK 인터페이스이기에 사용하지 못한다. 그렇기에 이 상황을 넘김과 동시에 직렬화에 대해 좀더 이해하기 위해 이 글을 작성한다. 직렬화란? 직렬화는 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 byte 코드 형태로 나열하는 것이다. 여기서 메모리 .. 2023. 12. 2. Jetpack Media3 나오게 된 배경 Media3는 기존에 존재하던 라이브러리(ex. Jetpack Media, Media2,Exoplayer 등등)에서 UI 재생, 그리고 Media Session 과 같은 공통 기능을 정의했으며 파편화 되었던 각 라이브러리들간의 복잡성을 추상화 하였다. 또한 공통으로 사용할 수 있는 Player인터페이스를 정의하여 편의성을 증대 시켰다. 이번 글은 Media3에 대해 알아보도록 하자. ☆중요 Media3이 이전 미디어 API와 구별되는 주요 특징 중 하나는 더 이상 구성요소 간 커넥터가 필요하지 않다는 것이다. 새로운 MediaSession클래스는 UI와 마찬가지로 Player 인터페이스를 구현하는 모든 클래스를 사용한다. ExoPlayer와 MediaController는 모두 이 인터페이.. 2023. 11. 15. 미디어 용어 사전2 - Android AudioTrack AudioTrack은 안드로이드에서 제공하는 API로, 간단하게 말해 안드로이드 앱에서 소리를 재생하는 데 사용되는 도구이다. 이 API를 통해 음악, 효과음, 또는 다양한 오디오 소스를 앱에서 제어하고 재생할 수 있다. 예를 들어, 게임 앱에서 특정 상황에 맞는 효과음을 재생하거나 음악 앱에서 노래를 재생하는 데에 사용될 수 있다. AudioTrack은 오디오 데이터를 다루고 재생하는 데 도움이 되며, 앱 개발자들은 이를 활용하여 사용자에게 더 풍부하고 흥미로운 오디오 경험을 제공할 수 있다. AudioTrack 클래스는 Java 어플리케이션에서 하나의 오디오 자원을 관리하고 재생하는 역할을 한다. 이 클래스는 PCM(펄스 코드 변조) 오디오 버퍼를 오디오 장치로 전송하여 재생하는 .. 2023. 11. 14. 미디어 용어 사전1 - Basic 인코딩(코딩) / 디코딩 인코딩은 정보를 특정 형식으로 변환하는 과정을 의미한다. 이는 데이터를 효율적으로 저장하거나 전송하기 위해 주로 사용된다. 예를 들어, 비디오 인코딩은 큰 용량의 원본 비디오 데이터를 작은 크기로 압축하는 과정을 말한다. 반면, 디코딩은 인코딩된 데이터를 원래의 형태로 복구하는 과정이다. 디코딩을 통해 우리는 인코딩된 비디오 파일을 원래의 화질로 볼 수 있게 된다. 간단히 말해, 인코딩은 정보를 효율적으로 다루기 위해 변환하는 과정이고, 디코딩은 변환된 정보를 원래대로 복구하는 과정입니다. 코덱 '코덱'은 '코더'와 '디코더'의 합성어로, 미디어 파일을 압축(인코딩)하거나 압축을 풀어 원래의 상태로 되돌리는(디코딩) 기술을 의미한다. 코덱은 미디어 데이터를 효율적으로 다루기 위한.. 2023. 11. 12. 이전 1 2 3 4 5 다음