[๐Ÿ MongoDB] ๋ฆฌ์•กํŠธ ์„œ๋ฒ„์™€ ๋ชฝ๊ณ ๋””๋น„ ์—ฐ๋™!

dsfasdยท2022๋…„ 12์›” 5์ผ
0

์ค€๋น„๋ฌผ : ์„œ๋ฒ„ ํด๋”, ๋ฆฌ์•กํŠธ๋กœ ์ž‘์„ฑํ•œ ํด๋ผ์ด์–ธํŠธ ํด๋”

์„œ๋ฒ„ ํด๋” ์•ˆ์— ํด๋ผ์ด์–ธํŠธ ํด๋”๋ฅผ ๋‹ด์•„ ๋‘” ์ƒํƒœ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ค€๋น„!

์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

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๋กœ ๋ถ€๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ ์—ˆ๋Š”๋ฐ, ์ด๊ฒŒ ์žˆ์–ด์•ผ ํŠน์ • ํด๋”์˜ ํŒŒ์ผ๋“ค์„ ํ•จ๊ป˜ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

server.js

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'))
})

DB ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์•กํŠธ์—์„œ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด?

html์˜ ๊ฒฝ์šฐ์—๋Š” (server-side Rendering)

db์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ -> ์„œ๋ฒ„๊ฐ€ html ํŒŒ์ผ์— ๋„ฃ๊ณ  -> html ํŒŒ์ผ์„ ์œ ์ €์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค.

๋ฐ˜๋ฉด ๋ฆฌ์•กํŠธ์—์„œ๋Š” (client-side Rendering)

db์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ -> ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ -> ํ”„๋ก ํŠธ์—”๋“œ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.
๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ ๋ฆฌ์•กํŠธ๊ฐ€ html ํŒŒ์ผ์„ ์ƒ์„ฑ!
(์™œ? ๋ฆฌ์•กํŠธ๋Š” html ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ˆ๊นŒ!)

๊ทธ๋ž˜์„œ DB์— ์žˆ๋Š” ์ƒํ’ˆ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€์„œ ๋ฆฌ์•กํŠธ์—์„œ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค.

  1. ์„œ๋ฒ„๋Š” ๋ˆ„๊ตฐ๊ฐ€ /product๋กœ GET์š”์ฒญ์„ ํ•˜๋ฉด DB์—์„œ ๋ฐ์ดํ„ฐ ๊บผ๋‚ด์„œ ๋ณด๋‚ด์ฃผ๋ผ๊ณ  API๋ฅผ ์งœ๋†“์Šต๋‹ˆ๋‹ค.

  2. ๋ฆฌ์•กํŠธ๋Š” ์ƒํ’ˆ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ์„œ๋ฒ„ /product ์ฃผ์†Œ๋กœ GET์š”์ฒญ ๋‚ ๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  3. ๊ทธ๋Ÿผ ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๊ฒ ์ฃ ? ๊ทธ๊ฑธ ๊ฐ€์ง€๊ณ  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());

server.js ์ „์ฒด ์ฝ”๋“œ

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'})) // -> ์„œ๋ฒ„์˜ ์‘๋‹ต์œผ๋กœ ์ €๊ฑธ ๋ณด๋‚ด์คŒ 
})

profile
๊ธฐ๋ก์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„!

0๊ฐœ์˜ ๋Œ“๊ธ€