✔️ Gson을 Moshi로 마이그레이션하기로 결정한 이유지금까지 Json 직렬화 라이브러리로 Gson을 사용해 왔는데, 되돌아보니 Gson을 선택한 이유가 없었다.그냥 다들 Gson을 사용한다니까 사용했던 것 같아서, 다른 라이브러리들과의 비교를 통해 Moshi로 마이그레이션 하기로 결정했다.Gson / Moshi / Jackson을 비교했고, 그 중에서 (1) Kotlin 호환성 (2) 라이브러리 지속성 (3) 런타임 퍼포먼스위 세 가지를 주요 비교점으로 두었다.Retrofit의 개발사인 Square사의 라이브러리이며, 셋 중 Kotiln 호환성이 가장 뛰어나고, 런타임 퍼포먼스가 높은 Moshi로 결정하게 되었다. ✔️ Moshi 란?Square에서 개발한 경량 Json 라이브러리이다.Kotlin ..
개요 평소 당연한 듯 ViewPager와 RecyclerView를 사용해왔는데, 이번 기회에 내부 코드를 읽고 동작 원리를 파악하기 위해 포스팅을 남긴다. 1편은 우선 Recycler 클래스에 대해 알아보고, 2편에서는 RecyclerView의 Animation 처리에 대해 알아볼 예정이다. 그 다음은 ViewPager나 Proto datastore에 대해 포스팅하려 한다. 메인 키워드ViewHolderRecyclerscrap/unscrapRecycledPoolView와 ViewHolder의 관계RecyclerView는 화면에 보여지는 항목 개수만큼의 View와 ViewHolder를 생성한다. 이 때 각각의 View는 ViewHolder와 1:1의 관계를 가지게 되는데, 화면에 6개의 아이템이 보여진다면..
개발을 하다 보면 이미지 업로드를 위해 갤러리 사진 선택 기능을 사용하는 경우가 있다. 내가 구현하고자 했던 기능은 이미지를 최대 N장 선택 및 리사이클러뷰에 추가, 이후 서버에 업로드하는 기능이였는데, Tiramisu 이상에서 추가된 MediaStore.ACTION_PICK_IMAGES의 MediaStore.EXTRA_PICK_IMAGES_MAX라는 Intent extra를 설정하다 문제에 직면했다. 트러블 val maxPhotoCount = MAX_PHOTO_COUNT - currPhotoCount val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply { putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotos..
이번 포스팅에서는 안드로이드 스튜디오에서 클린 아키텍처 구조를 적용한 멀티모듈 프로젝트를 생성하는 예제를 설명하도록 하겠습니다.계층별, 클래스별 세부적인 코드들은 들어있지 않으니 우선 전체적인 구조를 이해한다는 마음으로 읽어주시면 감사하겠습니다.다음 포스팅에서는 간단한 실습 앱을 만들면서 각 클래스별 역할/세부 코드와 전체적인 플로우에 대해 알아보겠습니다. 프로젝트 설정우선 전체적인 구조로 보면 기본으로 있는 app 모듈은 Application 클래스가 위치하며, 사용하는 DI에 따라 모든 Module들이 이곳에 존재할 수도, 또는 각 계층에 존재할 수도 있습니다. ✔️ 좌측 상단 File - New - New Module을 선택합니다. ✔️ 좌측 메뉴들 중에서 Android Library를 선택한 뒤,..
클린 아키텍처 첫번째 포스팅에서 Domain 계층이 외부에 의존성을 가지지 않도록 하는 의존성 규칙(DIP)을 적용하기 위해 추상화된 인터페이스를 사용했다.하지만 클린 아키텍처는 비교적 러닝커브가 가파른 개념이라 세부사항들에 대한 설명이 중요할 것 같아서DIP를 사용하는 이유와 적용했을때/적용하지 않았을 때의 구조적 차이점에 대해 알아보고자 한다. 이번 포스팅은 Project level(Module Level이라고 해야하나? 몰?루)에서의 계층간 의존도와 Source code level에서의 계층간 의존도 이렇게 크게 두 파트로 나뉘어진다.프바프라서 모든 프로젝트에 해당되지 않을 수도 있지만, 내가 진행중인 프로젝트에서는Data 계층의 Mapper에서 해당 계층의 데이터 클래스를 Domain 계층의 Mo..
오늘의 주제는 로버튼 마틴 형님의 "클린 아키텍처"라는 개념이다.많은 기업들이 해당 아키텍처 구조를 사용하고 있으며, 비즈니스 로직 덩어리가 클수록 장점이 부각되는 구조이다.하지만 기존의 "클린 아키텍처"라는 개념은 분야에 구애받지 않는 개념이라 안드로이드에서는 완벽하게 호환되지 않는다.그래서 오늘은 안드로이드에서의 클린 아키텍처에 대해 설명하고자 한다. 구조도를 보면 컴포넌트나 의존성 구조가 조금 다르니 그 부분을 유의해서 보면 이해가 쉬울 것이다. 클린 아키텍처의 핵심적인 역할을 하는 SOLID에 대해 궁금하다면 이 포스팅을 참고하면 도움이 될 것이다. 클린 아키텍처와 SOLID클린 아키텍처는 이제 안드로이드 진영의 많은 기업들이 선호하는(?) 아키텍처가 되었다.내가 이 책을 읽었던 작년 이 맘 때와..
개발자들은 다양한 오픈소스 라이브러리들을 사용한다.오늘은 그 중에서 내가 사용하는 여러 라이브러리들의 라이선스에 대해 알아보고, 상업적인 목적으로 사용하는 경우에 어떤 방식으로 표기하는 것이 올바른 라이브러리 사용법인지 알아보고자 한다.대부분의 라이브러리는 프로젝트의 라이선스 고지를 요구하는 경우가 많기 때문에, 이를 정확히 알아야 앱을 출시하고 운영하는데에 있어서 문제가 발생하지 않을 것이다.1. RxJava- 라이선스: Apache License 2.0- 고지 방법: 라이선스 텍스트를 포함한 복사본을 프로젝트의 라이선스 고지 문서에 포함해야 한다. 2. Retrofit- 라이선스: Apache License 2.0- 고지 방법: 라이선스 텍스트를 포함한 복사본을 프로젝트의 라이선스 고지 문서에 포함해..
우리는 보통 ViewModel을 생성할 때 ViewModel()을 상속받아 사용한다. 그래서 일반적으로 ViewModel에서는 Context에 직접 접근하지 않는다. ViewModel의 주요 목적이 UI와 비즈니스 로직을 분리하기 위한 것이기 때문이다. 이를 통해서 UI의 생명주기에 영향을 받지 않고 독립적으로 데이터를 유지할 수 있게 된다. 하지만 특정 상황에서는 ViewModel에서 Context에 접근해야하는 경우가 발생하다. 이 때 생성자 파라미터로 받거나 객체를 생성해서 받는 것은 올바른 방법이 아니다. AndroidViewModel 클래스를 사용해서 해결이 가능한데, 이는 Application Context를 파라미터로 받고 이것을 통해 리소스나 시스템 서비스를 사용할 수 있게 된다. clas..
안드로이드 개발자라면 MVVM이 대세라는 말들과 그에 대한 여러 정보를 어렵지 않게 많이 접해봤을 것이다. 많은 기업들이 MVVM 패턴을 사용하고 있고, 여러 채용 공고들에도 아키텍처에 대한 이해나 MVVM 실무 경험 등이 푸함되어 있기 때문이다. 그래서 오히려 무지성으로 ViewModel에 대한 이해 없이 겉핥기식 MVVM 패턴을 사용하는 사람도 많아진 것 같다. 0. ViewModel이 왜 두가지로 나뉘게 되었는가 구글이 Jetpack을 내놓기 이전부터 개발자들은 MVVM 패턴을 적용하여 개발을 하고 있었다. 그러다 구글이 Jetpack을 내놓으면서 그 당시 개발자들에겐 낯익은 ViewModel도 포함되어 있어 다들 기존의 MVVM 구조에서 사용하던 ViewModel을 구글에서 다듬어 내놨으리라 기대..
안드로이드에서의 이미지 처리는 꽤나 중요하고 골치아픈 영역이다. 이미지 로딩, 리소스 해제, 캐싱 등 고려해야할 여러 요소들이 많고, 이미지는 보통 한 두개가 들어가기보다 목록형으로 나열되는 경우가 많다보니 성능에 큰 영향을 미치기 때문이다. 이 포스팅에서는 다루지 않지만, 서버에서 이미지를 로드해야하는 경우에도 굉장히 좋은 퍼포먼스를 준다고 하는데 추후에 실무에서 사용하게 된다면 그때 추가로 작성할 생각이다. 1. Glide란 무엇인가 Glide는 Google에서 만든 이미지 로딩 라이브러리이다. (인수했으니까 아무튼 구글꺼) 처음 경험하는 사람도 쉽게 사용할 수 있을 정도로 직관적이고 효율적이라는 것이 큰 장점이다. 여기서, 어떤 이미지를, 어디에, 사이즈는 얼마로, 캐싱은 어떻게, 이런식으로 설정할..