์ค๋น๋ฌผ : ์๋ฒ ํด๋
, ๋ฆฌ์กํธ๋ก ์์ฑํ ํด๋ผ์ด์ธํธ ํด๋
์๋ฒ ํด๋ ์์ ํด๋ผ์ด์ธํธ ํด๋๋ฅผ ๋ด์ ๋ ์ํ๋ก ์์ ์ ์์ํ๋ค.
์๋ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์์ฑํด์ค๋ค.
npm install
npm install express
npm init -y
์๋๊ฐ ์๋ฒ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋ค.
const express = require('express');
const app = express();
const path = require('path');
app.listen(8080,function(){
console.log('์๋ฒ ์คํ ์๋ฃ!')
})
'/'
๊ฒฝ๋ก๋ก ์ ์์ ์๋ฒ์ ๋ด๊ฐ ์ํ๋ ๋ฆฌ์กํธ ํ์ผ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
์ด๋ ๋ฆฌ์กํธ ํ์ผ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ build ๋ฅผ ๋จผ์ ํด์ฃผ์ด์ผ ํ๋ค.
build์ ์์ฑ๋ html ํ์ผ์ ์๋ต์ผ๋ก ๋ณด๋ด์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
npm run build
๋น๋๋ฅผ ๋ง์ณค์ผ๋ฉด build ๋ด๋ถ์ ์ฌ๋ฌ๊ฐ์ ํ์ผ๋ค์ด ์์ฑ๋๋ค.
๊ทธ๋ฆฌ๊ณ server.js
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด๋ณด์.
์ด๋ ์๋ง๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ๋๋ก ์
๋ ฅํด์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๋ฐ๋ก app.use๋ก ๋ถ๊ฐ ์ฝ๋๋ฅผ ์ ์๋๋ฐ, ์ด๊ฒ ์์ด์ผ ํน์ ํด๋์ ํ์ผ๋ค์ ํจ๊ป ์ ์ก์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
const express = require('express');
const app = express();
const path = require('path');
app.listen(8080,function(){
console.log('์๋ฒ ์คํ ์๋ฃ!')
})
// ์ด๊ฒ ์์ด์ผ ํน์ ํด๋์ ํ์ผ๋ค ์ ์ก๊ฐ๋ฅ
app.use(express.static(path.join(__dirname,'my-todo-client/build')))
// '/'๊ฒฝ๋ก๋ก ์ ์์์ ์ ํ์ผ์ ๋ณด๋ด์ฃผ์!
app.get('/',(res,req)=>{
req.sendFile(path.join(__dirname,'my-todo-client/build/index.html'));
})
์ด์ nodemon server.js๋ฅผ ์คํํ๋ฉด ๋ด๊ฐ ์์ฑํ ๋ฆฌ์กํธ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ฒ์์ /detail
๋ก ์ ์ํ๋ฉด ๋ํ
์ผ ํ์ด์ง๋ก ์์ฒญํ๋ค.
๋ฐ๋ฉด ๋ฆฌ์กํธ์์ ๋ผ์ฐํฐ๋ก ๊ฒฝ๋ก๋ฅผ ๋ถ๊ธฐํ ๊ฒฝ์ฐ์๋ /detail
๊ณผ ๊ฐ์ด ๋ช
๋ น์ ์ฃผ์ด๋ ๋์ํ์ง ์๋๋ค.
์๋ํ๋ฉด /detail
์ด๋ ์๋ฒ์์ ํด๋น ํ์ด์ง๋ฅผ ์์ฒญํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
-> ๋ฆฌ์กํธ ๋ผ์ฐํฐ๊ฐ ์ฒ๋ฆฌํ๊ฒ ํ๊ณ ์ถ์ผ๋ฉด ๋งจ ์๋์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์.
app.get('*',(res,req)=>{
req.sendFile(path.join(__dirname,'my-todo-client/build/index.html'))
})
html์ ๊ฒฝ์ฐ์๋ (server-side Rendering)
db์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ -> ์๋ฒ๊ฐ html ํ์ผ์ ๋ฃ๊ณ -> html ํ์ผ์ ์ ์ ์๊ฒ ๋ณด๋ด๋ ๋ฐฉ์์ด์๋ค.
๋ฐ๋ฉด ๋ฆฌ์กํธ์์๋ (client-side Rendering)
db์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ -> ์๋ฒ๊ฐ ๋ฐ์ดํฐ ํ์ผ์ ๊ทธ๋๋ก -> ํ๋ก ํธ์๋๋ก ๋ณด๋ด๋ ๋ฐฉ์์ด๋ค.
๋ฐ์ ๋ฐ์ดํฐ๋ก ๋ฆฌ์กํธ๊ฐ html ํ์ผ์ ์์ฑ!
(์? ๋ฆฌ์กํธ๋ html ํ์ผ์ ์์ฑํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋๊น!)
๊ทธ๋์ DB์ ์๋ ์ํ๋ชฉ๋ก์ ๊ฐ์ ธ์์ ๋ฆฌ์กํธ์์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ผ๋ฉด ์ด๋ฐ ์์ผ๋ก ์ฝ๋๋ฅผ ์ง ๋ค.
์๋ฒ๋ ๋๊ตฐ๊ฐ /product๋ก GET์์ฒญ์ ํ๋ฉด DB์์ ๋ฐ์ดํฐ ๊บผ๋ด์ ๋ณด๋ด์ฃผ๋ผ๊ณ API๋ฅผ ์ง๋์ต๋๋ค.
๋ฆฌ์กํธ๋ ์ํ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ ์๋ฒ /product ์ฃผ์๋ก GET์์ฒญ ๋ ๋ฆฌ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ ๋ฐ์ดํฐ ๋ฐ์์ค๊ฒ ์ฃ ? ๊ทธ๊ฑธ ๊ฐ์ง๊ณ html์ ์ง์ด๋ฃ๋ ๋ง๋๋ก ๊ฐ๋ฐํ๋ฉด ๋ฉ๋๋ค.
๋ฆฌ์กํธ๋ ์๋ฒ์์ ํต์ ์ ๊ฑฐ์ ajax๋ก ์งํํฉ๋๋ค.
POST์์ฒญ, ๋ก๊ทธ์ธํด์ ์ธ์
๋ง๋ค๊ธฐ ์ด๋ฐ๊ฒ๋ ajax๋ก ์คํํ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด DB์ ๋ค์ด์๋ ์ํ๋ช ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
app.get('/detail',(res,req)=>{
req.json({name:'supark'})
})
์์ ๊ฐ์ด ์๋ฒ์ ํต์ ํ๊ธฐ ์ํด์๋ cors ์ค์ ์ ํด๋์ด์ผ ํต์ ์ด ์๋๋ค. ํฐ๋ฏธ๋์ cors ์ค์นํ
npm install cors
์๋ฒ app.listen ๋ฐ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค.
app.use(express.json());
var cors = require('cors');
app.use(cors());
const express = require('express');
const app = express();
const path = require('path');
app.listen(8080,function(){
console.log('์๋ฒ ์คํ ์๋ฃ!')
})
//ajax ์คํ ์๋๊ฒ ํ๊ธฐ ์ํด์
app.use(express.json());
var cors = require('cors');
app.use(cors());
// ์ด๊ฒ ์์ด์ผ ํน์ ํด๋์ ํ์ผ๋ค ์ ์ก๊ฐ๋ฅ
app.use(express.static(path.join(__dirname,'my-todo-client/build')))
//์๋ฒ์ ์
์ฅ์์. '/'์ด ์์ฒญ์ ๋ฐ์ผ๋ฉด. -> ์๋ต์ผ๋ก ์ ๊ฑฐ ๋ณด๋ด์ฃผ๊ณ
app.get('/',(res,req)=>{
req.sendFile(path.join(__dirname,'my-todo-client/build/index.html'));
console.log(req.json({name:'me'})) // -> ์๋ฒ์ ์๋ต์ผ๋ก ์ ๊ฑธ ๋ณด๋ด์ค
})