2024-03-26.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 4์ฃผ์ฐจ-2
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week4-2_2024-03-26
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ------ | ------------------------------- | ----------- | | 4์ฃผ์ฐจ | 4, 8์ฅ | SSR๊ณผ ESlint, ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | 293p~310p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: 9์30๋ถ~11์
Next.js ํบ์๋ณด๊ธฐ
Next.js
- ์ญ์ฌ
- PHP ๋์ฉํ์ผ๋ก ์ํด ๋ง๋ค์์์, SSR
- ๋น์ ํ์ด์ค๋ถ์ด ๊ณ ๋ คํ๋ SSR -> react-page
- Vercel
- SWR, SWC, Turbopack, Svelte ๋ฑ ์ํฅ๋ ฅ ์๋ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐ ๋ฐ ์ธ์
- eslint-config-next: ๊ตฌ๊ธ๊ณผ ํ์ ํด ๋ง๋ ์น ์งํ (core web vital)์ ๋์์ด ๋๋ ์งํ
- next.config.js
- reactStrictMode: ๋ฆฌ์กํธ ์๊ฒฉ ๋ชจ๋
- swcMinify:
- SWC ๋ฒ๋ค๋ง & ์ปดํ์ผ (๋ฐ๋ฒจ ๋์ฉ)
- ๋น ๋ฅด๋ค (Rust, ๋ฌ์คํธ๋ C/C++ ๋งํผ ๋น ๋ฆ + ๋ณ๋ ฌ ์ฒ๋ฆฌ)
Next13 page ๋ผ์ฐํ
pages/_app.tsx
- ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด ํ์ด์ง์ ์์์
- ์น ์ฑ ๊ณตํต ์ค์ ex) ์๋ฌ ๋ฐ์ด๋๋ฆฌ, reset.css, ์ ์ญ ๋ฐ์ดํฐ ์ ๊ณต ๋ฑ
- ๋๋๋ง ์์น
- app์์ console.log์ ์ฐ์ด๋ณด๋ฉด? => Next.js๋ฅผ ์คํํ ํฐ๋ฏธ๋์ ๊ธฐ๋ก
- ํ์ด์ง๋ฅผ ์ ํํ๋ฉด? => ๋ธ๋ผ์ฐ์ ์ ๋ก๊น
- ์ฆ, ์ต์ด์๋ ์๋ฒ ์ฌ์ด๋ ๋๋๋ง, ์ดํ์๋ app.tsx์ ๋๋๋ง ์คํ
pages/_document.tsx
- DOM ์์
- hydrate ๋๊ธฐ ์ ์ํ
- Next 13, ๋ ๊ฐ์ง head
- next/document์ head(DOM), next/head(SEO metadata)
- CSS-in-JS ์คํ์ผ์ ์๋ฒ์์ ๋ชจ์ HTML๋ก ์ ๊ณตํ๋ค
| ๊ตฌ๋ถ | ๋๋๋ง ์์น | ๊ธฐ๋ฅ | | ------------- | ----------------- | ------------- | | _app.tsx | ์๋ฒ์ ํด๋ผ์ด์ธํธ | Next๋ฅผ ์ด๊ธฐํ | | _documet.tsx | ์๋ฒ | HTML ์ค์ |
pages/_error.tsx
- _error.tsx
import { NextPageContext } from "next";
function Error({ statusCode }: { statusCode: number }) {
return (
<p>
{statusCode ? `์๋ฒ์์ ${statusCode}` : "ํด๋ผ์ด์ธํธ์์"} ์๋ฌ๊ฐ
๋ฐ์ํ์ต๋๋ค
</p>
);
}
Error.getInitialProps = ({res,err}: NextPageContext) => {
const statusCode = res.statusCode: err? err.statusCode:"";
return {statusCode}
}
export default Error;
pages/404.tsx
pages/500.tsx
- ์๋ฒ ์๋ฌ ํธ๋ค๋ง
- error์ 500 ์๋ค๋ฉด? 500 ๋จผ์ ์คํ
pages/index.tsx
- react-pages์์ ์๊ฐ์ ๋ง์ ๋ง๋ค์ด์ง ํ์ด์ง
| ํ์ด์ง | ๋ด์ฉ | ์ฃผ์ | | -------------------------- | -------------------------------------------------------------------------------------------- | ---------------------- | | pages/index.tsx | ์น ์ฌ์ดํธ์ ๋ฃจํธ | / | | pages/hello.tsx | pages ์๋ต, ํ์ผ๋ช ์ผ๋ก ์ฃผ์ ์ ๊ทผ | /hello | | pages/hello/world.tsx | ๋๋ ํ ๋ฆฌ์ ๊น์ด๋งํผ ์ฃผ์ ์ค์ | /hello/world | | pages/hello/[greeting].tsx | []๋? ์ด๋ค ๋ฌธ์์ด๋ ๋ค์ด๊ฐ ์ ์์ (๋ค๋ง ์ด๋ฏธ ์ ์๋ ์ฃผ์๊ฐ ์๋ค๋ฉด ์ ์๋ ์ฃผ์๊ฐ ์ฐ์ ) | /hello/1 | | pages/hi/[โฆprops] | [โฆ]๋? ์ ๊ฐ ์ฐ์ฐ์์ ๋์ผ, ๋ชจ๋ ํ์์ ์ฃผ์ (props๋ผ๋ ๋ณ์์ ๋ฐฐ์ด๋ก ๊ฐ) | /hello/hi/bonjour/good |
// pages/hi/[...props].tsx
export default function HiAll({ props: serverProps }: { props: string[] }) {
const {
query: { props },
} = useRouter();
useEffect(() => {
console.log(JSON.stringify(props) === JSON.stringify(serverProps)); // true
});
...
}
export const getServerProps = (context: NextPageContext) =>{
// ์๋ฒ์์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
const {
query: {props}, // string | string[] | undefined
} = context
}
server routing๊ณผ client routing์ ์ฐจ์ด
-
Nextjs๋ ์ฌ์ ๋๋๋ง์ ์ง์ํ๋ค. = ์ต์ด ํ์ด์ง ๋๋๋ง์ ์๋ฒ์์ ์ํ
- a๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ: console.log์ ๊ฒฝ์ฐ 2๋ฒ(์๋ฒ์์ ๋๋๋ง/ํด๋ผ์ด์ธํธ hydrate)
- link๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ: ํด๋ผ์ด์ธํธ์์ ํ์ํ ์๋ฐ์คํฌ๋ฆฝํธ๋ง ๋ถ๋ฌ์จ ๋ค ๋ผ์ฐํ ํ๋ CSR
-
๋ ๊ฐ์ง ์ฅ์ ์ ์ด๋ฆฌ๊ธฐ ์ํ ๋ฐฉ์: ์ต์ด ํ์ด์ง ๋น ๋ฅด๊ฒ ์ ๊ณต + ์ฑ๊ธ ํ์ด์ง์ ์์ฐ์ค๋ฌ์ด ๋ผ์ฐํ
<a>
=><Link>
- window.location.push ๋์ router.push๋ฅผ ์ฌ์ฉ
์๋ฒ ์ฌ์ด๋ ๋ฐํ์ ์ฒดํฌ
export default function Hello() {
console.log(typeof window === "undefined" ? "์๋ฒ" : "ํด๋ผ");
}
- getServerSideProps๋ฅผ ์ ๊ฑฐํ๋ฉด?
- ์๋ฒ ์ฌ์ด๋ ๋๋๋ง์ด ํ์ ์๋, ๋น๋ ์์ ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ๋๋ ํ์ด์ง๋ก ๊ฐ์ฃผ
๋น๋ ์์
์์ ๋ฏธ๋ฆฌ ํธ๋ฆฌ์์ดํน- ๋ชจ๋ ์์
์ด
์๋ฒ
์์ ์ผ์ด๋๋ ๊ฒ์ ์๋
- ๋ชจ๋ ์์
์ด
pages/api/
export default function handler(req: NextApiRequest, res: NextApiResponse) {
res.status(200).json({ name: "John Doe" });
}
- BFF(backend-for-frontend)
- CORS(Corss-Origin Resource Sharing) ๋ฌธ์ ๋ฅผ ์ฐํํ๊ธฐ ์ํด ์ฌ์ฉ