액티비티의 라이프사이클이나 코루틴에 대해서 어떻게 설계를 해야할까..
테스트는 어떻게 진행해야할까. 머리를 쥐어짜내던 요즘
메모리 효율을 어떻게 끌어올려야하나에 대해서 점점 고민이 깊어지는 상황 (아직 짬찐데 어떻게 하지.....)
왜냐? 프로젝트가 거의 마무리 단계이기 때문.
그렇게 여러 블로그를 찾아보다가 우연히 현재 toss의 안드로이드를 담당하시는 개발자분의 깃헙에 들어갔다가 한 샘플을 보게 되는 NA..
패키지 구성부터가 내가 생각했던 것과 전혀 달랐던 상황.
그냥 코드만 읽다가 안 사실인데, Composable 어노테이션을 적은 함수를 내 activity 그니까 controller에서도 가능한 점이 신기함 (controller 맞나..?)
아무튼 디자인 패턴 등 여러가지 앱의 배포와 디버깅, 버전에 대해 관리를 도와주는 라이브러리를 찾아보던 중 이 3가지가 자주 나옴
ChatGPT에 먼저 물어봄
...
1. StateFlow
StateFlow는 Kotlin의 Coroutine에서 제공하는 State Management 도구입니다. LiveData의 대안으로 사용되며, 데이터의 변경 사항을 UI에 실시간으로 반영할 수 있도록 도와줍니다.
StateFlow의 특징
- MutableStateFlow와 StateFlow로 나뉩니다.
- MutableStateFlow: 상태를 변경할 수 있는 객체로, value 속성을 통해 값을 설정합니다.
- StateFlow: 값을 읽기 전용으로만 사용하며, collect 함수를 통해 값의 변경 사항을 관찰합니다.
- Lifecycle-Aware하지 않기 때문에 repeatOnLifecycle을 사용해 수명 주기에 맞게 구독하는 방식으로 구현하는 것이 좋습니다.
- StateFlow는 기본적으로 마지막 상태를 유지하고 Cold Flow로 동작하여 언제든지 구독할 수 있습니다.
class MyViewModel : ViewModel() {
private val _stateFlow = MutableStateFlow("초기값")
val stateFlow: StateFlow<String> = _stateFlow
fun updateState(newState: String) {
_stateFlow.value = newState
}
}
lifecycleScope.launch {
viewModel.stateFlow.collect { value ->
// UI 업데이트
textView.text = value
}
}
@HiltViewModel
class MyViewModel @Inject constructor() : ViewModel() {
private val _stateFlow = MutableStateFlow("Hello")
val stateFlow: StateFlow<String> = _stateFlow
fun updateState(newState: String) {
_stateFlow.value = newState
}
라는데 일단 StateFlow는 생명주기가 알아서 관리되는 LiveData와 다르게 생명주기를 알아서 관리하지 않고 따로 관리해야한다는 개념 같았다..
2. Hilt
둘 다 의존성 주입(Dependency Injection, DI)을 제공하는 라이브러리인데.. Android 앱 개발에서는 DI가 코드 재사용성, 테스트 용이성, 유지 보수성을 높여줍니다.
Dagger
- Dagger는 구글이 만든 의존성 주입 라이브러리로, 런타임이 아닌 컴파일 타임에 DI를 처리. 이를 통해 빠르고 성능이 좋은 DI를 제공. -> 컴파일 타임이 뭘까.. 잘 모르겠지만 눈치밥으로 지나온 세월동안 느꼈을 때, Build창에서 런타임보다 컴파일이 먼저인 것 같은데.. 코틀린 중 뭐 다른 것은 JVM으로 자바로 뭐 컴파일 해서 어쩌구해서 앱을 빌드 하는 느낌.
아무튼 여기서 내가 원하는 상황에서 이 의존성 주입 라이브러리를 통해서, 내가 원하는 상황에서 의존성을 주입하고, 그리고 종료하고 하는 아무튼 F1같은 레이싱 카에서는 수동차들이 많은 것 처럼, 세밀한 속도 조절을 위해서 기어를 내가 원하는 타이밍에 더 정밀하게 바꾸는 것처럼 이 의존성도 앱의 성능을 위해 내가 원하는 타이밍에 주입하는 느낌? 맞나..?
Module: 의존성을 제공하는 방법을 말함 @Provides 어노테이션을 사용해서 객체 생성
Component: 의존성의 범위를 정의하고, 의존성 주입 위치를 지정
- @Inject 어노테이션을 통해 의존성을 주입받을 수 있으며, @Singleton과 같은 범위(Scope)를 설정하여 객체의 생애 주기를 제어할 수 있습니다.
3. Hilt
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
- Hilt는 Dagger의 Android 전용 DI 프레임워크로, Dagger의 복잡한 설정을 간소화하여 빠르게 DI를 설정할 수 있게 해줍니다.
- Hilt는 기본적으로 Dagger를 기반으로 하지만, Android의 컴포넌트 생애 주기와 통합되어 더 쉽게 사용할 수 있습니다.
- @HiltAndroidApp 어노테이션을 Application 클래스에 추가하여 Hilt 사용을 시작합니다.
- @AndroidEntryPoint 어노테이션을 사용하여 Activity, Fragment, ViewModel 등 Android 구성 요소에 주입할 수 있게 합니다.
- Hilt는 의존성 범위에 따라 모듈을 자동으로 생성해주며, @Inject로 쉽게 주입이 가능합니다.
- ViewModel과 같은 경우 @HiltViewModel을 붙이고, 생성자에 SavedStateHandle과 같은 객체를 넣어 사용할 수 있습니다.
Hilt란 무엇일까.. 의존성 주입 라이브러리라는데 막 읽어보다가 이 공식문서에서 이런 표를 봤다
또잉?
Dagger를 사용하는데 주석같은 상용구 코드를 줄임. 그리고 대거에서 쓰는 Context같은 한정자..? 그니까 기존에 뭐 fragmentActivity나 Activity아니면 Application단에서 제공하는 것들을 준다는 건데.. 그러면 Dagger로 construct했을 때는 context같은 것들이 사용하기 어려운 건지.. 아무튼 써보진 않고 그냥 예습느낌으로 공부하는데 굉 어. (굉장히 어렵다는 뜻)
아무튼 끗
'개발 > android_kotlin' 카테고리의 다른 글
[ kotlin ] 생체인증, PIN, 패턴 인증 로그인 구현 (0) | 2024.12.12 |
---|---|
[ kotlin ] 안드로이드 종료 감지 (화면 종료, 앱 종료) (0) | 2024.12.12 |
[ Kotlin ] 안드로이드 Compose - State, ViewModel (0) | 2024.11.13 |
[ Kotlin ] Compose - 레이아웃만들기(material icon과 modifier 등) (0) | 2024.11.13 |
[ Kotlin ] 라이브러리 의존성 문제 (구버전들) (1) | 2024.11.12 |