1. Patterns
Custom App Component를 사용할 때 layout 패턴을 사용할 수 있다.
component 폴더 밑에 Layout.js 파일을 만든다.
Layout 컴포넌트에는 여러 페이지에서 반복적으로 사용되는 컴포넌트들을 넣을 수 있고, 스타일도 줄 수 있다.
children은 리액트가 제공하는 prop으로 하나의 컴포넌트를 또 다른 컴포넌트 안에 넣을 때 사용할 수 있다.
import NavBar from "./NavBar";
export default function Layout({ children }) {
return (
<>
<NavBar />
<div>{children}</div>
</>
);
}
MyApp에서 fragment를 우리의 Layout component로 바꾼다.
Layout에 어떤 것을 넣더라도, Layout의 children에서 보여지게 된다.
global로 import해야 할 것이 많기 때문에 너무 큰 리액트 컴포넌트(App)를 사용하기 보다는 Layout 컴포넌트에 만들어주는 것이다.
import Layout from "../components/Layout";
export default function MyApp({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
import Head from "next/head";
2. Fetching Data
public 디렉토리 안에 있는 파일을 찾아올 경우 슬래시하고 파일 이름만 써주면 된다.
/vercel.svg
<img src="/vercel.svg" />
3. Redirect and Rewrite
NextJS의 configuration파일에 redirect와 rewrite를 작성한다.
/** @type {import('next').NextConfig} */
const API_KEY = process.env.API_KEY;
const nextConfig = {
reactStrictMode: true,
async redirects() {
return [
{
source: "/contact",
destination: "/form",
permanent: false,
},
];
},
async rewrites() {
...
},
};
module.exports = nextConfig;
Redirection
async redirects하고 array를 return한다.
이 array는 object를 가지며, redirection에 필요한 것은 이제 전부다.
만약 사용자가 /contact로 이동하면 form이라는 destination으로 보내진다.
참고로 redirection이 permanent(영구적)인지 아닌지에 따라서 브라우저나 검색 엔진이 이 정보를 기억하는지의 여부가 결정이 된다.
Pattern matching이 지원된다.
source: "/old-blog/:path",
destination: "new-blog/:path",
위와 같은 경우 URL에 old-blog/123이라고 쓰고 엔터를 누르면 new-blog/123으로 이동한다.
source: "/old-blog/:path*",
destination: "new-blog/:path*",
만일 뒤에 별을 붙이면 모든 것을 catch할 수 있다.
old-blog/123/comment/12312이라고 쓰고 엔터를 누르면 new-blog/123/comment/12312으로 이동한다.
redirect를 이용해서 한 페이지에서 다른 페이지로 이동하게 할 수도 있고 아예 다른 URL의 웹 사이트로 이동할 수도 있다.
Rewrites
/** @type {import('next').NextConfig} */
const API_KEY = process.env.API_KEY;
const nextConfig = {
reactStrictMode: true,
async redirects() {
...
},
async rewrites() {
return [
{
source: "/api/movies",
destination: `https://api.themoviedb.org/3/movie/popular?api_key=${API_KEY}`,
},
];
},
};
module.exports = nextConfig;
async rewrites를 연다. rewrites도 똑같이 array를 return하며 그 안에는 여러 object들이 들어간다.
rewrites는 redirects와 다르다.
redirects는 특정 URL로 갈 때 유저가 URL이 바뀌는 걸 볼 수 있다.
rewrites는 유저를 redirect시키기는 하지만 URL이 변하지 않는다.
NextJS가 request를 masking한다는 것이다.
환경변수에 API 키를 숨길 수 있다.
.env형식의 environment파일을 만들어서 API_KEY="!@#$%^"를 적어주고 다음과 같이 꺼내서 사용하면 된다.
const API_KEY = process.env.API_KEY;
git ignore에 .env파일이 꼭 포함시켜야 한다.
// index.js
const { results } = await (await fetch(`/api/movies`)).json();
/api/movies라는 가짜 fetching URL이 movies 정보를 받아온다.
Redirects
- URL변경됨
- 들어오는 request 경로를 다른 destination 경로로 리다이렉트
redirects은 source, destination 및 permanent 속성이 있는 객체를 포함하는 배열을 반환하는 비동기 함수
source: 들어오는 request 경로 패턴 (request 경로)
destination: 라우팅하려는 경로 (redirect할 경로)
permanent: true인 경우 클라이언트와 search 엔진에 redirect를 영구적으로 cache하도록 지시하는 308 status code를 사용하고, false인 경우 일시적이고 cache되지 않은 307 status code를 사용
Rewrites
- URL변경되지 않음
- 들어오는 request 경로를 다른 destination 경로에 매핑
rewrites은 URL 프록시 역할을 하고 destination 경로를 mask하여 사용자가 사이트에서 위치를 변경하지 않은 것처럼 보이게 함
4. Server Side Rendering
NextJS의 getServerSideProps function은 server side render에 대한 선택권을 준다.
NextJS는 어플리케이션을 pre-render하고 컴포넌트의 초기 상태로서 HTML을 준다.
loading을 render한다는 뜻이다.
하지만 fetch같은 server에서 일어나는 data 관련된 작업을 모두 한 다음에 페이지를 render하고 싶은 경우도 있다.
이런 경우에는 getServerSideProps라는 function을 export하면 된다.
함수명과 export가 제일 중요하다.
getServerSideProps에 쓰이는 코드는 client쪽이 아닌 server쪽에서만 작동하게 된다.
이 함수를 이용한다면 rewites를 사용하지 않고 API key를 숨기는 것도 가능하다.
export async function getServerSideProps() {
const { results } = await (
await fetch(`http://localhost:3000//api/movies`)
).json();
return {
props: {
results,
},
};
}
getServerSideProps는 object를 하나 반환하는데, 이 object는 props라고 불리는 key가 있다.
이 props안에 원하는 데이터를 넣으면 된다.
이 데이터를 가져오기 위해서는 아래와 같이 작성하면 된다.
export default function Home({ results })
getServerSideProps는 server에서 실행되고 반환되는 것은 props로써 page에게 주게 된다.
원한다면 server side를 통해 props를 page를 보낼 수 있다는 뜻이다.
이게 App 컴포넌트에 pageProps가 필요한 이유다.
export default function App({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
NextJS가 Home을 받고 render하기 위해 Component 자리에 넣는다.
NextJS는 getServerSideProps를 호출하고 반환된 props를 pageProps 자리에 넣는다.
이제 이 페이지는 100% 서버사이드에서 render된다.
loading이 일어나지 않는다. 즉, API가 돌아오기 전 까지 화면에 아무것도 안 보인다는 뜻이다.
소스 코드를 보면 HTML안에 리액트 컴포넌트의 render 결과가 들어있다.
server side rendering. 즉, 데이터가 유효할 때 화면이 보여지는 것과 loading 화면을 보여준 다음에 데이터를 받는 게 좋은지 선택해야 한다.
NextJS 자동으로 props들을 넣어줄거고 리액트가 받아서 흡수(hydration)한다고 말할 수 있다.
리액트가 다시 주도권을 쥐고 result 이용해 무엇이든 할 수 있는 것이다.
export default function Home({ results })
📌 아래 강의의 내용을 정리한 글입니다.
'프로그래밍 > Next' 카테고리의 다른 글
[성능 개선] Next.js 프로젝트 LCP 최적화하기 (0) | 2023.05.11 |
---|---|
캐싱, Cache-Control 알아보기 🥹 (0) | 2023.02.01 |
[Next] Dynamic Routes / Router Hook / Catch All (0) | 2022.07.08 |
[Next] CSS Modules / Styled JSX / Custom App (0) | 2022.07.08 |
[Next] Framework / Pages / Pre-Rendering / Routing (0) | 2022.07.08 |