본문 바로가기

ALL

(198)
[안드로이드/UI-UX] Material BadgeDrawable 로 Badge를 원하는 뷰에 적용하기 Material Design의 BottomNavigationView를 사용해본 적이 있다면 매우 간편하게 Badge를 업데이트 할 수 있음을 경험한 적이 있을 것이다. 금번에 뱃지를 BottomNavigationView가 아닌 별도 View(이를테면 TextView 라던지)에 달아야 하는 경우가 생겼는데, 쓸만하고 예쁘다 싶은 라이브러리가 잘 없었기에, Material의 Badge가 떠오르는 건 어쩔 수가 없었다. 그런데 다행스럽게도 구글에서 Material Components 1.1.0-alpha09 버전부터 Badge를 지원하고 있다는 반가운 소식! Release 1.1.0-alpha09 · material-components/material-components-android Dependency Up..
[안드로이드] include 태그를 사용하고 있다면? merge 태그로 레이아웃 계층 줄이기 이 포스트는 레이아웃에 관해 다루기 때문에 UI/UX 카테고리에 넣어야 하나도 싶지만, 결론적으로 앱의 성능을 높이기 위한 레이아웃 최적화 작업이기 때문에 Performace 카테고리로 옮기기로 했다. 우선 첫번째로 안드로이드에서 뷰의 계층이 성능이 어떻게 영향을 주는지에 대해서 더 제대로 이해를 해 보고 싶었다. 상기 내용에 대해서 안드로이드 개발자 문서에서는 아래 정도의 내용으로 레이아웃 계층 문제를 설명하고 있다. 모든 뷰는 레이아웃(동사) 및 측정단계를 거쳐 렌더링 된다. 레이아웃 및 측정단계에서 측정 단계는 View 객체의 크기와 경계를 결정하고, 레이아웃 단계는 이 객체를 배치할 위치를 결정. 뷰가 setText 등의 작업에 의해 사이즈를 조절해야 하는 경우 다시 이 레이아웃 및 측정단계를 거..
[Kotlin] Default Argument와 Named Argument 활용하기 개발을 하게 되면서 일상적으로 마주하는 상황 중에 변수들을 넘겨주기 위한 클래스나 메소드를 설계하고, 이를 활용해야 할 때가 있다. 코틀린은 이런 상황에서 개발자가 그저 설정이 필요 없는 변수들을 넘겨줄 것 없이 손쉽게 개발 할 수 있도록 Default Argument를 제공하고 있다. 1. Default Argument - 정의한 Function 혹은 class의 매개변수를 아래와 같이 설정한다. // 아이스크림을 만드는 function이 있다면? // amount는 만드는 갯수, option은 맛이라고 할 때. fun makeIcecream(amount: Int = 1, option : String = "바닐라"): IceCream { return IceCream(amount, option) } //..
[안드로이드] Kotlin sealed class로 여러 클래스들을 보다 분명하게, 유연하게 활용하기 기존에 MVP 아키텍처 패턴으로 짜여진 프로젝트를 빌드업하면서 몇가지 애로사항이 생겼다. Presenter에서 로직을 수행 후 뷰를 업데이트하기 위한 코드를 최대한 작은 단위로 한정해서, 서로 제약사항이 생기지 않도록 구현하고 있었는데, 문제는 여기서 각 뷰 단위를 업데이트하기 위한 코드가 배로 많아지고, UI가 어떤 코드를 거쳐 업데이트 되는지 한 눈에 파악하기가 어려웠다. 수행하고자 하는 코드를 파라미터의 종류에 따라 구분지을 수는 없을까? 그리고 이를 하나의 함수로 통일시켜 사용할 수 있을까? 특정 함수에 사용하고자 하는 클래스들을 제한해 사용할 수 있을까? 이런 물음들을 Kotlin의 sealed class를 활용해 상당부분 해결할 수 있었다. 1. Sealed Class란 무엇인가? Sealed..
[Dagger2] 헷갈리는 DI 어노테이션 및 개념 정리 Dagger2를 사용한 DI를 반영하는 중에 헷갈리고 어려움을 겪는 부분을 최소하 하고자 내용을 좀 정리해두기로 했다. 어노테이션들에 대한 이해와 컴포넌트와 모듈간의 의존성 주입이 어떻게 이루어지는지가 이해되어야 원하는대로 의존성 주입을 수행함은 물론 컴파일 에러 지옥에서 빠져나올 수 있을 것이다. 0. 기본개념 Dagger2는 의존성 주입을 위해 개발된 라이브러리이다. 높은 러닝 커브를 자랑하지만, Hilt나 Koin에 앞서 광범위하게 사용되고 있는 DI 라이브러리로 알고 있다. 작동하기 위한 핵심 요소들만 살펴보면 의존성 주입을 위해서는 아래 요소가 구성되어야 한다. 제공하고자 하는 객체와 메소드 > 객체와 메소드의 의존성을 제공하는 모듈 > 모듈이 제공하는 의존성을 프로젝트에 제공하는 컴포넌트 이들..
[안드로이드 | Rx] Schedulers 주의 깊게 살펴보기 Rx의 비동기 방식 및 Scheduler를 활용한 작업 처리는 Threading을 손쉽게 처리해준다는 점에서 매우 유용하지만, 잘못된 Scheduler를 사용하는 경우 피를 보게 될 여지가 분명하다. 금번에 피맛을 좀 본 뒤로 앞으로의 이슈를 방지하고자 다시금 Scheduler들을 리뷰하고 넘어가고자 한다! 1. IO IO 스케줄러는 네이밍대로 네트워크 관련 작업이나 파일 시스템과의 상호작용시 사용하는 스케줄러이다. 자바의 Thread pool(작업을 기다리고 재사용되는 Worker thread 그룹)을 통해 구동되며, 기존 Thread가 재사용되지 못하는 조건에 있는 경우 새로운 Thread를 생성해 작업을 수행한다. 이 특징 때문에 경우에 따라 엄청난 양의 Thread를 만들 수 있고, 이로 인해 성..
[안드로이드] 구글이 소개하는 메모리 최적화 기법들을 리뷰해보자 안드로이드 개념 공부를 하던 중에 앱 메모리 관리라는 페이지를 찾게 되었는데, 상당히 유용한 정보들과 어떠한 기술들이 실질적으로 어떤 이점을 가져다주는지 등에 대한 내용들이 있어 포스팅에 좋을 것 같다고 생각했다. 공식 문서가 소개하는 내용들 중 핵심적으로 정리하고자 하는 내용들을 써보고자 한다. 1. onTrimMemory callback의 활용 import android.content.ComponentCallbacks2 // Other import statements ... class MainActivity : AppCompatActivity(), ComponentCallbacks2 { // Other activity code ... /** * Release memory when the UI beco..
[Room] Room DB 및 Firebase RDB와의 Transaction 최적화하기 기존에 개발하던 서비스의 고질적인 문제는 다량의 데이터와의 상호작용시 시간이 상당히 오래 걸린다는 것이었다. Firebase RDB와의 통신에서의 속도 저하에 이어 Firebase RDB로부터 로드한 데이터를 Room에 집어넣는 과정에서의 2차 속도저하가 있었기 때문이었다. 하지만 여차저차 그동안의 서비스를 유지할 수 있던 점은, 다량의 데이터를 Query할 UI/UX가 없었기 때문이었다. 이제 신규 개발안에 따라 결론적으로 '진작에' 해결됬어야 할 문제와 일기토를 해야 될 상황에 이르렀다. 우선 기존의 로직 구조를 먼저 설명하고자 한다. Before Firebase RDB에서 타겟으로 하는 테이블의 Data를 addValueEventListener를 통해 요청한다. 요청을 통해 들어온 DataSnaps..