
Next.js App Router에서는 Intercepting Routes라는 기능을 통해
현재 페이지를 유지한 채 다른 라우트를 가로채서(intercept) UI로 표시할 수 있습니다.
대표적으로 모달 라우팅(modal routing) 구현에 사용됩니다.
예를 들어:
/feed 페이지에서 게시글을 클릭/photo/123 표시/photo/123 전체 페이지로 이동이러한 UX를 구현할 때 Intercepting Routes를 사용합니다.
Intercepting Routes는 현재 레이아웃 컨텍스트 안에서 다른 라우트를 렌더링하도록 가로채는 기능입니다.
즉, 실제 URL은 이동하지만 현재 페이지 위에 다른 라우트를 표시할 수 있습니다.
Next.js 공식 설명:
Intercepting routes allow you to load a route within the current layout while masking the URL.
일반적인 라우팅에서는 페이지 이동 시 전체 페이지가 변경됩니다.
예시
/feed → /photo/123
이 경우
하지만 Intercepting Routes를 사용하면:
/feed
└ modal: /photo/123
UX
/feed/photo/123/photo/123즉 페이지 이동 + 모달 UX를 동시에 구현할 수 있습니다.
Intercepting Routes는 특수 폴더 이름 규칙을 사용합니다.
| 폴더 | 의미 |
|---|---|
(.) | 같은 레벨 라우트 intercept |
(..) | 한 단계 상위 라우트 intercept |
(..)(..) | 두 단계 상위 |
(...) | 루트부터 intercept |
예시: 피드에서 사진 모달을 띄우는 구조
app
├ feed
│ ├ page.tsx
│ └ @modal
│ └ (..)photo
│ └ [id]
│ └ page.tsx
├ photo
│ └ [id]
│ └ page.tsx
설명
/photo/[id] → 실제 페이지(..)photo/[id] → feed에서 모달로 interceptIntercepting Routes는 보통 Parallel Routes와 함께 사용합니다.
@modal
이 슬롯에 모달을 렌더링합니다.
예시 layout
export default function FeedLayout({
children,
modal
}: {
children: React.ReactNode
modal: React.ReactNode
}) {
return (
<>
{children}
{modal}
</>
)
}
구조
children → 기본 페이지modal → intercept된 라우트import Link from "next/link";
export default function Feed() {
return (
<div>
<Link href="/photo/123">
Open Photo
</Link>
</div>
);
}
클릭 시
/photo/123app/feed/@modal/(..)photo/[id]/page.tsx
export default function PhotoModal() {
return (
<div className="modal">
Photo Modal
</div>
);
}
Intercepting Routes의 핵심 특징
| 상황 | 동작 |
|---|---|
| 링크 클릭 | 모달 표시 |
| 새로고침 | 실제 페이지 렌더 |
| 직접 URL 접근 | 실제 페이지 렌더 |
예시
/feed → photo 클릭
URL: /photo/123
UI: modal
새로고침
URL: /photo/123
UI: full page
대표적인 사용 사례
Instagram 스타일
grid → image modal
feed → post modal
product list → quick view modal
Intercepting Routes는 Next.js App Router의 강력한 라우팅 기능입니다.
핵심 특징
대표 사용 사례
Next.js 공식 문서
https://nextjs.org/docs/app/building-your-application/routing/intercepting-routes