본문 바로가기

ALL

(198)
[Android/Jetpack Compose] 컴포즈에서 터치 이벤트를 처리할 때의 유의점 Jetpack Compose 아이템의 더블탭 이벤트에 따라 애니메이션을 수행하는 개발을 진행중에 있었다. 이벤트 처리도 손쉽게 Modifier로 마무리 됐구나 생각한 찰나, 애니메이션이 의도대로 재생되지 않았고 긴 추적 끝에 터치 이벤트를 통해 전달된 대상 state가 재생을 필요하는 UI의 state와 일치하지 않는 것을 확인했다. 아래는 doubleTap 제스처를 트래킹하는 Android Developers page 스니펫인데, pointerInput의 parameter를 Unit으로 운영하는 걸 확인할 수 있다. var zoomed by remember { mutableStateOf(false) } var zoomOffset by remember { mutableStateOf(Offset.Zero)..
[Android/Testing] Hot StateFlow의 유닛 테스팅 in ViewModel 이제 LiveData의 시대가 가고 자연스레 Flow의 시대가 도래한 듯 하다. LiveData와 마찬가지로 동적인 속성을 가진 Flow의 테스팅을 위해서는 일련의 설정이 필요한데, 해당 포스트에서는 다루는 빈도가 많을 Hot StateFlow의 Unit-Test 설정 및 방식을 정리하려 한다. Dependencies org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3 org.jetbrains.kotlinx:kotlinx-coroutinesandroid:1.7.3 kotlin = "1.8.10" Testing 1. Before, After Annotation으로 테스트 전후 Dispatcher를 UnconfinedTestDispatcher로, 테스트 이후 이를 초..
[Android/Jetpack Compose] Spannable string 처리하기 기존의 xml 베이스의 레이아웃을 Jetpack compose로 전환하면서 특정 부분의 텍스트에 스타일과 클릭 이벤트를 줘야 하는 Spannable 처리가 필요했다. Spannable 처리를 통해 부분적으로 string 스타일을 바꿀 수 있을 뿐더러, 클릭시 url 오픈 등의 가이드 액션도 적용할 수 있다. 이를 위해서 사용한 API는 AnnotatedString이다. 누군가는 string을 각각 append하는 방식으로 spannable 처리를 하기도 했는데, 다국어 및 리소스 관리에서 불편함이 많을 것 같아서, 일단 기본 문장을 넣어놓고, spannable 처리를 하고자 하는 단어들을 별도로 선별해 스타일 및 클릭 이벤트를 처리하도록 적용했다. 1. AnnotatedString을 만드는 Composa..
[안드로이드] 빌드 속도를 올리는 짧은 팁. 빌드를 하던 중 Build Analyzer 추천에서 configuration cache 관련 옵션을 제안하는 것을 보게 되었다. 찾아보니 명령어 한 줄로 빌드 타임을 개선할 수 있는 방안이라 바로 적용해보았다. // configuration cache 켜기 .gradlew/ --configuration-cache // configuration cache 끄기 .gradlew/ --no-configuration-cache Configuration cache project.properties, project.property(name), project.hasProperty(name), project.getProperty(name) or project.findProperty(name) docs.gradle.or..
터지지 않는 앱의 역설(논리 에러) 최근 개발을 하다 리포트받은 버그가 있었는데, 이는 컴파일 과정이나 런타임중에 확인 할 수 없었던 부분이었다. 디버깅을 하고 나니 이는 소켓통신 결과에 따라 신규 데이터를 처리할 때 필수적인 변수에 default argument가 설정되어 있기 때문이었다. 여기서 해당 변수에 대한 mapping이 일부 누락이 되었고 이로 인해 오동작을 하게 된 소위 논리 에러가 발생하게 된 것이었다. 이번 버그를 통해 얻은 교훈이 있다면 필요에 따라 중요한 요소에 대해서는 의도적으로 개발자를 불편하게 할 필요가 있다는 것이었다. 가장 좋은 에러는 릴리즈 이전에 맛보는 에러이기 때문에, 중요한 기능들에 대해서 올바르게 구현되지 않았다면 개발자가 최소 런타임 중에, 나아가서 컴파일 중에 에러를 경험하도록 의도하는 것이 결국..
[STUDY] 깨끗한 코드란 무엇일까? 로버트 C.마틴의 클린 코드 보통 개발자 커리어를 시작하게 되면 여러 종류의 코드를 경험하게 되는데, 저마다 가진 '더럽다, 지저분하다' 느끼는 코드들을 머릿속에 가지고 있을 것이다. 그렇다면 '더러운 코드'란 소위 어떤 코드일까? 반대로 깨끗한 코드, '클린코드'란 무엇일까. 그리고 클린 코드가 가져다줄 수 있는 이점들은 무엇이 있을까? 로버트 C.마틴의 클린 코드를 완독하고 핵심 내용들에 대해 되새겨보고자 포스트를 쓰기로 했다. 책 전반에 있어 좋은 내용들이 참 많지만, 핵심적으로 간추려보고자 직관적인 개념인 '더러움' 과 '깨끗함'으로 나누어 정리해본다. Dirty code - 함수의 역할을 곧바로 읽을 수 없어 추측과 내비게이션을 반복해야 한다. - 유사한 내용이 군데군데 반복되고 있다. - 과한 주석이 코드를 읽기도 전에 ..
안드로이드 RecyclerView 커스텀 LayoutManager 구성하기 현재 안드로이드에서는 RecyclerView와 사용 가능한 세 개의 LayoutManager를 제공하고 있다.(GridLayoutManager, LinearLayoutManager, StaggeredLayoutManager) 하지만 경우에 따라 여기중 어느 것으로도 원하는 아이템 구성을 RecyclerView에 적용하지 못할 수 있다. 그렇다면 이제.. 직접 커스텀 LayoutManager를 구성해야만 한다! 이번 작업을 위해 아래의 포스트를 참조했다. A Custom LayoutManager Case: Bumble Beeline A step by step guide to building a custom LayoutManager medium.com 이제 직접 해야할 때 커스텀 LayoutManager를 ..
[Jetpack/Compose] Compose 핵심 정리 요즘 세상 핫한 Jetpack Compose의 코드 랩을 마치면서, 내가 느낀 키포인트 네가지에 대해 정리하고 넘어가고자 한다! 1. Declaritive UI 이전의 명령형 UI(Imperative UI)가 현재 구성되어 그려진 View의 상태에 의존적이었다면, 선언형 UI는 현재 View 상태에 대한 의존 없이 철저하게 View를 구성하는 데 사용한 데이터에 기반해 화면을 그린다. 더 쉽게 말하자면, 선언형 UI는 UI를 그리는 순간에 대해서만 정의할 뿐, 그려진 UI에 대해서는 생각하지 않는다. 보이는 화면을 바꾸고 싶다면, 보이는 화면이 아닌 보이는 화면을 그린 방법을 살피는 것이다. (이는 Recomposition을 이해하면 더 쉽게 이해될 것이다.) 이전에 MVVM 등의 아키텍처 구조에 익숙하..