Route
는 destination
에 도달하는 방법을 설명하며 destination
에 필요한 모든 정보를 포함한다.
destination
: Navigation Graph
의 노드임. 사용자가 이 노드로 이동하면 호스트가 컨텐츠를 표시함.즉, route
는 각 네비게이션 대상의 고유한 값이고, 이를 통해서 네비게이션 그래프에서 각 화면을 식별하고, 특정 화면으로 이동할 수 있다.
그 밖에도 인자를 포함할 수 있고, details/{itemId}
와 같이 Route
에서 동적으로 인자를 전달할 수 있다.
안드로이드는 각 네비게이션 대상에 대한 정보를 저장하고 복원하는데 이 때 효율적으로 데이터를 저장 및 복원하기 위해 직렬화를 한다.
그렇기에 각 네비게이션 대상의 고유한 값을 나타내는 route
또한 직렬화가 가능해야 한다.
route는 기본적으로(?) 문자열 형태로 되어있다.
String의 형태로 상수로 관리하며 route
를 관리하기도 하지만 @Serializable
을 사용하여 route
를 관리하기도 한다.
여기서 @Serialiazable
로 직렬화가 가능하게끔 만들어주는 어노테이션을 붙이지 않으면 아래와 같은 에러가 나온다.
(참고: https://github.com/Kotlin/kotlinx.serialization)
직렬화 할 수 있는 Serializer
를 찾을 수 없다는 내용이다.
그러면 내부코드를 한 번 보자.
composable
에 route
를 문자열로 넣는 것이 아니라 위와 같이 제네릭으로 사용했을 때는 아래와 같은 함수가 호출된다.
제네릭으로(T) 받은 타입은 클래스 형태로 사용되며 이를 활용하여 ComposeNavigatorDestinationBuilder
객체를 만들어 destination
메서드에 인자로 전달된다.
destination
메서드를 통해 NavGraphBuilder
에 새로운 composable
navigation
목적지(destination
)에 추가한다.
아까 destination
메서드에 인자로 전달할 때 사용되었던 객체를 만들었던 ComposeNavigatorDestinationBuilder
를 보자.
우선 ComposeNavigatorDestinationBuilder
는 NavDestinationBuilder
를 상속받고 있고 생성자를 보면 아래와 같다.
super
를 통해 NavDestinationBuilder
의 생성자를 호출하고 있다.
NavDestinationBuilder
의 생성자의 2번째, 3번째 인자를 보면 살펴보면 내부적으로 serializable
을 체크한다.
위의 this
(생성자)를 보면 결국 route
는 generateRoutePattern
메서드에 의해 문자열로 반환이 되고, 문자열로 다뤄진다.
serialiazer
메서드가 제대로 체크가 되는것인지, 실제로 동작하는 것인지를 보기 위해 해당 메서드를 좀 더 뜯어보면 아래와 같다**
Serializable
이 아니라면 notRegisteredMessage
를 담아 Exception
을 발생시키고 있는데, 해당 메세지가 Serializable
이 아닌 객체를 사용하여 route
를 지정했을 때 발생했던 예외 메세지가 같음을 볼 수 있다.