Skip to content
Jinlee Jeong edited this page Mar 5, 2020 · 3 revisions

Next.js ํŠœํ† ๋ฆฌ์–ผ ๋ฒˆ์—ญ Link

https://brunch.co.kr/@hee072794/81


Next.js

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ๋ Œ๋”๋ง์„ ํ•œ๋‹ค.

  2. ๋” ๋น ๋ฅด๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์Šคํ”Œ๋ฆฟํŒ…์„ ์ง„ํ–‰ํ•œ๋‹ค.

    (์ฝ”๋“œ ์Šคํ”Œ๋ฆฟํŒ… : ๋ธŒ๋ผ์šฐ์ € ๋กœ๋”ฉ ์‹œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œ ํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋กœ๋“œ)

  3. ๊ฐ„๋‹จํ•œ ๋ผ์šฐํŒ…์„ ์ œ๊ณตํ•œ๋‹ค. (pages)

  4. HMR(Hot Module Replacement)์„ ์ง€์›ํ•˜๋Š” WebPack ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค.

Next.js ์‹œ์ž‘

mkdir hello-next cd hello-next

npm init -y

npm install react react-dom next

mkdir pages

โ˜…โ˜… ๋ชจ๋“  ๋ผ์šฐํ„ฐ๋“ค์€ ๊ณ ์ • ๋„ค์ด๋ฐ์ธ pages ์•ˆ์— ๋“ค์–ด๊ฐ€์•ผ next๊ฐ€ ์ธ์ง€ํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. npm run dev

pages/index.js ํŒŒ์ผ ์ƒ์„ฑ

const Index = () => {
   return (
      <div>
         <p>Hello Next.js</p>
      </div>
)}
export default Index

Next.js Link ๋ผ์šฐํŒ…

import Link from 'next/link'

์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ Link Tag ์ƒ์„ฑ ๊ฐ€๋Šฅ (pages/about.js ์ƒ์„ฑ ํ›„)

<Link href="/about">
   <a>About Page</>
</Link>

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋งํฌ๋ฅผ ์„ค์ • ํ•œ ํ›„, Anchor, Button ํƒœ๊ทธ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ, ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ์‹œ, Index ํŽ˜์ด์ง€๋กœ ์ด๋™

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋งํ•˜๊ธฐ

import Header from './Header'
   const Layout = (props) => (
      <div>
         <Header/>
         {props.children}
      </div>
   )
export default Layout

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import Layout from '../components/MyLayout.js
   export default () => (
      <Layout>
         <p>Hello Next.js</p>
      </Layout>
   )

** ๋งŒ์•ฝ ์œ„์— props.children์„ ์‚ญ์ œํ•˜๋ฉด, Layout ์—˜๋ฆฌ๋จผํŠธ ํ•˜์œ„์— ์žˆ๋Š” pํƒœ๊ทธ ๋“ฑ์„ ๋ Œ๋”๋ง ํ•˜์ง€ ๋ชปํ•œ๋‹ค. **

์ฟผ๋ฆฌ ๋ฌธ์ž์—ด

<Link href={'/post?title=${props.title}'}>
   <a>{props.title}</a>
</Link>

props๋กœ ์ „๋‹ฌ๋œ, ํƒ€์ดํ‹€์„ ๊ฐ€์ง€๊ณ  ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด๋กœ URL์ด ์ž‘์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.


ํ•˜์ง€๋งŒ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ํŽ˜์ด์ง€ ์ž์ฒด .jsํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 400 Err ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!

์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ์ž์ฒด๋กœ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜์˜ as๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

as props ์‚ฌ์šฉ

as props๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ ํžˆ์Šคํ† ๋ฆฌ์—์„œ ์ฆ‰, ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ํ›„ ์•ž์œผ๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ์–ตํ•˜๋„๋ก ํ•œ๋‹ค.

  • ํŠœํ† ๋ฆฌ์–ผ 5ํŽธ ์ฐธ์กฐ

์œ„์— 400 Err ์ฝ”๋“œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Next.js ์ปค์Šคํ…€ ์„œ๋ฒ„ API๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ…Œ์ŠคํŠธ Express(Node.js) ์‚ฌ์šฉ https://brunch.co.kr/@hee072794/87

=====================================================================================================================

Next.js with styled-component

SSR์€ ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋งˆ๋‹ค HTML์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ์ด ๋๋‚˜๊ธฐ ์ „์— ๋ฐ”๋กœ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ™”๋ฉด์„ ๋ณด๋‚ด์ค˜์„œ ์‚ฌ์ดํŠธ์˜ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ CSS-in-JS๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ์Šคํƒ€์ผ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋“ค์–ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— CSS๊ฐ€ staticํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด dynamicํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋”ฉ์„ ๋๋‚ด๊ธฐ ์ „์— ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์€ HTML์ด ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

Next.js๋Š” ๋ Œ๋”๋ง์ด ๋  ๋•Œ pages ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์ด ๋ Œ๋”๋ง ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปค์Šคํ„ฐ ๋งˆ์ด์ง•ํ•˜์—ฌ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Next.js์—์„œ styled-components ๊ฐ™์€ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ SSR์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” , ํƒœ๊ทธ๋ฅผ ๋ณด๊ฐ•ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML ๊ตฌ์กฐ๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ปค์Šคํ…€ ๋Š” Next.js์˜ /pages์— _document.js ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, _document.js๋Š” HTML ๋ฌธ์„œ๋กœ ์ปค์Šคํ…€ Document๋ฅผ ๋งŒ๋“ค ๋•Œ๋งŒ ์ž‘์„ฑ์ด ํ•„์š”ํ•˜๋ฉฐ ์ƒ๋žต๋œ ๊ฒฝ์šฐ Next.js๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ ์ฐธ์กฐ Next.js with Styled-component

=====================================================================================================================

Next.js with axios

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Next.js์—์„œ getInitialProps๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์„ค์ •ํ•ด์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ props๋กœ ์‚ฌ์ „์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋ง ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.