본문 바로가기
.NET/MAUI

MAUI 상대/절대 경로 설명

by leo21c 2025. 11. 24.

앱을 개발하다 보면 리스트에서 상세 화면으로 들어가거나(상대 경로), 연결을 끊고 메인 홈으로 돌아오는(절대 경로) 등 네비게이션 흐름 제어가 매우 중요합니다.

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로 이동하여 스택 초기화

이 구조를 잡고 시작하시면, 사용자가 앱을 쓰다가 "뒤로 가기 눌렀는데 왜 앱이 꺼지지?"라거나 "왜 이전 화면이 안 나오지?" 하는 혼란을 겪지 않게 됩니다.

LIST