Compose 수명주기 Android Developer 공식문서
=>https://developer.android.com/jetpack/compose/lifecycle?hl=ko
[기본용어]
-컴포저블 : 컴포저블 함수에서 사용되는 어노테이션의 이름이자 jetpack compose를 구성하는 함수의 이름이다. 선언형 UI를 구서하기 위한 기본 단위이자 최소 단위이다.
-컴포지션 : 컴포저블 함수가 화면에 그려지기 위한 전체의 과정을 전체적으로 말하기도 하고 리컴포지션과 비교되어 제일 처음 1회 그려지는 과정을 컴포지션이라고 말하기도 한다. Jeptack compose는 컴포지블을 실행해서 컴포지션을 만든다. 또한, 컴포지션은 최초의 컴포저블의 실행을 통해서만 생성되며, 최초 실행 후 JetpackCompose가 추적하는 composable의 parameter의 변경으로 인한 Recomposition을 통해서만 컴포지션을 수정 할 수 있다.
-리컴포지션 : 컴포저블에 입력되는 상태값이 바뀔때에는 컴포지션을 수정하여 화면에 표시되어 있는 내용을 바꿀 필요가 있는데 이때 화면을 고치는 동작을 리컴포지션이라고 한다. JetpackCompose는 최초의 컴포지션 실행 할 때 실행한 컴포저블을 추적하고 있다가 parameter가 변경되면 해당 컴포저블을 재실행시켜서 변경사항을 반영하는 리컴포지션 과정을 실행한다.
[생명주기]
-Compose의 생명주기는 Composition과 Disposal 이 두 단계로 구별된다.
-참고 : [Recomposition] : 컴포지션 함수에서 받아오는 데이터[State[T]]가 변경될 때 변경된 데이터에 해당하는 함수만 재호출하여 UI의 일부분만 업데이트하는 방식을 말한다. 기존에는 뷰가 다시 그려질 때 전체 뷰가 다시 그려졌는데 이제는 변경된 데이터에 해당하는 일부분의 뷰만 그려지면 된다는 장점이 있기 때문에 앱의 성능 향상에 아주 큰 도움이 된다. + 부모 컴포저블이 리컴포지션 되면 자식 컴포저블도 리컴포지션 된다.(단, 부모 컴포저블의 상태 변경이 자식 컴포저블의 상태 변경에도 영향을 미칠때)
[컴포저블의 생명주기 구별방법]
-1. 다른 composable 객체는 각각 다른 자신만의 생명주기를 가진다.
-2. 코드상의 호출 위치[CallSite]에 의한 구분에 따라서 각각 다른 자신만의 생명주기를 가진다.
Compose Compiler는 각각의 호출사이트를 개별적으로 생각해서 호출 사이트가 다르면 컴포지션이 각기 다른 컴포지션이 되는거야.
리컴포지션이 될 때 JetpackCompose는 이전에 호출했던 컴포저블을 알 수 있는데 만약에 컴포지션을 했었던 컴포저블이라면 "컴포저블이 받던 parameter가 변경되지 않았다면" 리컴포지션이 되지 않는다. 즉, 아래 코드에서 LoginError()가 호출 될 때 LoginInput()은 이미 컴포지션 된 적이 있는데 parameter도 변경되지 않았으므로 JetpackCompose는 이걸 인식해서 리컴포지션 하지 않는다. (+ cf : parameter가 있다면 콜사이트가 동일하고 / 모든 인자들이 stable하고 / equal 비교시 동일한 값이라면 리컴포지션은 생략된다.)
-3. 콜사이트가 갖더라도 반복문에 따라서 컴포저블이 실행된다면 1번,2번,,, 이런식으로 각각 다른 자신만의 생명주기를 가진다.
-아래 사진처럼 key 값을 부여하면 JetpackCompose에서 개별 composable을 구별 할 수 있어서 변경되지 않은 기존의 컴포저블 인스턴스들을 리컴포지션 할 필요가 없다.