Next.js

[Next.js] 라우팅 이론과 실습

2023. 5. 8. 22:20
목차
  1. 라우팅 알아보기
  2. 라우트 정의
  3. 페이지와 레이아웃
  4. 경로 탐색
  5. 라우트 그룹
  6. 동적 라우팅
  7. 라우팅 실습

 

 

Next.js의 라우팅 방식에 대해 알아보고 실습으로 구현해보자.

 

라우팅 알아보기

라우트 정의

app 디렉토리 내에서 폴더를 생성하면 폴더명으로 라우트가 정의된다. 폴더 내에 새로운 폴더를 만들면 하위 경로를 만들 수 있다.

폴더 내에 page.js 파일을 만들면 해당 라우트 url의 페이지가 된다.

 

페이지와 레이아웃

페이지란 하나의 라우트를 통해서만 접근할 수 있는 고유한 UI를 말한다. page.js 파일에서 컴포넌트를 export하면 페이지를 정의할 수 있다.

레이아웃이란 여러 페이지에서 공유되는 공통된 UI를 말한다. 내브바 같은 것을 삽입할 때 유용하다. 사용자가 페이지를 이동해도 공통의 레이아웃은 재렌더링되지 않고, 상태를 보존한다. 레이아웃은 layout.js파일에서 컴포넌트를 export해서 만들 수 있다. 컴포넌트는 렌더링 중에 자식 레이아웃 또는 자식 페이지로 채워질 자식 prop을 받아야 한다.

 

경로 탐색

경로 이동 및 탐색은 두 가지를 통해서 구현할 수 있다. 하나는 <Link> 컴포넌트이고, 다른 하나는 useRouter() 훅이다.

<Link> 컴포넌트는 html의 <a> 태그와 비슷한 역할을 하면서도 프리페칭을 구현하고 클라이언트 사이드 렌더링을 지원한다. <Link> 컴포넌트의 프리페칭을 원하지 않는다면 prefetch={false}로 속성을 설정하면 된다.

 

useRouter() 훅은 클라이언트 컴포넌트에서만 사용 가능하다. 프로그램적으로 라우트를 변경할 수 있도록 해준다.

useRouter에는 여러 메서드도 포함돼 있다. router.back()은 뒤로 가기, router.forward()는 앞으로 가기, router.refresh()는 새로고침, router.prefetch()는 다음 페이지를 미리 로드할 수 있게 해준다.

 

관련된 훅들도 함께 살펴보면 

usePathname()은 현재 url을 출력해주고, useSearchParams() 서치파라미터(쿼리스트링)를 출력한다. useParams()는 유저가 [dynamic route]에 입력한 것을 출력한다.

 

라우트 그룹

라우트 그룹은 여러 라우트를 그룹으로 묶되 경로에는 영향을 주지 않는다. 폴더명을 소괄호'()'로 묶어서 만든다. 여러 라우트를 묶어서 공통의 레이아웃을 제공하면서도 별도의 url은 생성하지 않고 싶을 때 사용할 수 있다. 라우트 그룹을 사용해 여러 개의 루트 레이아웃을 만들 수도 있다.

 

동적 라우팅

정확한 세그먼트 이름을 미리 알기 어렵고 동적인 데이터를 받아서 라우트를 정의하려 할 때 동적 라우팅을 사용할 수 있다. 폴더명을 대괄호'[]'로 묶으면 동적 세그먼트를 생성한다. 글 번호나 유저 번호를 받아서 라우팅을 할 때 유용하다.

 

라우팅 실습

간단한 게시판 페이지를 만들어 글 고유 id에 따라서 라우트를 생성하고 게시글 페이지로 이동할 수 있게 해보자.

몽고DB 서버에 글 목록의 더미 데이터를 저장해 두었다.

 

폴더와 파일은 위와 같이 구성돼 있다. list 폴더가 /list 페이지로 연결되고, /detail/[postId]는 동적 라우팅을 구현해 글 id를 받아와 표시할 수 있도록 했다. 루트 경로에 들어 있는 layout.js로 내브바를 생성했다.

 

import { connectDB } from "@/util/database";
import Link from "next/link";

