참치코더의 꿈 메모장

Next.js / App Router 네비게이팅 정리 본문

Next.js

Next.js / App Router 네비게이팅 정리

참치깡 2026. 1. 6. 23:52
728x90

 

 

 

App Router 네비게이팅의 핵심 개념

 

- 페이지 이동  = URL 변경 + 서버 컴포넌트 재렌더링

- 기본 이동은 서버 중심

- 필요한 경우에만 클라이언트 네비게이션 사용

 

<Link> 컴포넌트

 

특징

 

- 클라이언트 사이드 네비게이션

- 전체 새로고침이 되지 않는다.

- Prefetch 자동 지원

1
2
3
4
5
6
7
8
9
10
import Link from "next/link"
 
export default function Nav() {
    return (
        <nav>
            <Link href="/">Home</Link>
            <Link href="/posts">Posts</Link>
        </nav>
    );
}
cs

 

useRouter (클라이언트 전용)

 

언제 사용할까?

 

- 내부적으로 프로그래메틱하게 동작할때 사용한다.

 

- 버튼 클릭, 폼 제출 후 이동, 조건부 이동 시 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
"use client"
 
import {useRouter} from "next/navigation";
 
export default function LoginButton() {
    const router = useRouter();
 
    return (
        <button onClick={() => router.push("/dashboard")}>
            로그인
        </button>
    );
}
cs

 

useRouter 제공 메서드

 

- push : 새 페이지 이동

- replace : 히스토리 대체

- back : 뒤로 가기

- refresh : 서버 컴포넌트 재요청

 

redirect() (서버 전용 네비게이션)

 

- 서버 컴포넌트 / 서버 액션 / 미들웨어에서 사용

 

- 즉시 이동 (렌더링 중단)

1
2
3
4
5
6
7
8
9
10
11
import {redirect} from "next/navigation"
 
export default async function Page() {
    const user = await getUser();
 
    if (!user) {
        redirect("/login");
    }
 
    return <div>Dashboard</div>;
}
cs

 

- HTML 생성 전에 이동

- 보안/권한 처리에 최적

 

notFound() (404 처리)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { notFound } from "next/navigation";
 
 
export default async function Page({ params }) {
const post = await getPost(params.id);
 
 
if (!post) {
notFound();
}
 
 
return <PostDetail post={post} />;
}
cs

 

- /not-found.tsx 렌더링

- 서버에서만 사용 가능

 

URL 파라미터 & 쿼리스트링 네비게이션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//동적 라우트
//app/posts/[id]/page.tsx
 
export default function Page({ params }){
    return <div>Post ID: {params.id}</div>
}
 
//쿼리 스트링
 
"use client";
import { useSearchParams } from "next/navigation";
 
export default function Page() {
    const searchParams = useSearchParams();
    const q = searchParams.get("q");
 
    return <div>검색어: {q}</div>
}
cs

 

Route Group과 네비게이션

 

app/(auth)/login/page.tsx -> /login

app/(auth)/register/page.tsx -> /register

 

- ( )는 URL에 포함되지 않음

- import / 네비게이션 경로에는 영향 없음

 

페이지 이동시 실제로 일어나는 일

 

1. <Link> 클릭

2. 서버에 RSC 요청 (전체 RSC 요청)

3. 변경된 부분만 스트리밍

4. 클라이언트에서 부분 렌더링을 한다. (변경된 클라이언트 부분 JS Bundle 업데이트)

728x90
Comments