티스토리 뷰
본 포스팅은 과거에 안드로이드 프로그래밍을 공부하며 정리했던 내용입니다. 개인적으로 참고하기 위해 올려놓은 내용이고, 더 이상 안드로이드 프로그래밍을 진행하지 않아 부정확한 내용이 있을 수 있습니다.
1. MVVM(Model-View-ViewModel) 패턴
[ MVVM(Model-View-ViewModel) 패턴이란? ]
MVVM은 Model-View-ViewModel의 약자로, 각각은 아래와 같은 역할을 담당하며 이를 도식으로 나타내면 아래의 그림과 같다.
- Model: UI에 표시될 데이터와 상태 그리고 비지니스 로직을 담당한다.
- View: 화면에 표현되는 UI를 의미한다.
- ViewModel: 이벤트 처리나 Model과의 인터랙션 등을 담당한다.
MVVM에서 가장 중요한 핵심은 DataBinding 기술이다. DataBinding을 이용함으로써 View는 ViewModel을 Observing하고 있다가, Model의 데이터가 변경되면 ViewModel로부터 알림을 받아 화면을 갱신하게 된다. 이러한 구조를 통해 ViewModel은 View의 존재를 모르게 되어 의존성을 낮출 수 있고, 유지보수성을 높일 수 있게 된다. 이러한 MVVM 아키텍쳐 패턴은 Android에서 LiveData와 RxJava 등을 통해 구현할 수 있다.
2. RxJava란?
[ RxJava란? ]
Java는 객체 지향(Object-Oriented)의 프로그래밍 언어이다. 그렇기 때문에 객체 지향이 아닌 다른 프로그래밍을 하기 위해서는 별도의 도구가 필요하다. RxJava는 Java를 이용해 Reactive Programming을 할 수 있도록 도와주는 라이브러리로, 리액티브 프로그래밍(Reactive Programming) 역시 함수형 프로그래밍의 일종이다.
Reactive Programming이란 데이터의 흐름과 전달을 중심으로 하는 프로그래밍 패러다임으로, 프로그래머가 코드상으로 입력한 절차에 따라 순서대로 동작하는 명령형 프로그래밍과는 달리 데이터의 흐름을 먼저 작성하고 데이터의 흐름에서 발생하는 다양한 이벤트에 따라 수식이나 함수가 실행되는 방식이다. 그리고 이러한 프로그래밍 패러다임은 Model이나 UI의 이벤트에 따라 View를 자동으로 업데이트하기 위해 안드로이드 프로그래밍에서 주목받게 되었다.
import io.reactivex.Observable;
public class HelloRxJava {
public void emit(){
Observable.just("hello", "rxjava2!!")
.subscribe(System.out::println);
}
public static void main(String[] args) {
HelloRxJava helloRxJava = new HelloRxJava();
helloRxJava.emit();
}
}
[ RxJava의 특징 ]
RxJava는 넷플릭스 개발팀에 의해 만들어진 라이브러리로, 다음과 같은 이유로 만들었다고 한다.
- 동시성을 적극적으로 활용하기 위해
- Java의 Future를 조합하기 어렵다는 점을 해결하기 위해
- Callback 방식의 문제를 해결하기 위해
RxJava는 다양한 요청을 비동기로 생성하고 모든 값을 취합하여 최종 리턴하는 방식으로 진행되는데, 리액티브 연산자를 통해 비동기의 흐름을 조합할 수 있는 방법을 제공하며, Callback을 사용하지 않는 방향으로 설계되었다.
[ RxJava의 핵심 API ]
RxJava에는 2가지 핵심 API가 존재하는데, 해당 내용들에 대해 자세히 살펴보도록 하자.
1. Observable
Observable은 데이터의 흐름에 맞게 알림을 보내 구독자가 데이터를 처리할 수 있도록 합니다. Observable은 동기적, 비동기적으로 모두 작동가능하고 아래와 같은 3가지의 알림을 구독자에게 전달한다.
- onNext: 데이터의 발행을 알린다.
-
onComplete: 모든 데이터의 발행이 완료되었음을 알린다. 이후에 모든 구독은 끝나게 된다.
-
onError: 데이터의 흐름 중에 에러가 발생하였음을 알린다. 이후에 Observable 동작이 끝난다.
이러한 Observable에는 다양한 함수들이 있다.
- Just
- 기존에 존재하는 자료구조를 사용하여 데이터를 발행하는 함수로, 인자로 넣은 데이터를 차례로 발행하는 Observable을 생성한다.
- 타입이 같은 데이터를 최소 1개부터 최대 10개까지 넣을 수 있다.
- Subscribe
- 데이터의 흐름을 구독하는 함수
- 위에서 얘기한 onNext, onComplete, onError에 대한 리스너를 설정하고, 데이터의 흐름에서 일어나는 3개의 이벤트에 대한 로직을 실행하도록 만든다.
- unsubscribe(): Fragment나 Activity에서 생명주기를 처리하던 Subscribe()를 중지하기 위해서는 이벤트를 만드는 Observable들을 모두 취소해야한다. 그렇지 않으면 Memory Leak이 생길 수 있다.
- Disposable
- Subscribe()는 모두 Disposable Interface 객체를 반환하며, 이를 통해 데이터의 흐름을 중단할 수 있다.
- Observable에서 onComplete가 실행되면 자동으로 dispose()를 호출하여 구동을 종료시킨다.
- subscribeOn, observeOn
- subscribeOn(): observable의 작업을 시작하는 쓰레드를 선택
- observeOn(): 이후에 나오는 Operator로, Subscribe()의 Scheduler를 변경할 수 있다.
2. Single
Observable은 0~N개의 Item을 전파할 수 있는 작업 흐름이다. 하지만 작업이 종료되고, 1개의 Item 만을 전파하는 경우에는 Single을 사용하는데 (복잡하지 않은) 대부분의 작업을 처리하는 경우 ex) dao 등을 통해 데이터를 비동기로 불러오고자 하는 경우에 적절하다. Single은 Observable과는 다르게 onSuccess(item)과 onError(throwable) 만을 가진다.
참고 자료
- https://medium.com/@joongwon/android-aac%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-mvvm-%ED%8C%A8%ED%84%B4-e24a685fc25d
- https://medium.com/@jsuch2362/android-%EC%97%90%EC%84%9C-mvvm-%EC%9C%BC%EB%A1%9C-%EA%B8%B4-%EC%97%AC%EC%A0%95%EC%9D%84-82494151f312
- https://academy.realm.io/kr/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/
- http://penguin-story.tistory.com/10?category=661121
- https://academy.realm.io/kr/posts/mobilization-hugo-visser-rxjava-for-rest-of-us/
- https://altongmon.tistory.com/754?category=836621
- http://gaemi.github.io/rxjava/2016/12/02/async-task-with-rxjava.html
'나의 공부방' 카테고리의 다른 글
[Hadoop] YARN의 구조와 동작 방식 (6) | 2021.02.02 |
---|---|
[Frontend] VueJS 프로젝트 생성 및 설정하기 (0) | 2021.02.01 |
[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란? (32) | 2021.01.22 |
[XML] CDATA란 무엇인가? (0) | 2021.01.20 |
[OS] 세마포어(Semaphore) vs 뮤텍스(Mutex) 차이 (0) | 2020.11.07 |