
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를 지정했을 때 발생했던 예외 메세지가 같음을 볼 수 있다.
