ssg(build time) vs SSR(request time)
ssg: 빌드 타임에 미리 정적 파일 생성
ssr: 특정 url 접근할 때 그때서야 pre-render
next-js 둘 다 제공함.
next.js활용하면 페이지별로 Pre-rendering 방식 선택 가능.
getStaticProps -> ssg
getServerSideProps -> ssr
-Marketing pages
-blog post
-E-commerce product listings
-Help and documentation
정적으로 만들어 놓으면 업데이트될 때 동안 한동안 변하지 않는 것들을 상대로 하면 좋다.
적용 여부 선택 기준
사용자가 페이지를 요청하기 전에 Pre-render 할 수 있는가?
Yes라면 SSG(로그인하기 전에도 볼 페이지를 미리 정할 수 있으면)
No 라면 SSR 혹은 ISR 혹은 CSR(로그인 구분 하고 나서 Pre-render)
만약에 SSG를 쓰고 있다가 SSR로 바꾸려고 하더라도 굉장히 편하다
getStaticProps에서 getServerSideProps로만 바꿔주면 되기 때문에..
ssg의 2가지 케이스
1. 외부 데이터 없이(외부 API, 외부 DATA, DB) 없이 정적인 것) pre-rendering
2. 외부 데이터를 가져와서(외부의 DB, API, DATA) pre-rendering
2번을 공부하기 위해 다른 파일을 읽어보자
https://nextjs.org/learn/basics/data-fetching/blog-data 들어가서
아래 코드들을 복사하자. 그리고 blog파일의 root에 "post" Folder를 만든 후
pre-rendering.md File 생성한다. 그 이후 아래 코드를 넣어준다.
---
title: 'Two Forms of Pre-rendering'
date: '2020-01-01'
---
Next.js has two forms of pre-rendering: **Static Generation** and **Server-side Rendering**. The difference is in **when** it generates the HTML for a page.
- **Static Generation** is the pre-rendering method that generates the HTML at **build time**. The pre-rendered HTML is then _reused_ on each request.
- **Server-side Rendering** is the pre-rendering method that generates the HTML on **each request**.
Importantly, Next.js lets you **choose** which pre-rendering form to use for each page. You can create a "hybrid" Next.js app by using Static Generation for most pages and using Server-side Rendering for others.
이후 하나 더.. ssg-ssr.md file도 만들어서 아래 코드를 복사 붙여 넣기 한다.
---
title: 'When to Use Static Generation v.s. Server-side Rendering'
date: '2020-01-02'
---
We recommend using **Static Generation** (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request.
You can use Static Generation for many types of pages, including:
- Marketing pages
- Blog posts
- E-commerce product listings
- Help and documentation
You should ask yourself: "Can I pre-render this page **ahead** of a user's request?" If the answer is yes, then you should choose Static Generation.
On the other hand, Static Generation is **not** a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request.
In that case, you can use **Server-Side Rendering**. It will be slower, but the pre-rendered page will always be up-to-date. Or you can skip pre-rendering and use client-side JavaScript to populate data.
---
title: 'When to Use Static Generation v.s. Server-side Rendering'
date: '2020-01-02'
---
이렇게 -으로 감싸진 것을 YAML Front Matter라고 한다. Head component에 넣어야 되는 Meta data처럼, 이 블로그 글에 대한 metadata를 담고 있다.
이 파일을 해석하기 위해선 yarn add gray-matter명령어를 설치해야 한다.
그리고 https://nextjs.org/learn/basics/data-fetching/implement-getstaticprops에 가서 6page에 있는 걸 복사. 이후 Root에 lib Folder 만들고,
post.js 생성
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
//Service가 돌고 있는 root 즉 blog에 있는,'posts' 파일(md file저장 해놓은 곳)
const postsDirectory = path.join(process.cwd(), 'posts');
export function getSortedPostsData()/*정렬된 데이터를 가져옴*/ {
// Get file names under /posts
//fs는 파일 시스템을 읽어오는 node.js의 라이브러리다.
const fileNames = fs.readdirSync(postsDirectory);
const allPostsData = fileNames.map((fileName) => {
// Remove ".md" from file name to get id
// .md를 제거하면 pre-rendering ssg-ssr만 남고
//그것을 id로 삼는다.
const id = fileName.replace(/\.md$/, '');
// Read markdown file as string
//fileName은 여전히 md가 있다.
//fullPath는 root에서 pre-rendering.md가 만들어질거고
const fullPath = path.join(postsDirectory, fileName);
//직접 utf-8형식으로 읽어서 fileContents에 담는다.
const fileContents = fs.readFileSync(fullPath, 'utf8');
//담고난 뒤엔 -으로 감싸진 부분만 해석 하기 위해 grey-matter 설치했다.
//matter로 감싸주면 matterResult로 metadata를 다 읽어낸다.
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents);
// Combine the data with the id
//id는 파일 이름이었고, 그것을 빼내주는 것이 getSortedPostsData 함수다.
return {
id,
...matterResult.data,
};
});
// Sort posts by date
//날짜가 느린것을 앞에보내고 날짜가 빠른 것을 앞에 보내는 것
//즉 최신 순이다.
return allPostsData.sort((a, b) => {
if (a.date < b.date) {
return 1;
} else {
return -1;
}
});
}
이후 index.js에서
import Head from 'next/head'
import Layout, { siteTitle } from '../components/layout'
import { getSortedPostsData } from '../lib/post'
import utilStyles from '../styles/utils.module.css'
//ssr로 바꾸고 싶으면 getServerSideProps로 바꾸면 끝임
export async function getStaticProps() {
//ssg Data가 담겨져 있다.
const allPostsData = getSortedPostsData()
return {
//ssg가 담겨있는 props retrun
props: {
allPostsData,
},
}
}
export default function Home({ allPostsData }) {
return (
{siteTitle}
I love coding 😍
(This is a sample website - you’ll be building a site like this on {' '} our Next.js tutorial.)
Blog
- {title}
{id}
{date}
)
}
//allPostsData를 map으로 돌면서 id key로 주고 title,id(파일이름),date를 준다.
CSR로 바꾸는 방법
root경로의 pages 폴더에서 에서 api 폴더를 하나 더 만들고
posts.js 파일 생성. 이후 아래 참조.
//getSortedPostsData 가져온다.
import { getSortedPostsData } from "../../lib/post"
export default function handler(req, res) {
const allPostsData = getSortedPostsData()
res.status(200).json({allPostsData})
}
이후 index.js로.. 여기서 getSortedPostsData import를 제거해줘야 한다.
import Head from 'next/head'
import { useEffect } from 'react'
import Layout, { siteTitle } from '../components/layout'
import utilStyles from '../styles/utils.module.css'
import React, { useState } from 'react';
//ssr로 바꾸고 싶으면 getServerSideProps로 바꾸면 끝임
//export async function getStaticProps() {
//ssg Data가 담겨져 있다.
//const allPostsData = getSortedPostsData()
//return {
//ssg가 담겨있는 props retrun
//props: {
//allPostsData,
//},
//}
//}
//CSR로 바꾸는 방법.
export default function Home() {
const [allPostsData, setAllPostsData] = useState([])
useEffect(()=>{
//posts에서 response가 오면 json으로 바꿔주고.data가 오면 A
fetch('/api/posts')
.then((res) => res.json())
.then((data) => setAllPostsData(data.allPostsData))
}, [])
return (
{siteTitle}
I love coding 😍
(This is a sample website - you’ll be building a site like this on {' '} our Next.js tutorial.)
Blog
- {title}
{id}
{date}
)
}
//allPostsData를 map으로 돌면서 id key로 주고 title,id(파일이름),date를 준다.
이렇게 CSR로 바꾸면 File System에서 읽은 값들이 Client Network tap에 보인다.
'Developer 지식' 카테고리의 다른 글
PDT,UDDT/기본자료형,사용자 정의 자료형 (0) | 2023.05.14 |
---|---|
mvn 설치 및 환경설정 및 h2데이터베이스 (0) | 2023.05.14 |
Windows11 Terraform 설치/환경변수 설정/Version check (0) | 2023.05.11 |
Intellij Ultimate Tomcat setting 방법 (0) | 2023.04.21 |
OSI 7계층 (0) | 2023.04.21 |