Android/Architecture
안드로이드 프로젝트 Multi Module로 빌드시간 줄이기 (data, repository 계층 분리)
개발을 주로 집에서 데스크탑으로 하고, 또 데스크탑 성능이 좋은편이라 기존에 개발할 때에는 몇몇 테스트를 제외하곤 주로 안드로이드 스튜디오에 내장된 에뮬레이터를 이용하는 경우가 많았다. 그러나 이번에 실 배포용으로 앱을 만들려다 보니 에뮬레이터가 아닌 실기기로 테스트하는 경우가 굉장히 많아졌는데, 에뮬레이터와 다르게 앱을 빌드하고 인스톨 하는 시간이 생각보다 꽤 오래 걸렸다. 이게 생각보다 많이 불편했던지라 인스톨 시간은 어쩔수 없다고 쳐도 최소한 빌드 시간이라도 줄이고 싶다는 생각으로, 평소에 말만 들어왔던 모듈화를 해보기로 하였다. 모듈로 만들 수 있는것에는 다양한 것들이 있겠으나, MVVM 아키텍쳐에서 좀 더 확실한 관심사 분리를 위해 Repository와 Data 파트를 모듈화 해보기로 결정하였다..
Hilt의 다양한 어노테이션 - @Provides, @Binds, @Qualifier
Hilt는 일반적으로 다음과 같이 생성자 주입 방식을 사용한다. @AndroidEntryPoint class ExampleActivity : AppCompatActivity() { @Inject lateinit var analytics: AnalyticsAdapter ... } class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... } 그러나 Hilt에서 생성자 주입을 할 수 없는 경우 Hilt 모듈을 만들어서 종속성을 주입해야 하며, 이 때 상황에 따라 @Provides와 @Binds 어노테이션을 사용할 수 있다. @Provides를 사용하여 인스턴스 주입 Room이나 Retrofit, OkHttp..
Android MVVM + DI(Hilt) 적용하기
2020년 말 ~ 2021년 초에 안드로이드 MVVM 관련하여 포스팅한적이 있으나 다음과 같은 이유들로 새롭게 포스팅한다. deprecated된 코드가 존재하며 코틀린과 자바가 혼재해 있다는 점. 당시에는 완전 처음 배우는 개념이다보니 설명 자체가 매우 미흡하다는 점. MVVM in Android CleanArchitecture 로버트 C 마틴에 의해 고안된 프로그래밍 철학 핵심 골자는 각 소프트웨어의 '관심사분리' MVC Model, View, Controller로 이루어지는 디자인 패턴 컨트롤러는 사용자의 입력을 받아 모델에 데이터를 요청, 받아서 뷰에 데이터를 전달, 뷰에서 UI의 변화가 일어난다. 예를들어 버튼을 누르면 현재 시간을 보여주는 프로그램을 구현할 때, 버튼을 클릭하면 컨트롤러는 이를 ..
WorkManager에 Hilt를 이용하여 의존성 주입하기
WorkManager에 Hilt로 의존성 주입하기 안드로이드 Sunflower 코드를 뜯어보며 공부하던 중, Room에 초기 데이터를 채워주기 위해 사용하는 WorkManager를 사용하는데에 문제가 있었다. Sunflower에서는 Room DB를 생성한 후, 필요한 곳에서 instance를 호출하여 사용하는 구조였으나, 본인은 의존성을 주입할 때 Singleton으로 생성하여 주입하는 식으로 코드를 작성하였기 때문에, WorkManager 내부에서 Room DB를 사용하기 위해선 주입을 받아 사용해야했다. 그러나 일반적으로 WorkManager는 기존에 제공하는 패러미터를 제외하고는 사용할 수 없다. 추가로 패러미터를 넣을 경우 다음과 같은 에러가 호출된다. java.lang.NoSuchMethodEx..
DataBinding vs ViewBinding
DataBinding과 ViewBinding에 대한 기록 둘 다 모두 뷰를 직접 참조하게 해주는 binding class를 제공한다. Databinding 혹은 Viewbinding을 적용하지 않으면 자바 및 코틀린 전부 findViewById라는 함수를 이용해서 view를 객체화 하여 사용한다 val Btn = findViewById(R.id.Button_id) (이전에는 kotlin에서는 확장함수를 통해 findViewById없이 뷰의 이름만으로 바로 참조할 수 있었으나 deprecated 됨) 그러나 view component들이 많아질수록 findViewById를 계속해서 호출해야하므로 보일러플레이트가 발생하기 쉽고, 해당 view가 갖고있지 않는 id가 불러질 수 있어서 null exceptio..
Android - State Pattern
State 패턴 객체의 특정 상태를 사전에 미리 선언하여 각각의 상태에 따른 동작방식을 정의하여 사용할 수 있다. 각각의 상태 클래스들을 캡슐화, 호출하여 사용한다. UI상태로직이 복잡해져도 코드의 가독성이 좋다. 예를들어 쇼핑몰에서 어떤 메뉴를 주문하는 화면이라고 가정해본다면, 다음과 같은 방식으로 작성 및 호출하여 사용할 수 있다. sealed class State { object Uninitialized: State() object Loading: State() data class Success( val List ): State() data class Error( val errorMessage: String ): State() } - when (State) { is State.Loading -> {..
안드로이드 MVVM 패턴 익히기 (4) Dagger-Hilt
Hilt는 기존의 Dagger2의 과도하게 많은 annotaiton과 보일러 플레이트 코드, 매우 높은 학습곡선등의 단점들을 해소하기 위해 구글에서 제공하는 라이브러리며, 현재는 jetpack에 합류되었다. // Dagger-Hilt implementation "com.google.dagger:hilt-android:2.28-alpha" kapt "com.google.dagger:hilt-android-compiler:2.28-alpha" // Dagger-Hilt with Jetpack implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01' kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01' Hil..