본문 바로가기

Frameworks/Next.js

[Next.js] 라우팅 (Routing) (App Router ver.)

728x90



Next.js App Router 버전에서의 라우팅 방식을 알아보자!

 

 


 

 

 

Page Router 버전의 페이지 라우팅

 

- pages 폴더 밑에 구조를 기반으로 페이지 라우팅이 자동설정 된다.

 

 

 

App Router 버전의 페이지 라우팅

 

- app 폴더 밑에 구조를 기반으로 페이지 라우팅이 자동설정 된다.

- 다만, app router에서는 page라는 이름을 갖는 파일만 페이지 파일로써 설정이 된다.

 

 

동적 경로를 가지는 페이지를 만들 때는 폴더 아래에 [URL 파라미터] 아래에 page.tsx 이런식으로 만들면 된다.

 

 

 


 

 

 1. app > 폴더 > page.tsx 파일 

예를 들어, app > search 폴더 > page.tsx 파일을 만들면,
URL은 http://localhost:3000/search가 된다.

 

 

 

 2. 쿼리 스트링 만드는 법 

 

export default function Page(props){
  console.log(props);
  
  return <div>Search 페이지</div>
}

 

이런식으로 props를 콘솔로 찍고 터미널을 살펴보면, props에 출력된 값이 프로미스 객체 형태로 저장이 되는 것을 알 수 있다.

 

App Router 버전의 Next App에서는 페이지에게 전달되는 URL 파라미터나 쿼리스트링이 props를 통해서 전달이 되기 때문에, 
SearchParams 객체로부터 실제 쿼리스트링의 값을 꺼내서 활용할 수 있다.

이 props의 타입을 정의하고 활용하는 코드는 다음과 같다.

 

export default async function Page({ searchParams }: { searchParams: Promise<{ q: string }> }) {
  const { q } = await searchParams;
  return <div>Search 페이지 : {q}</div>
}

 

 

 

 

 3. URL 파라미터 만드는 법 

 

app > book 폴더[id] 폴더 > page.tsx 파일을 만들면,  NEXT가 이 파일을 동적 경로에 대응하는 파일이라고 인식하게 된다.

 

URL 파라미터를 포함하고 있는 동적 경로에 라우팅을 설정할 때는 대괄호와 함께  URL 파라미터를 명시

 

 

URL 파라미터 값을 페이지에 활용하기

 

export default async function Page({ params }: { params: Promise<{ id: string }> }) {
  const { id } = await params;
  return <div>book/[id] 페이지 : {id}입니다.</div>
}

 

 

현재에는 딱 하나의 URL 파라미터에만 대응하도록 설정이 되어있기 때문에, 여러개의 URL 파라미터를 받기 위해서는 [...id] (Catch All Segment)로 설정을 하면된다.

 

 

여기서 주의 할 점은, Catch All Segment로도 대응할 수 없는 경로가 한가지 있다.
그것은 URL 파라미터가 존재하지않는 URL이다. (여기서는 localhost:3000/book) 

만약 /book 뒤에 어떤 경로가 나오든 안나오든 모두 다 범용적으로 대응이 되게끔 하고 싶다면, 파일의 이름을 대괄호로 한번만 더 감싸주면 된다.

이것을 "Optional Catch All Segment" 라고 부른다.

 

 

728x90