회사에서 제공해주는 인프런 강의를 통해 Android Jetpack 강의를 듣게 됐습니다.
프로젝트를 진행하며 안드로이드의 다양한 기술을 공부하고 적용해봤지만 강의를 집중적으로 들어본 경험은 없었습니다.
강의를 통해 내가 잘못 알고 있었던 개념을 바로잡고 처음 접해보는 개념을 공부할 수 있어서 값진 시간을 보내고 있습니다.
map과 switchMap은 LiveData를 더욱 유연하게 사용할 수 있도록 도와주는
Transformation 라이브러리에서 제공하는 메서드입니다.
두 메서드를 통해 특정 LiveData를 관찰하여 개발자가 원하는 대로 데이터를 가공하여 다른 타입의 LiveData를 만들 수 있습니다.
두 메서드가 LiveData<X> 를 LiveData<Y> 로 변환
하는 기능이란 공통점이 있지만, 차이점 또한 존재합니다.
이번 글에서는 차이점을 중심으로 이야기하려 합니다.
LiveData<Y> map(LiveData<X> source, Function<X, Y> func)
LiveData<Y> switchMap(LiveData<X> source, Function<X, LiveData<Y>> func)
두번째 매개변수인 func은 Observe 된 LiveData<X>를 LiveData<Y>로 변환
하는 함수입니다.
이 매개변수를 자세히 보면 map은 Y 타입의 객체를 리턴
하고, swtichMap은 LiveData<Y> 객체를 리턴
합니다.
private val _originalWord: MutableLiveData<String> = MutableLiveData()
val originalWord: LiveData<String> get() = _originalWord
위의 originalWord를 변환하고자 하는 LiveData라고 하면,
val shuffledWord1: LiveData<String> = Transformations.map(_originalWord) {
shuffle(it)
}
val shuffledWord2: LiveData<String> = Transformations.switchMap(_originalWord) {
MutableLiveData<String>(shuffle(it))
}
private fun shuffle(word: String): String {
val words = word.toCharArray()
words.shuffle()
return String(words)
}
map 메서드를 사용하여 변환하는 shuffledWord1의 경우 shuffle 함수를 통해 리턴된 String 형태의 데이터를 바로 반환하는 것을 확인할 수 있습니다.
switchMap 메서드를 사용하여 변환하는 shuffledWord2의 경우 리턴된 String 형태의 데이터를 LiveData 형태로 한번 더 변환 후 반환하는 것을 확인할 수 있습니다.
(MutableLiveData 클래스는 LiveData 클래스를 상속 받은 클래스입니다.)
map 메서드의 경우 LiveData를 간단히 가공만 하면 될 때 사용합니다.
Ex1) 날짜 포맷 변경.
Ex2) 사칙연산.
Ex3) 시<->분, 분<->초, 시<->초 변경.
switchMap 메서드의 경우 즉각적으로 변경되지 않더라도 이후 사용할 수 있는 데이터로 가공할 때 사용합니다.
즉, 데이터 가공에 시간이 걸리는 데이터일 경우 사용합니다.
Ex1) Observing 한 LiveData를 활용하여 다른 API를 호출하는 경우.
Ex2) Observing 한 LiveData를 통해 Room DB에 접근하여 데이터를 조회하는 경우.
Ex3) Observing 한 LiveData를 일정 시간이 지난 후 가공해야 하는 경우.
LiveData 를 Observing 하고 재가공하여 데이터를 바인딩하는 상황이 종종 있었음에도 불구하고 두 기능을 알지 못했다는 것이 부끄럽습니다.
그럼에도 불구하고 지금이라도 알게 되어 참 다행입니다.
현재 진행 중인 프로젝트의 기능 개발이 끝난 후 전체적으로 리팩토링을 진행하려고 계획하고 있습니다.
리팩토링을 진행하며 두 기능을 유용하게 사용해 보려고 합니다 !