오늘 모닝스터디를 시작으로 하루종일 go Router에 대해 알아봤다.
go Router는 지금껏 사용해온 MeterialNavigator와는 다른 작동방식을 가지고 있었다.

Go Router도 MeterialNavigator와 같은 원리로 동작할까?
결론부터 말하자면, 근본적인 동작 원리는 같지만 관리하는 방식이 다르다.
GoRouter는 flutter 내부 엔진을 기반으로 작동한다.
스택을 가지며 ui를 넣고 빼는 동작은 Navigator와 같다.
MaterialNavigator와 가장 큰 차이점은 3가지이다.
먼저, GoRouter는 선언형이다.
주소를 URL를 보고 그에 맞는 스택을 자동으로 구성한다.
두번째는 스택에 페이지를 쌓는 방식에서의 차이가 있다.
MeterialNavigator의 경우는 push만 하면 스택에 자동으로 페이지가 Route 객체로 올라간다.
GoRouter의 경우에는 부모-자식의 관계를 따른다.
root route를 "동"으로 보고, 자식 route들을 "층"으로 보면 이해하기 쉽다.
마지막으로 딥링킹 면에서도 이점이 있다.
딥링크 연결 시 복잡한 로직이 필요하지만, GoRouter는 애초에 URL 기반으로 외부에서 링크를 타고 들어오면 알아서 해당하는 root route부터 차례로 연결시켜준다.
위에도 잠깐 설명했듯, GoRouter를 사용하면 flutter의 페이지들을 웹 브라우저처럼 다룰 수 있다.
이 점이 가장 강점으로 뽑혀 flutter 개발사 측에서도 favorite flutter 딱지를 붙여줬다.
기존 Navigator 방식은 직접 명령을 내리는 방식이라 길을 잃기가 쉬웠다.
GoRouter가 선택한 방식은 흔히 우리가 주소창에 입력하는 URL 방식을 택해 편의성 및 가독성을 강조한다.
URL 주소와 위젯 트리를 동기화하기 위해서는 3가지 요소가 필요하다.
먼저 Route Tree에서는 부모와 자식으로 이루어진 구조를 위젯 스택으로 그대로 변환한다.
또, Go를 통해 특정 위치로 바로 이동할 수 있고 Push를 통해 현재 화면 위에 새로운 화면을 바로 쌓을 수 있다.
마지막으로 Redirection 기능을 통해 특정 조건을 갖추지 못 했을 때의 처리를 할 수 있다.
Go Router는 URL 방식을 택했기에, PathParameter와 QueryParameter가 존재한다.
주소창에서 볼 수 있듯 /: 뒤에 Path에 데이터를 넣어 페이지를 공유할 수 있다.
또, ?filter = query 같은 형식의 쿼리문을 넣어 특정 페이지로 이동할 수 있다.
마지막으로 error 처리를 유연하게 할 수 있다.
잘못된 경로로 들어왔을 때, errorBuilder 페이지를 기본으로 정해줄 수 있다.
ex) errorPage()