Compose navigation route는 왜 직렬화가 가능해야 할까?

송규빈·2024년 7월 26일
1
post-thumbnail
post-custom-banner

Route는 왜 직렬화가 가능해야 할까?

Route의 역할

Routedestination에 도달하는 방법을 설명하며 destination에 필요한 모든 정보를 포함한다.

  • destination: Navigation Graph의 노드임. 사용자가 이 노드로 이동하면 호스트가 컨텐츠를 표시함.

즉, route는 각 네비게이션 대상의 고유한 값이고, 이를 통해서 네비게이션 그래프에서 각 화면을 식별하고, 특정 화면으로 이동할 수 있다.

그 밖에도 인자를 포함할 수 있고, details/{itemId} 와 같이 Route에서 동적으로 인자를 전달할 수 있다.

Route를 직렬화가 가능한 타입으로 설정해야하는 이유

상태 저장 및 복원

안드로이드는 각 네비게이션 대상에 대한 정보를 저장하고 복원하는데 이 때 효율적으로 데이터를 저장 및 복원하기 위해 직렬화를 한다.

그렇기에 각 네비게이션 대상의 고유한 값을 나타내는 route 또한 직렬화가 가능해야 한다.

Route 사용

문자열

route는 기본적으로(?) 문자열 형태로 되어있다.

String의 형태로 상수로 관리하며 route를 관리하기도 하지만 @Serializable을 사용하여 route를 관리하기도 한다.

Serializable

여기서 @Serialiazable로 직렬화가 가능하게끔 만들어주는 어노테이션을 붙이지 않으면 아래와 같은 에러가 나온다.
(참고: https://github.com/Kotlin/kotlinx.serialization)

직렬화 할 수 있는 Serializer 를 찾을 수 없다는 내용이다.

내부 코드

그러면 내부코드를 한 번 보자.

composable()

composableroute를 문자열로 넣는 것이 아니라 위와 같이 제네릭으로 사용했을 때는 아래와 같은 함수가 호출된다.

제네릭으로(T) 받은 타입은 클래스 형태로 사용되며 이를 활용하여 ComposeNavigatorDestinationBuilder 객체를 만들어 destination 메서드에 인자로 전달된다.

destination

destination 메서드를 통해 NavGraphBuilder에 새로운 composable navigation 목적지(destination)에 추가한다.

ComposeNavigatorDestinationBuilder

아까 destination 메서드에 인자로 전달할 때 사용되었던 객체를 만들었던 ComposeNavigatorDestinationBuilder를 보자.

우선 ComposeNavigatorDestinationBuilderNavDestinationBuilder를 상속받고 있고 생성자를 보면 아래와 같다.

super를 통해 NavDestinationBuilder의 생성자를 호출하고 있다.

NavDestinationBuilder 의 생성자의 2번째, 3번째 인자를 보면 살펴보면 내부적으로 serializable을 체크한다.

위의 this(생성자)를 보면 결국 routegenerateRoutePattern 메서드에 의해 문자열로 반환이 되고, 문자열로 다뤄진다.

serialiazer()

serialiazer 메서드가 제대로 체크가 되는것인지, 실제로 동작하는 것인지를 보기 위해 해당 메서드를 좀 더 뜯어보면 아래와 같다**

Serializable이 아니라면 notRegisteredMessage를 담아 Exception을 발생시키고 있는데, 해당 메세지가 Serializable이 아닌 객체를 사용하여 route를 지정했을 때 발생했던 예외 메세지가 같음을 볼 수 있다.

profile
🚀 상상을 좋아하는 개발자
post-custom-banner

0개의 댓글