개발(37)
-
Compose 2024
Compose 성능 최적화를 위한 Stability 마스터하기- 무조건 컴포즈Compose StructureCompose CompilerJetpack compose 내에서 중추적인 역할을 하는 핵심 요소Kotlin2.0부터는 Compose 컴파일러와 Kotlin의 버전 통합Compose RuntimeCompose 모델 및 상태 관리의 초석 역할Compose UI개발자가 Composable 함수를 통해 레이아웃을 생성할 수 있도록 컴포넌트 라이브러리로 제공 recomposition을 통해 재실행이 가능함관찰중인 State에 변경 발생할 때 일어남Compose 런타임에거 정보를 전달Compose런타임은 상태변경을 관찰하고 recomposition을 트리거하는 State라는 효율적인 매커니즘을제공Compose..
2024.06.11 -
[Android A..Z] Flow 중간연산자 정리
flow의 중간연산자는 flow에 대한 변환을 수행하며, 그 결과로 새로운 flow를 반환한다. 이러한 중간연산자들은 종단 연산자가 호출될 때까지 실제 작업을 수행하지 않는 지연(lazy)특성을 가지고 있다. 지연(lazy)이란? 실제 데이터가 수집되기 시작할 때까지 주간 연산자의 작업이 실행되지 않는 것을 말한다. val flow = flowOf(1, 2, 3).map {it * 2} flow.collect { println(it) } 예를들어 1,2,3 값을 가지고 있는 스트림에 대해 map 연산자를 통해 변환한다고 가정한다. 위 코드에서 map함수는 종단 연산자인 collect()함수가 호출될 떄까지 아무런 동작도 하지 않는다. 이렇게 지연 작업을 통해 계산을 미룸으로써 리소스 사용량을 최적화한다...
2024.04.21 -
[Android A..Z] Flow onXXX연산자 예외처리 정리
onEach : 각 아이템 마다 무언가 할 때 fetchBoardDetailItemUseCase(id) .onStart { _boardDetailUiState.update { it.copy( isLoading = true, items = listOf() ) } }.onEach { Log.d(TAG, "Item ${it.toString()}") } Flow에서 아이템을 방출할 때 마다 실행하도록 할 수 있다. 업스트림에서 흘러나오는 값을 그대로 내보낸다. onStart : 시작할 때 fetchBoardDetailItemUseCase(id) .onStart { _boardDetailUiState.update { it.copy( isLoading = true, items = listOf() ) } } onSt..
2024.04.21 -
[Android A..Z] Flow collect vs collectLatest
https://kotlinworld.com/252 너무 잘 정리되어 있는 글을 바탕으로 이해하기 쉽게 요약한다. Collect 데이터를 수집하는데, suspend fun 수행이 끝나면 다음 suspend fun을 수행한다 즉 아래 코드를 보면 collect 시점에서 해당 스코프가 끝이나면 다시 수집하는 형식 값 하나를 print 하는데 1초가 걸리고 총 10초가 걸려서 값이 찍힌다. val flow = flow { for (i in 0..10) { emit(i) delay(100L) } } init { viewModelScope.launch { flow.collect { println("!!!방출된 값 $it") delay(1000L) } } } CollectLatest collectLatest는 항상 ..
2024.03.30 -
[Android A..Z] Flow StateFlow vs SharedFlow 비교
개요 프로젝트에서 StateFlow와 SharedFlow를 사용하면서 차이점을 블로그에 정리합니다. StateFlow StateFlow는 상태 플로우라는 뜻입니다. 문자 그대로 현재 상태를 표현하기 적합한 flow입니다. StateFlow는 초기값이 필요합니다. 따라서 생성자에 반드시 초기값을 명시해야하며 null에 대한 위험성이 없습니다. StateFlow에 값을 전달할 때는 flow의 기본 함수인 emit()을 사용해도 되고 value 속성을 사용할 수도 있습니다. private val _stateFlow = MutableStateFlow(99) //초기값을 99로 설정 val stateFlow = _stateFlow _stateFlow.value = 1 _stateFlow.emit(1) privat..
2024.03.30 -
[A..Z] Kotlin Flow vs StateFlow hot? cold? 스트림 쉽게 알아보기
서론 LiveData가 클린 아키텍처적으로 Android 의존성을 띄기 때문에 domain layer에서 사용하기 부적합하는 등의 이유로 Flow를 대체적으로 많이 사용하고 있다. 여러모로 flow를 사용하면서 많은 레퍼런스도 참고 했지만 안드로이드에서 적용할 때 많이 아쉬운 부분이 있어서 flow 적용기를 남겨두려고한다. 이 글에서는 먼저 hot stream 과 cold stream의 차이를 알아보겠습니다. 본론 Cold Stream과 Hot Stream의 차이점은 3가지로 말할 수 있습니다. 1. 데이터가 생성되는 위치 2. 생산자가 발행한 데이터를 동시에 여러 소비자들이 수신할 수 있는지 여부 3. 스트림이 데이터를 생산하는 시점 Cold Stream(Flow) 1. 데이터가 생성되는 위치 Flow..
2023.11.29 -
[Android A..Z] DI Dependency Injection 한 방에 끝내기
Denpendency Injection(DI)는 개발을 하면 한 번쯤은 들어보고 무엇인지 찾아보게 되는 개념입니다. 안드로이드를 개발하면서 공부한 DI 개념을 정리하도록 하겠습니다. 1. Dependency Injection(DI) 1-1 Dependency Dependency는 의존성이라는 뜻입니다. 개발에서의 의존성은 하나의 클래스가 다른 하나의 클래스에 의존하는 것을 의미합니다. A 클래스가 B 객체를 만드려면 어떻게 할까요? class A { val B = B() } 이런식으로 만드는 방법이 있습니다. 이렇게 되면 B는 A의 의존의 대상이 됩니다. B()라는 클래스가 다음과 같이 바뀐다면 어떻게 될까요? class B(context: Context) { } A클래스에서는 B클래스를 객체화 하기 ..
2022.10.20 -
[Kotlin Flow] 예제를 활용해 쉽게 Flow에 대한 개념 익히기 -1-
개념 Coroutine에서 Flow는 suspend func(정지 함수)와는 다르게 여러 값을 순차적으로 내보낼 수 있는 유형입니다. 이렇게 말하면 어떤말인지 잘 모를 수 있습니다.(저도 그랬거든요..ㅎㅎ) 간단한 예를 보겠습니다. Coroutine suspend Function val intList = ArrayList() val job1 = lifecycleScope.launch { (1..99).forEach { intList.add(it) delay(10L) } } lifecycleScope.launch { job1.join() intList.forEach { Log.d("TAG", it.toString()) } } // result 빌드 후 약 1초 후에 모든 값이 한 번에 찍힙니다. 위 코드를..
2022.07.29 -
[Android A..Z] Asynchronous 비동기란?
동기?비동기? 사실 비동기를 알기 전에 동기의 개념붙 알아야 한다. 프로그래밍에서의 동기란, 한 번에 하나의 작업만 진행하는 것을 의미한다. 프로그램이 지금부터 수행해야 할 여러 개의 작업이 있다고 치자. 동기적 작업 방식은 한 직업이 끝나기 전까지 다른 작업을 할 수 없다. 위 그림의 1번 작업이 끝나고 나서야 2번 작업을 시작할 수 있다. Ex) 점원이 1명인 카페가 있다. 이 때 손님 세 명이 아서 주문을 한다. 만약 점원이 동기적 방식으로 일한다면, 하나의 주문을 받았을 때 음료수를 만들기 시작해서, 완성 후 손님에게 전달하기 전까지는 다른 주문을 받을 수 없다. 안타깝게도 첫 주문자가 되지 못한 두명의 손님은 카운터에서 계속 기다려야한다. 그러나 점원이 비동기적으로 작업을 했다면 상황은 달라질 ..
2021.11.22 -
[Android A..Z] Clean Architecture
Clean Architecture란? 고객들에게 제공하는 어플리케이션 같은 경우에는 수많은 기능들이 있기에 복잡도가 굉장히 높다. 복잡도가 높은 어플리케이션을 개발할 때 어떻게 하면 유지 보수 하기 쉽고 고품질의 코드를 작성할 수 있을까? 어플리케이션은 새로운 기능이 추가된다거나 내부 로직이 변경되어야 하는일이 생겼을 때 유연하게 대처할 수 있도록 구조화 해야한다. 클린 아키텍처의 개념은 2012년에 Uncle Bob님이 블로그에 기재하며 세상에 나오게 되었다. 클린 아키텍처의 목표는 계층을 분리하여 관심사를 분리하는 것이다. 이게 무슨 의미가 있을까? 예를 들어 안드로이드 로컬 DB를 기존에 Realm을 사용하고 있다. Realm으로 수많은 기능을 구현하고 이미 제품까지 나와 있는 상황이다. 그런데 갑..
2021.11.21