Kotlin Flow 을 알아보자

Assist·2023년 7월 24일
0

Android

목록 보기
5/24

Flow 란 ?

suspend 로 작업하는 함수 즉 비동기적 함수에서 함수가 끝나면 단일 값만 받게 됩니다.

??? : 난 단일 값만 받아도 상관 없는데 ?

이러시면 오른쪽 위에 x 버튼 눌러서 나가시면 됩니다.

Flow 은 이 비동기적으로 끝나는 함수에서 중간중간 갱신되는 값까지 받을수 있도록 설계된 라이브러리 입니다.

Flow 은 Collect으로 값을 요청하지 않으면 값을 방출 하지 않습니다.

Flow vs LiveData

그럼 Flow 와 LiveData은 뭐가 다른가

  • Flow은 Corountine Scope 에서 동작하지만 viewLifeCycle에 적용하면 해당 view 에 맞게 생명주기를 맞출수 있습니다.
  • 다양한 연산자가 있습니다.
  • Flow 은 Kotlin 에 포함된 라이브러리 이여서 안드로이드 의존성 제거 가능 합니다.

이정도 인거 같습니다.

왜 Flow 인가 ?

Android 에서 MVVM 패턴 을 사용할떄 데이터를 수집할떄 Repository 패턴을 사용합니다 .
다만 Repository 에서 비동기 적으로 data 을 return 을 해야할때 LiveData 을 사용해야 할것입니다.
이떄 공식 문서에서는 LiveData은 Presentation 레이에 보관 되어야 한다 입니다 .

LiveData view에 맞춰서 생명주기가 관리 대기 때문에 Repository에 넘기면 그다음 부터는 생명주기가 어떨지 몰라 잘 구성해야 합니다.

그래서 개발자들이 생각한게

  • Repository 에서는 Flow
  • viewModel 은 LiveData
  • view은 ViewModel 의 LiveData 을 관찰

이런식으로 설계하는걸 추천하고 있습니다.

그럼 Flow 을 사용해보자

  • 가정하겠습니다
  • 해당 코드는 MVVM 패턴으로 짜여졌다고 가정하겠습니다 .
  • Room Database 을 사용하고 있다고 가정하겠습니다.
@Dao 
interface RoomDatabaseDao() {
	 ~~~ 
    @Query("SELECT * FROM velogData)
    fun getVelogPost() : Flow<List<Velog>>
}

RoomDatabase 에 데이터를 가져오는것을 Flow 로 Retrun 해줍니다.

interface VelogRepository { 
	fun getVelogData() : Flow<List<Velog>> 

Repository 의 getVelogData 의 반환 타입을 Flow 로 해줍니다 .

그럼 구현체로 가보겠습니다.


class VelogReposityoryImpl(private val database : RoomDatabas()){

	override fun getVelogData() : Flow<List<Velog>> {
    return database.RoomDatabaseDao().getVelogPost() 
    
    }

이런식으로 Repository 의 구현체에서 return Flow을 해줍니다.
그럼 연결되있는 viewModel 로 가보겟습니다.

class MainViewModel ( ) : ViewModel () { 

	val velogFlow : Flow<List<velog>> = VelogRepositoryImpl.getVelogData()
    

자 그럼 view로 가서 Flow로 view을 변경해 봅시다.

class MyVelogPostFragment : Fragment() 
	
    override fun onCreateView() {
     ~~~
     }
     override fun onViewCreate() { 
     	lifecycleScope.launch { 
        	MaiNViewModel.velogFlow.collectLatest{ 
            	Log.d("TAG" , "$it" )
                
     }           

이런식으로 사용하면 되겠습니다.

profile
안드로이드만 좋아하는 특이한 개발자

0개의 댓글

관련 채용 정보