앱을 개발하다 보면 리스트에서 상세 화면으로 들어가거나(상대 경로), 연결을 끊고 메인 홈으로 돌아오는(절대 경로) 등 네비게이션 흐름 제어가 매우 중요합니다.
Shell.Current.GoToAsync의 핵심은 **"네비게이션 스택(Navigation Stack)을 어떻게 다루느냐"**에 있습니다. 이 부분을 명확히 이해하면 뒤로 가기 버튼을 눌렀을 때 앱이 종료되는 실수를 막을 수 있습니다.
1. 절대 경로 vs 상대 경로 비교
| 구분 | 문법 (URI) | 동작 방식 (Navigation Stack) | 비유 | 용도 |
| 절대 경로 |
//로 시작 | 스택 초기화 (Reset) 기존에 쌓인 페이지를 모두 지우고 새 페이지를 루트로 설정합니다. |
"집 대문으로 바로 이동" | 탭 간 이동, 로그아웃 후 홈 이동, 메인 메뉴 전환 |
| 상대 경로 |
/ 없음 또는 ../ | 스택 유지 (Push / Pop) 현재 페이지 위에 새 페이지를 쌓거나(Push), 이전 페이지로 돌아갑니다(Pop). |
"현재 방에서 옆방으로 이동" | 목록 -> 상세정보 진입, 뒤로 가기 |
2. 상세 사용법 및 코드 예시
BTLE 장치 리스트(MainPage)에서 특정 장치를 선택해 상세 정보(DeviceDetailPage)로 이동하는 시나리오로 설명해 드리겠습니다.
A. 상대 경로 (Relative Route) - 깊이 들어가기
현재 페이지 위에 새로운 페이지를 덮어씌웁니다. 사용자가 '뒤로 가기' 버튼을 누르면 이전 페이지가 나옵니다.
// 예: 장치 리스트에서 특정 장치를 클릭했을 때
// 라우트 등록이 되어 있어야 함: Routing.RegisterRoute("DeviceDetail", typeof(DeviceDetailPage));
// 1. 하위 페이지로 이동 (Push)
await Shell.Current.GoToAsync("DeviceDetail");
// 2. 데이터를 전달하며 이동 (QueryProperty)
await Shell.Current.GoToAsync($"DeviceDetail?deviceId={selectedDevice.Id}");
// 3. 뒤로 가기 (Pop) - 코드에서 강제로 뒤로 보낼 때
await Shell.Current.GoToAsync("..");
B. 절대 경로 (Absolute Route) - 판 뒤집기
이전의 히스토리를 모두 날려버립니다. 주로 하단 탭바의 탭을 전환하거나, 앱의 흐름을 완전히 바꿀 때 사용합니다.
// 예: 상세 설정 페이지 깊숙한 곳에서 '홈'으로 즉시 복귀하고 싶을 때
// 메인 페이지의 라우트가 "MainPage"라고 가정할 때 (Shell.xaml에서 정의)
// 기존 스택(상세정보, 이력 등)이 모두 사라지고 MainPage가 최상단이 됨.
await Shell.Current.GoToAsync("//MainPage");
// 예: 탭 간 이동 (홈 탭 -> 설정 탭)
await Shell.Current.GoToAsync("//SettingsTab");
3. "Shell 재구성"의 의미
질문하신 **"Shell 재구성"**은 보통 두 가지 문맥에서 사용됩니다.
① 네비게이션 스택의 재구성 (Stack Reset)
위에서 설명한 **절대 경로(//)**를 사용하는 행위 자체를 의미합니다.
사용자가 List -> Detail -> History 순으로 깊게 들어갔더라도, //MainPage를 호출하면 중간에 쌓인 Detail, History 페이지들은 메모리에서 해제되고 스택이 MainPage 하나로 재구성됩니다.
BTLE 앱 적용: 장치 연결이 갑자기 끊어졌을 때, 사용자가 어디에 있든 강제로 메인 연결 화면으로 보내고 이전 스택을 지워야 할 때 유용합니다.
② 앱 구조 자체의 교체 (Application.MainPage 교체)
이는 GoToAsync보다 더 큰 개념입니다. 주로 로그인/로그아웃 처리에 사용됩니다.
로그인 전에는 LoginShell, 로그인 후에는 AppShell을 보여줘야 할 때 사용합니다.
이때는 GoToAsync가 아니라 앱의 메인 페이지 자체를 갈아 끼웁니다.
// 로그인 성공 시 실행
Application.Current.MainPage = new AppShell();
// 로그아웃 시 실행 (로그인 화면만 있는 셸로 교체)
Application.Current.MainPage = new LoginShell();
요약 및 제안
작성 중인 전력기기 관리 앱에서는 다음과 같은 패턴을 추천합니다.
장치 검색 및 목록(메인) ↔ 설정(메인): // 절대 경로 사용 (탭 전환)
장치 목록 → 장치 상세 정보 → 이력 조회: 상대 경로 사용 (뒤로 가기 가능)
치명적 오류 혹은 연결 해제: //MainPage로 이동하여 스택 초기화
이 구조를 잡고 시작하시면, 사용자가 앱을 쓰다가 "뒤로 가기 눌렀는데 왜 앱이 꺼지지?"라거나 "왜 이전 화면이 안 나오지?" 하는 혼란을 겪지 않게 됩니다.
'.NET > MAUI' 카테고리의 다른 글
| MAUI 함수 호출 지연 방법 비교 (0) | 2025.12.11 |
|---|---|
| MSVS에 빌드 옵션에 Android 로컬 디바이스가 표시되지 않을 때 (0) | 2025.12.08 |
| MAUI TabbedPage와 Shell 사용 비교 (0) | 2025.10.16 |
| MAUI BTLE InTheHand Client Sample. part2 (0) | 2025.10.16 |
| MAUI BTLE InTheHand Client Sample Code (0) | 2025.10.14 |