๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
2. Back-end/>> ๐Ÿ‘ Next.js

Next.js - React, Express.js ๊ทธ๋ฆฌ๊ณ  SSR์„ ํ•œ๋ฐฉ์—

by ๋ธ”๋ก๋ฉ”ํƒ€ 2022. 12. 20.

Next.js ๋Š”  React + Express.js + React-Router-Dom + Server Side Rendering  ๋ชจ๋‘ ํฌํ•จํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. 

 

Express.js์™€ React-Router-Dom์„ ๊ทธ๋Œ€๋กœ ์ œ๊ณตํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์„ฑ ๊ฐœ๋…์„ ๋‚ด์žฌํ™”ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๊ฒƒ ์ €๊ฒƒ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. 

 

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Next.js์˜ ๋ณธ์งˆ์ ์ธ ๊ฐœ๋…๋“ค์„ ๋น ๋ฅด๊ฒŒ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

Next.js ํ™ˆํŽ˜์ด์ง€์˜ Documentation ์˜ Getting Started๋ฅผ ๋ณด๋ฉด ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

npx create-next-app@latest .   ํ˜„์žฌ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์…‹ํŒ… command 

 

Next.js๋Š” 3๊ฐ€์ง€ ์‹คํ–‰ ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ฐœ๋ฐœํ™˜๊ฒฝ์‹คํ–‰           npm run dev
๋ฐฐํฌ ํŒŒ์ผ ์ƒ์„ฑ         npm run build
์„œ๋น„์Šค ์‹œ์ž‘              npm run start

 

๊ฐœ๋ฐœํ™˜๊ฒฝ์œผ๋กœ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

localhost ํฌํŠธ๋Š” 3000์œผ๋กœ ์›น์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.   

 

์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ์ด ๋˜๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด ์…‹ํŒ…์ด ๋œ๊ฒ๋‹ˆ๋‹ค.  ๐Ÿ‘๐Ÿ‘๐Ÿ‘

 

์ด์ œ ์ฝ”๋”ฉ์„ ์‹œ์ž‘ํ•ด ๋ณด์‹ญ๋‹ˆ๋‹ค.  main ์ฒ˜๋Ÿผ ์ฝ”๋”ฉ์˜ ์‹œ์ž‘์ ์œผ๋กœ ๊ฐ€ ๋ด…์‹œ๋‹ค. 

pages ๋ฐ‘์— index.js ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.  (ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ™•์žฅ์ž๋Š” .tsx ์ž…๋‹ˆ๋‹ค.)

์ด ๋ถ€๋ถ„์ด ํ™ˆํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.  ๋ฌธ๋ฒ•์€ ๋ฆฌ์•กํŠธ์— ๋งž๊ฒŒ ์ž‘์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

๊ฐ€์žฅ ๋จผ์ € ์‹œ์ž‘ํ•˜๋Š” Hello์„ ์ถœ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

Hello์„ ์ฐ์—ˆ์œผ๋‹ˆ ๋ฐฐํฌํ•˜๋Š” ๋ถ€๋ถ„์„ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

npm run build

 

.next ํด๋”์— ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๋นŒ๋“œ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. 

 

๊ทธ๋‹ค์Œ,  ์‹ค์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ• ๋•Œ๋Š”  ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.  next.js๋Š” ์„œ๋ฒ„๊นŒ์ง€ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์˜ฌ์ธ์› ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. 

npm run start

 

build, ์‹ค์„œ๋ฒ„ ์‹คํ–‰๊นŒ์ง€ ์•Œ์•„ ๋ณด์•˜์œผ๋‹ˆ,  ๋‹ค์‹œ dev๋ชจ๋“œ๋กœ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 

Route

์šฐ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ์‹ ๊ฒฝ์จ์•ผ ๋˜๋Š” ๋ถ€๋ถ„์ด Route ์ž…๋‹ˆ๋‹ค.  url์— ๋”ฐ๋ผ์„œ ui๋ฅผ ์–ด๋–ป๊ฒŒ ์‘๋‹ตํ• ๊ฒƒ์ธ๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š” ํ–‰์œ„์ž…๋‹ˆ๋‹ค. 

์‚ฌ์šฉ์ž๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ๋กœ                  ํŒŒ์ผ ์œ„์น˜

http://a.com/                            /pages/index.js
http://a.com/sub/                    /pages/sub/index.js
http://a.com/sub/1                   /pages/sub/[id].js
http://a.com/sub/2                   /pages/sub/[id].js

sub/1, sub/2์ฒ˜๋Ÿผ ๋™์ ์ธ ์ •๋ณด ์ผ ๊ฒฝ์šฐ๋Š” [id].js ์œผ๋กœ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.   

 

 

์ด์ œ ์„œ๋ฒ„์ชฝ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค. 

API Route

์„œ๋ฒ„์˜ API๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ๋ฐ์š”.   /pages/api ๋””๋ ‰ํ† ๋ฆฌ์— ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

http://a.com/api           /pages/api/index.js
http://a.com/api/1        /pages/api/[id].js
http://a.com/api/2        /pages/api/[id].js

 

pages/api/hello.js๋Š” ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

export default function handler( req, res) {
    res.status(200).json({ name: 'John Doe' })
}

์—ฌ๊ธฐ ์ฝ”๋“œ๋Š” Express.js ์™€ ๊ฐ™์€ Back-end ๊ธฐ์ˆ ์˜ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์— ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹œ๋ฉฐ ํด๋ผ์ด์–ธํŠธ์ชฝ์— ์‘๋‹ต์ด ๋ฉ๋‹ˆ๋‹ค.  ์ด๋•Œ status 200์€ ์‘๋‹ต์— ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์ฝ”๋“œ๊ฐ’์ž…๋‹ˆ๋‹ค.  ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋Š” json() ์•ˆ์— ๋„ฃ์–ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค 

 

 

/api/hello๋ฅผ  ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 

pages/api/[id].js๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.  id ๋ฐ›์€ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ถ€๋ถ„๋„ ์ฝ”๋“œ์— ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค. 

export default function handler(req, res) {
   res.status(200).json({ id: req.query.id })  
}

 

 

Reference

https://www.youtube.com/watch?v=ECMB4kUCKWQ&t=10s

๋Œ“๊ธ€