export default async function List() {
  //몽고DB 문법
  const client = await connectDB;
  const db = client.db("forum");
  let result = await db.collection("post").find().toArray();

  //글 리스트를 받아와 표시한다.
  return (
    <div className="list-bg">
      {result.map((post) => {
        return (
          <div className="list-item">
            <Link href={`/detail/${post._id}`}><h4>{post.title}</h4></Link>
            <p>{post.content}</p>
          </div>
        );
      })}
    </div>
  );
}

list 폴더의 page.js 파일이다. 서버로부터 데이터를 받아와 화면에 표시하는 간단한 구성이다.

<Link> 컴포넌트를 통해서 각각의 글로 이동할 수 있다.

 

import { ObjectId } from "mongodb";
import { connectDB } from "@/util/database.js";

//props로 url의 정보를 받는다.
export default async function Detail(props) {
  let db = (await connectDB).db("forum");
  let result = await db
    //몽고DB 문법
    .collection("post")
    .findOne({ _id: new ObjectId(props.params.postId) });

  return (
    <div>
      <h4>{result.title}</h4>
      <p>{result.content}</p>
    </div>
  );
}

detail/[postId]의 page.js 파일이다. props를 통해서 url에 접근할 수 있다!

url에서 글 id를 받아오면 서버에서 받아온 글 목록 중에서 id와 일치하는 것을 찾아서 표시한다.

 

import './globals.css'
import { Inter } from 'next/font/google'
import Link from 'next/link'

const inter = Inter({ subsets: ['latin'] })

export const metadata = {
  title: 'Create Next App',
  description: 'Generated by create next app',
}

export default function RootLayout({ children }) {
  return (
    <html lang="en">
    //여기가 핵심
      <body className={inter.className}><div className="navbar"> 
  <Link href="/" className="logo">Kuromiforum</Link> 
  <Link href="/list">List</Link> 
</div>  {children}</body>
    </html>
  )
}

layout.js의 내브바는 위와 같이 만들었다. Kuromiforum을 누르면 루트 경로로 이동, List를 누르면 글 목록으로 이동한다. 마찬가지로 <Link> 컴포넌트를 사용했다.

 

작고 귀여운... 결과물..🥲

이렇게 라우팅도 잘 되는 것을 확인할 수 있다.

Next.js 라우팅 실습 유익하고 재밌었다!

 

 


참고 자료

 

Next.js 공식 문서

https://nextjs.org/

 

코딩애플: Next.js로 웹서비스 만들기

https://codingapple.com/course/next-js/

'Next.js' 카테고리의 다른 글

[Next.js] CRUD 기능 구현하기  (0) 2023.05.22
[Next.js] Next.js 장단점과 특징  (2) 2023.05.05
  1. 라우팅 알아보기
  2. 라우트 정의
  3. 페이지와 레이아웃
  4. 경로 탐색
  5. 라우트 그룹
  6. 동적 라우팅
  7. 라우팅 실습
'Next.js' 카테고리의 다른 글
  • [Next.js] CRUD 기능 구현하기
  • [Next.js] Next.js 장단점과 특징
JeanneLee57
JeanneLee57
공부하고 기록을 남기는 개발자 Jeanne
JeanneLee57
코딩은 진리
JeanneLee57
전체
오늘
어제
  • 분류 전체보기 (115)
    • Javascript (15)
    • React (15)
    • Next.js (8)
      • Next.js 베타 문서 번역 (5)
    • 프로젝트 (34)
      • 미니 프로젝트 & 과제 (25)
      • SEB 44 pre-project (1)
      • SEB 44 main-project (8)
    • 알고리즘 (12)
    • 부트캠프 준비 (6)
    • 기술면접 (3)
    • CS (7)
    • 코드스테이츠 프론트엔드 부트캠프 (12)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • codestates
  • 프론트엔드
  • 알고리즘
  • 부트캠프준비
  • react
  • 구조분해할당
  • 코드스테이츠
  • 번역
  • 부트캠프
  • 회고
  • 고차함수
  • useEffect
  • 프리코드캠프
  • HTML
  • Next.js
  • 프로그래머스
  • 유데미
  • CSS
  • RTK
  • JavaScript

최근 댓글

최근 글

hELLO · Designed By 정상우.
JeanneLee57
[Next.js] 라우팅 이론과 실습
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.