1. SSR : getServerSideProps 함수
- Server에서만 실행 / 브라우저에서 실행 x (콘솔에서 확인 x)
- runtime에서만 실행
- context 객체를 통해 쉽게 query에 접근 가능
- Context 객체를 통해, 클라이언트 부분에서는 useRouter()를 사용해서 접근하기
- Post Page에서는 next router를 통해 URL Query 파라미터에 접근 가능
- getServerSideProps의 반환 값은 Post page의 props로 전달
// pages/ssr/[id].tsx
import { GetServerSideProps } from 'next';
import { useRouter } from 'next/router';
import React from 'react';
interface PostInterface {
userId: number;
id: number;
title: string;
body: string;
}
interface PostProps {
post: PostInterface;
}
const Post = ({ post }: PostProps) => {
const router = useRouter();
const { id } = router.query;
return (
<div>
post : {id}
<h2>{post.title}</h2>
<p>{post.body}</p>
</div>
);
};
export default Post;
export const getServerSideProps: GetServerSideProps<PostProps> = async (context) => {
const { id } = context.query;
const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
const post = await response.json();
return {
props: {
post,
},
};
};
2. SSG : getStaticProps 함수 (1)
- Server에서만 실행 / 브라우저에서 실행 x (콘솔에서 확인 x)
- runtime에서만 실행 (yarn build 실행할때만 실행)
- 다이나믹 라우트의 경우 getStaticPaths 함수를 통해 관련된 정보 리턴 필요!
- getStaticProps의 return 값은 Post page의 props로 전달
3. SSG : getStaticPaths 함수 (2)
- getStaticProps를 이용하는 페이지에서 다이나믹 라우트를 제공하기 위함
- 미리 어떤 paths를 Static Site Generation 할 지 정해두는 역할
- getStaticPaths에서는 getStaticProps 가 있어야 실행
- getStaticPaths의 return 값은 getStaticProps의 props로 전달
* 빌드 전 .next 파일 삭제 필요시 : rm -rf .next
> yarn build > .next 폴더/ssg 폴더 안에 getStaticPaths에서 설정한 id:1 / id:2 파일이 생성
// pages/ssg/[id].tsx
import { GetStaticProps } from 'next';
import { useRouter } from 'next/router';
import React from 'react';
interface PostInterface {
userId: number;
id: number;
title: string;
body: string;
}
interface PostProps {
post: PostInterface;
}
const Post = ({ post }: PostProps) => {
const router = useRouter();
const { id } = router.query;
//getStaicPaths()에서 fallback :true로 설정시
//요청하지 않은 페이지는 loading.. 보여주고 페이지를 서버에서 생성 후 보여줌
if (router.isFallback) {
return <div>Loading..</div>;
}
return (
<div>
post : {id}
<h2>{post.title}</h2>
<p>{post.body}</p>
</div>
);
};
export default Post;
export const getStaticPaths = () => {
return {
paths: [{ params: { id: '1' } }, { params: { id: '2' } }],
fallback: false,
};
};
export const getStaticProps: GetStaticProps<PostProps> = async ({ params }) => {
const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${params?.id}`);
const post = await response.json();
return {
props: {
post,
},
// revalidate: 5,
};
};
> getStaticPaths 함수의 fallback
: [ fallback :false] 제공하지 않는 페이지=> 모두 404로 연
: [ fallback :true] 제공하지 않는 페이지를 요청할 경우,
fallback 페이지를 먼저 보여주고 + 해당 페이지를 서버에서 생성
: [ fallback :blocking] 제공하지 않는 페이지를 요청할 경우,
페이지를 서버에서 생성한 이후에 보여줌.
4. ISR: getStaticProps 함수 + revalidate 속성 추가
: static page에 요청이 들어오고 나서 5초 이후에는 다시 한 번 해당 페이지를 빌드
export const getStaticProps: GetStaticProps<PostProps> = async ({ params }) => {
//json-server(localhost4000)
const response = await fetch(`https://localhost:4000/posts/${params?.id}`);
const post = await response.json();
return {
props: {
post,
},
revalidate: 5,
};
};
끝.
'Next.js' 카테고리의 다른 글
next.js 오류 : Invalid src prop~ (0) | 2024.02.25 |
---|---|
#04 Next.js (Pages Router) + TypeScript : _app, _document, 404 (0) | 2024.02.22 |
#02 Next.js (Pages Router) : 설치, 라우터, api폴더 (0) | 2024.02.22 |
#01 Next.js (Pages Router) 개념, 렌더링 방식 4가지 (0) | 2024.02.21 |
next.js : 서버 컴포넌트에서 클라이언트 컴포넌트 분리 (0) | 2023.12.20 |