# Orbit MVI - (2) <이전 글> https://www.wanted.co.kr/community/post/101888?utm_source=wanted&utm_medium=share 이번 글에서는 Orbit MVI 구조 및 라이브러리 사용법 대해서 알아보겠습니다. ## Orbit MVI 기본 구조 https://orbit-mvi.org/assets/images/orbit-overview-2-d7831b9ed034b5df0ffad9db17c3bb56.svg 1. UI는 ContainerHost 인터페이스를 구현한 클래스에서 함수를 호출하며, 일반적으로 Android에서는 Activity, Fragment 또는 간단한 뷰일 수도 있습니다. Orbit은 시스템 UI 없이도 실행할 수 있으며, 백그라운드 서비스로 실행할 수 있습니다. 2. 함수는 인텐트 블록을 통해 컨테이너 인스턴스로 전달이 되며, Side Effect 및 Reductions를 백그라운드 코루틴으로 떠넘깁니다. 3. “intent” 블록에 선언된 사용자 정의 비즈니스 로직을 통해 Transformer(변환)를 수행됩니다. 4. “reduce” 연산자는 현재 시스템 상태를 입력 이벤트와 함께 사용되어서 새로운 상태를 생성합니다. 5. 새로운 상태는 관찰자한테 전송됩니다. 실제 세계에서는 SideEffect(부수 효과) 없이 시스템이 존재할 수 없습니다. 부수 효과의 예로는 일회성 이벤트로 네비게이션, 로깅, 분석, 토스트등 Orbit Container의 상태를 변경하지 않는 이벤트 이며 Orbit에서는 부수 효과를 다룰 수 있는 연산자가 있습니다. ## 사용법 ### ViewModel - Orbit에서는 ViewModelScope 내에서 컨테이너를 생성을 하고 ViewModel이 클리어될 때 자동으로 컨테이너를 취소 시킵니다. - SavedState 기능도 지원해 줍니다. - ViewModel 에 ContainerHost 를 상속받아서 State와 SideEffect를 템플릿으로 전달해 줍니다. - ContainerHost Interface에 선언된 container를 선언해 줍니다. - container에서는 최초의 view state 를 초기화 해줄 수 있으며, SavedStateHandle를 사용하려면 state 가 “Parcelable” 인터페이스를 구현해야 합니다. - 참고 : https://orbit-mvi.org/Android-ViewModel/overview ### Compose - Orbit MVI에서 Compose에서 쉽게 사용할 수 있게 extension을 제공해 줍니다. - viewModel.collectAsState()를 통해서 상태를 수집할 수 있으며, viewModel.collectSideEffect()를 통해서 부수 효과를 처리할 수 있습니다. - 참고 : https://orbit-mvi.org/Compose/overview ### Core - Orbit Container는 Orbit MVI 시스템의 핵심입니다. 상태를 유지하며 부수 효과 및 상태를 업데이트를 할 수 있습니다. - intent 블록을 통해서 비즈니스 로직을 포함하며, 다른 연산자를 호출할 수 있습니다. - postSideEffect 를 사용하여 일회성 이벤트를 부수 효과 채널로 전송합니다. - reduce 블럭을 사용해서 컨테이너의 상태를 아토믹하게 업데이트합니다. - 참고 : https://orbit-mvi.org/Core/overview#core-operators ## 샘플 간단하게 최대 숫자를 설정해서 랜덤 숫자를 가져올 수 있는 앱을 Orbit MVI 라이브러리를 통해서 만들어봤습니다. 라이브러리를 통해서 쉽게 상태 및 부수 효과를 관리할 수 있었으며, 테스트 코드도 작성하기 수월했습니다. https://github.com/yunjaena/mvi-orbit-sample View에 대한 상태를 안정적이게 관리를 잘 하고 싶으신 분이나, 테스트 코드를 쉽게 작성 해보고 싶은 분들에게 추천해 드리는 라이브러리입니다. ## 공식 문서 https://orbit-mvi.org
로그인 후 모든 글을 볼 수 있습니다.