- Published On
Next.js 패러렐 라우트, 인터셉팅 라우트
Next.js의 패러렐 라우트(Parallel Route)
와 인터셉팅 라우트(Intercepting Routes)
에 대해 알아보겠습니다.
패러렐 라우트(Parallel Route)
패러렐 라우트
는 병렬 라우팅을 의미합니다. 병렬 라우팅을 사용하면 동일한 레이아웃에서 하나 이상의 페이지를 동시에 또는 조건부로 렌더링할 수 있습니다.
이를 통해 각 경로에 대해 독립적인 오류 및 로드 상태를 정의할 수 있습니다.
즉, 한 페이지에 두 개의 페이지를 불러올 수 있다는 의미입니다.
기존 모달과의 차이점
특징/방법 | 기존 모달 처리 방식 | Next.js 14의 Parallel Routes |
---|---|---|
URL 통합 | 수동으로 router.push 사용 | 자동 URL 조각 관리 |
상태 관리 | 로컬 상태로 모달 열고 닫기 관리 | URL 변화에 의한 자동 상태 관리 |
동시성 | 한 번에 하나의 모달 또는 라우트 관리 | 여러 라우트 동시 활성화 가능 |
코드 간소화 | 상태 관리와 라우터 로직이 복잡 | 선언적 라우팅으로 코드 간소화 |
사용자 경험 | URL과 상태 동기화 필요 | URL을 통한 직접 접근 및 뒤로 가기 지원 |
기술적 복잡성 | 높음 (직접 관리 필요) | 낮음 (프레임워크에 의한 자동화) |
패러렐 라우트 사용하기
패러렐 라우트는 명명된 슬롯(@)
을 사용하여 생성됩니다.
예를 들어 @modal
형태로 슬롯을 생성할 수 있으며, 이는 경로 세그먼트가 아니므로 URL 구조에 영향을 주지 않습니다.
💡 단, 위치는
(폴더 이름)/@modal
으로 하면 패러렐 라우트가 안되는 버그가 있습니다.@modal
위치로 해주셔야됩니다.
...
<Layout>
<Analytics />
<Team />
{/* /app/@modal/page.tsx이 보여짐 */}
{modal}
{children}
</Layout>
💡 children prop은 폴더에 매핑할 필요가 없는 암시적 슬롯입니다. 즉,
app/page.tsx
와app/@children/page.tsx
는 동일합니다. 단, children의 @children 폴더는 생략되었다고 보면 됩니다.
💡 다른 계층 구조를 갖고 있는 페이지는 병렬로 렌더링 할 수 없습니다. 예를들어,
app/page.tsx
와app/@modal/page.tsx
는 병렬로 렌더링 할 수 없다는 의미입니다. 따라서 병렬로 렌더링 하기 위해서는 슬롯과 다른 슬롯(혹은 페이지)가 같은 계층 구조를 가져야 한다.
💡 paralled route는
page.tsx
대신default.tsx
를 통해 기본 페이지가 작성되며, intercepting route를 통해 모달을 구현하고 싶다면 default.tsx의return null
을 해야 합니다.
인터셉팅 라우트(Intercepting Routes)
Next.js의 인터셉팅 라우트 기능은 현재 레이아웃 내에서 다른 페이지로의 경로 전환을 효과적으로 관리할 수 있게 해주며,
이는 특히 사용자가 다른 컨텍스트로 전환하지 않고도 새로운 페이지의 내용을 표시해야 하는 경우에 유용합니다.
이를 통해, 예를 들어 모달창
같은 동적인 UI 구성 요소를 구현할 수 있습니다.
인터셉팅 라우트 사용 방법
인터셉팅 라우트는 경로 문법 (..)
, (.)
를 사용하여 정의할 수 있으며, 이는 상대 경로 규칙과 유사합니다.
(.) 동일한 수준의 세그먼트와 일치
(..) 한 수준 위의 세그먼트와 일치
(..)(..) 두 수준 위의 세그먼트와 일치
(...) 루트 app 디렉터리의 세그먼트와 일치
- 예시: 모달창 구현하기 -
app/@modal/(..)login
app/@modal/(..)login
경로를 통해 login/page.tsx
페이지를 모달창으로 가로채고 싶으면 아래의 방식을 이용하면 됩니다.
- 위의 패러랠 라우트의 layout과 동일하게
@modal
이 정의 되어있어야 합니다. app/page.tsx
파일에서 /login으로 가는 링크가 있을때,
<Link href='/login'>로그인 모달창 띄우기</Link>
- 일반적으로 사용자는
app/login/page.tsx
페이지를 보게 됩니다.
<p>~원래의 로그인 페이지~</p>
- 하지만,
인터셉팅 라우트
를 사용 할 경우 아래의 페이지가 나옵니다.
<p>~가로챈 로그인 페이지~</p>
단, 이를 위해 app/@modal/default.tsx
가 존재해야 하며, 모달 구현 시
이곳에 보통 null 값을 반환하도록 합니다.
export default function Default() {
return null;
}
- 3번의 기본
app/login/page.tsx
도 생성해야 하는 이유는
사용자가 페이지를 새로 고침
하거나 직접 /login 주소를 입력해 접근
할 경우 해당 페이지가 보이기 때문입니다.
💡 인터셉팅 라우트는 클라이언트에서 라우팅 할 때만 적용됩니다.
인터셉팅 라우트는 반드시 서버를 재시작해야 적용
이 됩니다.
이상으로 Next.js
의 패러렐 라우트
와 인터셉팅 라우트
에 대해 알아보았습니다.
이를 통해 모달창과 같은 UI를 생성하여 사용자 경험을 향상시키고 보다 효율적인 웹 애플리케이션을 구축할 수 있습니다.
이전 포스트
Next.js로 블로그 제작하기 2다음 포스트
Next.js로 블로그 제작하기 3연관된 포스트 구경가기