StateFlow & SharedFlow StateFlow 와 SharedFlow 는 다수의 소비자에게 상태 및 값을 방출하는게 가능하도록 최적화된 Flow 이다. Flow 와 StateFlow & SharedFlow 에 cold flow, hot flow 라는 얘기가 자주 나오는데 무슨 뜻일까? Cold & Hot Flow 그냥 Flow 는 cold Flow 이다. 소비자가 활성화되어 있지 않으면 방출도 중지된다. 소비자와 생산자가 1 대 1 관계이다. StateFlow 와 SharedFlow 는 Hot Flow 이다. 소비자랑 상관 없이 참조가 존재하는 한 메모리에 남아서 방출한다. 다수의 소비자가 가능하다. StateFlow state-holder 로 observable flow 이다. 현재 상태 ..
전체 글
우아한테크코스에서 flow 를 배우지 않는다는 소식에 혼자 독학하는 flow deep dive! 시작! https://developer.android.com/kotlin/flow Android의 Kotlin 흐름 | Android Developers Android의 Kotlin 흐름 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 코루틴에서 흐름은 단일 값만 반환하는 정지 함수와 달리 여러 값을 순차적으로 내보낼 developer.android.com Flow 란? Coroutine flow 는 단일 값만 반환하는 suspend function 과 다르게 여러 값을 순차적으로 내보낼 수 있는 type 이다. 예를 들어 이 flow 를 사용하면 데이터베이스의 업데이트를 실시간..
책 요약 및 리뷰 리뷰는 개인적인 생각 및 의견으로 파란색으로 남기겠습니다. 들어가기 전에 코드 작성의 목적은 문제 해결이다. 우리는 보통 상위 수준의 문제를 하위 수준의 문제들로 나누어 해결한다. 하위 수준의 문제를 해결하는 방법도 중요하지만 그 코드를 어떻게 구성하는가도 중요하다. 코드를 구성하는 방법은 코드 품질의 기본적인 측면 중 하나이다. 코드를 잘 구성한다는 것은 간결한 추상화 계층을 만드는 것으로 귀결된다. 문제를 추상화 계층으로 나누고 어떻게 코드를 구성하는지, 그 효과로 가독성, 모듈성, 재사용성, 일반화성, 테스트 용이성이 개선되는지 확인해보자. -> 이 책에서는 계속해서 가독성, 모듈성, 재사용성, 일반화성, 테스트 용이성을 강조하고 있다. 좋은 코드를 만들기 위해서는 개발자가 유념해..
현재 프로젝트에 적용 중인 로깅 방식을 공유하려고 한다! 로깅 전략 의 필요성 로깅 전략은 어떤 로그를 어떤 방식으로 남길지, 로그를 얼마나 관리할 지 등이다. 그럼 애플리케이션에 어떤 로깅 전략이 필요할까? 아래는 가장 중요하다고 생각하는 두 가지 이다. 1. Error 로깅 네트워크 통신하는 부분에서 왜 Failure 하는지, Exception 이 어디서 어떻게 발생하는지 Message 는 무엇인지 로깅하고 싶을 수 있다. 오류가 반복된다면 fix 가 필요할 것이다. 2. 비즈니스와 연결 사용자가 어떤 flow 로 앱을 이용하는지 어떤 화면에 오래 체류하는지 체크해서 비즈니스와 연결 지어 이용할 수 있다. 로깅의 범위나 방향은 앱마다 다르다. 즉, 어떤 로깅 전략을 세울 지 앱 바 앱 이고 팀 바 팀..
다시 돌아온 코루틴! 그럼 바로 문제부터 시작해볼까요? 문제1 다음 코드는 언제 끝날까요? fun main() = runBlocking { val job = launch { while (true) { println("While in ${Thread.currentThread().name}") } } } 정답 이 코드는 안끝납니다! launch 스코프로 실행하고 runBlocking 이 끝날 때 까지 기다리기 때문에 무한루프를 타게 됩니다. 문제 2 그럼 이 녀석은 언제 끝날까요? fun main() = runBlocking { val job = launch { while (true) { println("While in ${Thread.currentThread().name}") } } println("종료"..
이전에 Presenter 테스트 작성으로 테스트의 중요성을 알아봤다. https://seonghoonc.tistory.com/20 Presenter 테스트 작성하기 (안드로이드 MVP) : [우아한테크코스 5기 AN_베르] 들어가기 전에 이 글은 MVP 패턴 적용이나 단위 테스트에 대한 경험이 없다면 이해하는데 어려움이 있을 수 있습니다. 테스트가 필요한가? 장바구니 주문 미션 2단계 제출할 때까지 Presenter 테스 seonghoonc.tistory.com 또한 MVP 를 MVVM으로 리팩터링하는 과정도 거쳤다. https://seonghoonc.tistory.com/21 [안드로이드] MVP 패턴 MVVM 패턴으로 리팩터링하기 MVP 패턴으로 작성한 단순한 화면을 MVVM 패턴으로 바꿔보자! + ..
사용이 목적이라면 쉽지만 이해하긴 어려운 코루틴을 공부해보자 킹갓 제이슨은 말씀하셨다. 어떻게 코어를 효율적이고 효과적으로 사용할 것인가?코어나 프로세서가 추가됨에 따라 실행시간이 항상 빨라지는가? 코루틴 학습을 통해 이해해보도록 하자. 학습 로드맵Philipp Lackner 의 KOTLIN COROUTINEShttps://www.youtube.com/playlist?list=PLQkwcJG4YTCQcFEPuYGuv54nYai_lwil_ Android Kotlin 코루틴https://developer.android.com/kotlin/coroutines?hl=ko Kotlin Docs 코루틴https://kotlinlang.org/docs/coroutines-overview.html 용어 정리- 프..
MVP 패턴으로 작성한 단순한 화면을 MVVM 패턴으로 바꿔보자! + 버튼을 누르면 1씩 증가하고 - 버튼을 누르면 1씩 감소하는 단순한 앱을 만들어보자. 먼저 xml 파일을 작성해서 화면을 그렸다. MVP 패턴 Counter 작성 먼저 도메인 Model 부터 만들어 보자 count 를 프로퍼티로 가지며 add 나 sub 를 호출할 경우 현재 count 를 return 한다. class Counter { private var count = 0 fun add(): Int { return ++count } fun sub(): Int { return --count } } MainContract 작성 MVP 패턴은 View 와 Presenter 의 1대1 계약과 비슷하다. 그러니 Contract interfac..
들어가기 전에 이 글은 MVP 패턴 적용이나 단위 테스트에 대한 경험이 없다면 이해하는데 어려움이 있을 수 있습니다. 테스트가 필요한가? 장바구니 주문 미션 2단계 제출할 때까지 Presenter 테스트 의 필요성을 인지하지 못했다. 리팩터링 할 때마다 테스트 리팩터링이 계속해서 필요했다. 또한, 기능을 다 구현했는데 하나하나 테스트를 짜야한다는 것이 그저 숙제로 느껴졌다. 시간이 부족하다는 이유로 기존에 작성했던 테스트를 전부 주석 처리하고 제출하는 만행을 저질렀다. 리뷰어님이 다음과 같은 메세지 를 남겨주셨다. 도메인 관련 클래스를 잘 분리하고 테스트 코드까지 잘 작성해주셨습니다. 다만 안드로이드와 관련된 코드들은 테스트가 작성되지 않은게 아쉬웠습니다. 그러자 내가 테스트를 잘 못짜서 필요성을 인지하..
Fragment 인스턴스는 자체 생명 주기를 갖는다! 사용자가 앱을 탐색하고 상호 작용할 때 프래그먼트는 add, remove, 되고 화면으로 들어가거나 나갈 때 수명 주기가 전환된다. 생명 주기를 관리하기 위해 Fragment 는 LifecycleOwner 를 구현한다. 이 오브젝트를 통해 getLifecycle() 메서드로 접근 가능하다. Fragment 생명 주기 은 다음과 같이 enum 으로 구성된다. 1. INITIALIZED 2. CREATED 3. STARTED 4. RESUMED 5. DESTROYED Fragment 생명주기 콜백함수와 Fragment 생명주기는 다르다. 1. onAttach() 및 onDetach() 프래그먼트가 인스턴스화 되면 INITIALIZED 상태에서 시작. 프래..