안녕하세요 오늘은 next.js을 실행해보고 파일기반 라우팅을 공부해보겠습니다!╰(°▽°)╯
- next.js 실행해보기
- 파일기반 라우팅 vs 코드기반 라우팅 이해하기
- 중첩라우팅, 동적라우팅, 정적라우팅 이해하기
- Link ,router 이해하기
react에서 cra을 하는것처럼 next도 먼저 설치를 해야합니다!
next : npx create-next-app (프로젝트이름)
next+ts : npx create-next-app@latest --typescript
설치가 된후 npm run dev
을 입력해줍니다. localhost/3000번에 들어가셧을떄
이 페이지가 나온다면 기본적인 초기세팅이 되신겁니다!
next.js는 파일경로를 기준으로 라우팅되는 파일기반 라우팅
이고
react는 react-router-dom이라는 라이브러리를 따로 다운을 받아 코드를 작성한 후
거기에 맞는 url에 들어간다면 라우팅되는 코드기반 라우팅
입니다.
파일기반 라우팅(next)은 따로 라우팅 코드를 작성하지 않기떄문에 코드의 양을 줄일 수 있습니다. 그리고 폴더 구조가 곧 경로이기때문에 가독성이 좋습니다.
하지만 강제적인 폴더구조를 요구하기떄문에 react의 자유로운 폴더구조를 좋아하는사람도 있습니다.
파일기반 라우팅: 코드를 줄일 수 있다 , 폴더구조가 곧 경로이며 가독성이 좋다, 파일의 구조가 강제적이다.
코드기반 라우팅 : 라우팅코드를 따로 작성해야한다, 폴더구조가 자유롭다.
import type { NextPage } from "next";
import { Router, useRouter } from "next/router";
const Home: NextPage = () => {
const router = useRouter();
return <div>여기는 시작페이지입니다!</div>;
};
export default Home;
import React from "react";
const about = () => {
return <div>여기의 경로는 /about입니다!</div>;
};
export default about;
결과
페이지의 경로에 따라 정적으로 라우팅이 가능합니다.
만약 굉장히많은 페이지 ex)온라인 스토어 상품, 블로그 게시글 등 을 정적페이지로 하나하나 파일을 만들면서 하면 굉장히 비효율적이겠죠?
그럴땐 동적 라우팅을 써야합니다.
동적 라우팅은 여러 종류의 데이터를 불러와야 하는 페이지
를 생성할떄 쓰입니다.
현재 폴더 구조입니다. pages/port/[id]가 있는걸 알수있는데 만약 사용자가 pages/port/123에 접근한다면 router.query의 값에 123이 추가가 됩니다.
import { useRouter } from "next/router";
import React from "react";
const ThisIsId = () => {
let router = useRouter();
console.log(router.query);
console.log(router.pathname);
return <div>`여기는 port페이지안에 동적 페이지야</div>;
};
export default ThisIsId;
결과
중첩라우팅은 현재페이지에서 어떤 url이 붙어있어도 전부 동일한 파일에서 렌더링
합니다.
pages/blog/[...id]로 페이지구조가 잡혀있는데
url이 localhost:3000/pages/blog/~ 라면 [...id].tsx가 렌더링되며 blog/~에 붙여있는 url의 값을 router.query에서 참조할 수 있습니다.
import { useRouter } from "next/router";
import React from "react";
const ThisIsBlog = () => {
let router = useRouter();
console.log(router.query);
console.log(router.pathname);
return <div>여기는 /blog/~ 가 들어갈곳이야</div>;
};
export default ThisIsBlog;
결과
Next.js는 폴더경로에 따라 페이지가 이동되는데
지금까지 손으로 url을 바꿔주면서 페이지 이동을 했습니다.
사용자가 원하는 페이지를 쉽게 이동시킬 수 있게
link 와 router.push에 대해서 알아보겠습니다.
next 페이지가 렌더링될때 그 페이지가 있다면 페이지에 있는 link태그들의 html파일을 미리 fetching합니다
. 그후 사용자가 link태그를 누른다면 js파일만 가져와서 부분적으로 렌더링합니다.
그렇기때문에 새로고침이 이루어지지않습니다
.
import type { NextPage } from "next";
import Link from "next/link";
import { Router, useRouter } from "next/router";
const Home: NextPage = () => {
const newsPage = [
{ id: "first-port", name: "First port" },
{ id: "second-port", name: "Second port" },
];
const router = useRouter();
return (
<div>
<ul>
{newsPage.map((page) => (
<li key={page.id}>
<Link
href={{
pathname: `/port/${page.id}`,
query: { port: page.id },
}}
>
{page.name}
</Link>
</li>
))}
</ul>
</div>
);
};
export default Home;
import { Router, useRouter } from "next/router";
import React from "react";
const ThisIsId = () => {
let router = useRouter();
console.log(router.query);
console.log(router.pathname);
function back() {
router.push("/");
}
return (
<>
<div>`여기는 port페이지안에 동적 페이지야</div>
<button onClick={back}>홈으로</button>
</>
);
};
export default ThisIsId;
router.push를 사용하면 원하는 경로로 이동할 수 있습니다.
link와 router.push 둘다 페이지 url을 바꿈으로써 다른 페이지를 보여주는것처럼 만들어주는 기능을 가지고 있습니다.
그렇다면 link와 router.push의 차이점은 무엇일까요?
link태그
는 브라우저에서 렌더링과정을 거칠때 a태그로 변환됩니다 . 그렇기때문에 웹사이트가 크롤링되어 SEO에 유리
합니다.
반면 router.push()
는 location과 비슷하게 동작합니다.
location은 크롤링되지 않기때문에 SEO에 불리
합니다.
그외의 router 문법
router.push
router.replace
router.prefetch
router.beforePopState
router.back
router.reload
router.events
잘못된 경로에 들어간다면 next측에서
이 페이지를 띄우도록 설정해놨는데
404(꼭 404여야합니다)
파일을 만든후에
import React from "react";
const Notfind = () => {
return <div>잘못된 경로의 페이지입니다.</div>;
};
export default Notfind;
컴포넌트를 만들어주면 404페이지를 마음대로 변경할 수 있습니다.
결과
next의 파일기반라우팅에 대해서 알아봤습니다! ╰(°▽°)╯