Android/Jetpack Compose

RecyclerView Compose로 마이그레이션 해보기 (1)

MJ핫산 2023. 9. 25. 19:34

Mash-Up(Android)앱은 처음에는 xml로 개발했지만 새로 추가되는 기능은 Compose를 사용해서 개발하고 있고, 그 과정에서 일부 단순한 화면을 Compose로 변환하는 작업도 틈틈히 진행 중이다.

🗺 작업 계획

이번에 작업하게 된 내용은 “마이페이지 개선”이다.

그런데 이번에는 단순한 화면이 아닌 Full RecyclerView였던 화면을 개선하게 되었고 그 과정에서 ViewHolder가 추가되어야 했다. (새로운 화면은 Compose로 만들고 있음)

그래서 이 참에 새롭게 만들어야하는 "활동카드 ViewHolder"는 우선 Compose로 만들고, 다른 ViewHolder들도 Compose로 하나씩 바꿔 볼 예정이다. 그리고 최종적으로는 마이페이지 전체가 Compose화면이 되는 것이 목표이다.

🤓 Droid Knights - 기존 앱을 Jetpack Compose로 마이그레이션하기

마침 지난 주에 갔던 안드로이드 컨퍼런스 “Droid Knights 2023” 에서 컴포즈 마이그레이션에 대한 세션이 있었다.

xml로 되어있던 앱을 단계적으로 마이그레이션하는 방법을 소개해주셨는데, 그 중에서 RecyclerView를 Compose View로 바꾸는 방법을 아주 상세히 설명해주신 덕분에 방향을 쉽게 잡을 수 있었다.

Step 1. RecyclerView의 각 ViewHolder를 ComposeView로 마이그레이션
Step 2. RecyclerView를 Compose의 리스트 컴포넌트(LazyColumn, LazyRow..)로 마이그레이션

이분의 경험에 따르면 리사이클러뷰의 마이그레이션은 이런 식으로 진행되는데 나는 우선 Step 1의 ViewHolder를 ComposeView로 만드는 작업을 할 예정이다.

 

그런데 여기서 중요한 Point가 나오는데, 바로 ComposeView의 ViewCompositionStrategy(전략)을 잘 설정해줘야 한다는 것..!💡

♟ ViewCompositionStrategy

ViewCompositionStrategy는 Compose의 Composition을 dispose 하는 방법을 설정하는 것이다.

즉, Compose 메모리가 언제 해제 될 지 전략을 정해주는 것인데, 적절한 시기에 해제하지 않으면 메모리 누수가 발생할 수 있기 때문에 중요하다.

 

ViewCompositionStrategy는 4가지가 있다.

  • DisposeOnDetachedFromWindow
  • DisposeOnDetachedFromWindowOrReleasedFromPool (Default)
  • DisposeOnLifecycleDestroyed
  • DisposeOnViewTreeLifecycleDestroyed

하나씩 살펴보자면..

DisposeOnDetachedFromWindow

: ComposeView 자체가 현재 window로 부터 detach 됐을 때 composition dispose 한다.

Activity에서 ComposeView를 사용하거나 ViewGroup.removeView~에서 없어졌을 때 트리거된다.

DisposeOnDetachedFromWindowOrReleasedFromPool (Default)

: ComposeView 자체가 Pooling Container 기반 내에서 돌아갈 때 사용된다. (RecyclerView 등)

RecyclerView 같은 경우 스크롤 중에 각 아이템에 대하여 Composition을 자주 dispose + recreate하면 버벅거릴 수 있는데 이를 방지하기 위함이다.

DisposeOnLifecycleDestroyed

: 이 전략을 설정할 때 인자로 보내는 Lifecycle이 destroy 됐을 때 해제한다.

Fragment 환경의 ComposeView에 사용하기 적절하다.

DisposeOnViewTreeLifecycleDestroyed

: View가 attach 된 이후 현재의 window에서 ViewTreeLifecycleOwner가 destroy 될 때 해제한다.

ComposeView를 사용하는 부분에서 Lifecycle을 모를 때 사용한다.

 

결론은 자주 dispose + recreate 되어야하는 리사이클러뷰 아이템 같은 경우 DisposeOnDetachedFromWindowOrReleasedFromPool를 사용하는게 좋다는 것이다.

 

✨ 진행상황

그래서 나도 이런 식으로 ViewHolder를 생성할 때 ComposeView를 사용하는 식으로 아이템을 구성했고, ViewCompositionStrategy를 (default지만) 설정해주었다!

자세한 과정 및 코드는 https://github.com/mash-up-kr/mashup_Android/pull/463

Page를 넘기고 스크롤을 내렸다가 돌아와도 버벅거리지 않는다! 👍

앞으로 다른 ViewHolder들도 Compose로 하나씩 마이그레이션 한 후 Step2를 진행할 예정이다.

🤵‍♀️<(Step2 진행할 때 다시 오겠습니다... 이만 총총)

'Android > Jetpack Compose' 카테고리의 다른 글

Jetpack Compose State 정리  (0) 2023.01.12