[Jetpack Compose] Side Effects

mi-fasol·2023년 1월 19일
0

Compose

목록 보기
5/6

해당 게시물은 과거에 작성한 블로그 내용을 옮겨 온 것으로, 가독성이 떨어지고 내용이 부정확할 수 있습니다.

Side-Effect의 개념

  • 한국말로 부수 효과를 의미
  • Composable 외부에서 발생하는 앱 상태(State)에 대한 변경
  • Composable은 Side-Effect에 Free 해야 하는 특성을 가짐
  • Composable은 각자 생명주기를 가지고 있고, 단방향으로 State를 전달
  • Composable 외부의 상태에 대해 변경을 주면 양방향 의존성이 생겨 Side-Effect 발생

Side-Effect의 종류

  • LaunchedEffect
    • Composable의 범위에서 suspend 함수를 안전하게 실행
    • LaunchedEffect는 Composable 함수
    • LaunchedEffect가 Composition에 들어오면 인자로 전달된 coroutine 코드 블록 실행
    • LaunchedEffect가 Composition에 없어지면 취소
    • LaunchedEffect를 새로 실행하려면 key를 다른 key로 구성
  • SideEffect
    • Compose에 의하여 관리되지 않는 객체가 있는 Compose의 상태를 공유
    • 매 Recomposition마다 성공적으로 호출되는 Side-Effect 사용
  • DisposableEffect
    • Side-Effect의 key 변화 이후에 Composition에서 Composable이 없어져 정리가 필요할 때 사용
    • DisposableEffect의 key 변경 시 Composable이 현재의 효과를 없애고 효과를 다시 호출하여 설정
    • 코드 블럭의 마지막에 반드시 onDispose를 포함
  • rememberCoroutineScope
    • Composable의 외부에서 coroutine의 실행을 위한 Composition 인식 범위 확보
    • Composition이 종료되고 자동으로 취소되는 범위 지정
    • remeberCoroutineScope가 호출된 Composition 시점에 바인딩되어 CoroutineScope 반환
    • 호출이 Composition 종료 시 범위 종료
    • 특정한 상황에서 coroutine으로 특정 동작 실행 시 유용
  • produceState
    • Compose 상태가 아닌 것을 Compose 상태로 변환
    • 외부 구독 기반 상태를 Compositino으로 변환
    • productState가 composition으로 들어오면 producer가 실행
    • productState가 Composition에서 사라지면 취소
    • 상태를 반환
    • 같은 value를 가지고 있으면 Recomposition 미발생
    • produceState가 coroutine을 생성해도 non-suspending인 데이터 소스를 관찰 시 유용
    • producer 블록에서 value 갱신 시 상태를 새 값으로 변경
  • rememberUpdateState
    • 값의 변경 발생 시 재시작되면 안 되는 효과의 값을 참조
    • original data를 가져오는 경우에 사용
    • 재생성 혹은 재시작 시 비용이 비싸거나 금지되는 오래 남은 작업을 포함하는 effect에 유용
  • deriveStateOf
    • 다른 상태 객체로부터 계산 혹은 파생된 상태 포함 시 사용
    • 계산에 사용된 상태 중 한 상태가 변경될 때마다 계산을 다시 수행
    • Recomposition이 발생할 때마다 실행되면 비용이 비싸지므로 deriveStateOf 사용
  • snapshotFlow
    • State< T >를 cold Flow로 변환
    • collect 시 snapshotFlow 블록 실행 후 읽은 상태 결과를 collect에 방출
    • 블록 내에서 읽어온 값 중 하나가 변경되면 새로운 값이 이전의 값과 동일하지 않을 때 새 값을 방출
    • Flow 연산자 활용 가능
profile
정위블

0개의 댓글