Compose를 공부하며 이전에 View로 작성했던 프로젝트를 Compose로 리팩토링했습니다. 이 과정에서 체계적으로 정리된 자료가 필요함을 느꼈고, 나중에도 참고할 수 있도록 책에서 공부하고 실습한 내용 및 프로젝트에서 유용했던 부분들을 정리한 글을 작성하려합니다.
컴포즈를 잘 다루기 위해서는 상태에 대해서 명확한 이해가 필요합니다. 기존에 xml으로 UI를 설계했을 때는 상태에 대한 개념이 존재하지 않았지만 컴포즈에서는 상태가 존재합니다. 상태에 변경에 따라 UI가 업데이트 되기 때문에 상태에 대해서 잘 이해해야합니다.
상태 호이스팅을 통해 상위 계층에서 상태를 관리하고 하위 계층에 파라미터로 전달할 수 있습니다. 계층을 거쳐 상태를 전달하는 과정이 번거로울 수 있지만, Compose의 CompositionLocal을 사용하면 이 문제를 해결할 수 있습니다.
컴포저블 함수에서는 하나 이상의 컴포저블 함수를 호출할 수 있습니다. Slot API는 컴포저블 함수를 통해 사용자 정의 UI 컴포넌트에 Slot을 제공하여, 이 컴포넌트의 일부를 외부에서 정의할 수 있습니다 . 하나의 Slot API는 하나 이상의 요소가 비어 있는
Modifier는 Compose의 내장 객체로, 컴포저블에 적용할 설정을 저장합니다. 테두리, 패딩, 배경, 크기, 이벤트 핸들러 등을 설정할 수 있습니다. 생성한 Modifier 인스턴스를 컴포저블에 전달해 형태나 행동을 변경할 수 있습니다.
컴포즈가 제공하는 레이아웃 컴포저블을 이용한다면 사용자 인터페이스를 구조화하고, 화면 방향이나 크기 변경과 같은 요소들에 대한 레이아웃의 반응 방법을 정의할 수 있습니다.
Box 레이아웃은 자식들을 위로 중첩해서 쌓아올리는 레이아웃입니다.
컴포즈는 효율적 UI 렌더링을 위해 각 컴포넌트를 한 번만 측정합니다. 부모가 자식의 크기를 미리 알아야 하는 경우, 모든 컴포저블이 내재적 최대 및 최소 크기를 가지므로 이를 활용해 규칙을 어기지 않고도 크기 정보를 얻어 문제를 해결할 수 있습니다.
Compose에서는 RecyclerView 대신 LazyList를 사용해 리스트를 구현합니다. 보이는 아이템만 인스턴스를 생성하고, 벗어난 아이템은 파괴해 리소스를 절약합니다. 이를 통해 성능 저하 없이 긴 리스트도 효율적으로 렌더링할 수 있습니다.
부수 효과(Side Effect)란 컴포저블 함수가 화면에 표시되는 동안 발생하는 외부 작업으로, 컴포저블 함수 자체의 범위를 벗어나 앱의 상태를 변경하는 작업을 의미합니다.
ViewModel은 UI를 그리기 위해 필요한 데이터를 관리하고, 사용자의 이벤트를 처리하는 책임이 있습니다. 이를 통해 UI 컨트롤러(Activity나 Fragment)와 데이터를 분리하여, UI 로직과 비즈니스 로직의 분리로 코드의 재사용성과 유지보수성을 높입니다.
프로젝트 내에서 각 화면들은 컴포저블로 구현되고 각 화면들은 목적지(destination)라고 불립니다. 안드로이드 네비게이션 아키텍처에서는 네비게이션 백 스택을 이용해서 화면인 목적지가 이동될 때마다 백 스택에 쌓이게 됩니다. 앱이 처음 실행되면 홈 화면이 현재 목적