[Back-end๐Ÿฆ] #41 node.js - CRUD ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ!

๋˜์ƒยท2021๋…„ 12์›” 27์ผ
7

front-end

๋ชฉ๋ก ๋ณด๊ธฐ
57/58

์˜ค๋Š˜์€ ์‹ค์‹œ๊ฐ„ ๊ฐ•์˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๋ผ์ด์–ธ์˜ '์ผ๋‹จ ๋งŒ๋“œ๋Š” node.js'๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋Š” ๋‚ ์ด์—ˆ๋‹ค!! ํ•˜๋ฃจ๋งŒ์— ๋…ธ๋“œ๋ฅผ ๋‹ค ๋“ฃ๋Š”๋‹ค๊ณ ..? ๋ฐฑ์—”๋“œ์— ใ…‚๋„ ๋ชจ๋ฅด๋Š”๋ฐ..? ์‹ถ์—ˆ์ง€๋งŒ, ๊ฐ•์˜๋ฅผ ๋“ฃ๋‹ค๋ณด๋‹ˆ ์กฐ๊ธˆ์€ ๊ฐ์ด ์™”๋‹ค. ์ด ๊ฐ์„ ๋†“์น˜์ง€ ์•Š๊ณ  ๋ณต์Šตํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์•„์„œ, ํŽซ ํ”„๋กœ์ ํŠธ ๋ถ€๋ถ„์€ ๋ณต์Šต ๋๋‚˜๊ณ  ์ด์–ด์„œ ๋“ฃ๊ธฐ๋กœ ํ•˜๊ณ  ์˜ค๋Š˜ ๋“ค์€ CRUD ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ๋ฅผ ๋ณต์Šตํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

1. node.js

Node.js๋Š” JavaScript ๋Ÿฐํƒ€์ž„ (์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ)์ด๋‹ค.

  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜
  • Non-blocking I/O
  • Single Thread

-> ์ด ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด์„œ ์ œ๋Œ€๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!! ์ž์„ธํ•œ ๋‚ด์šฉ์€ #40 node.js ์— node.js์˜ ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์„ ์ถ”๊ฐ€๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.



2. promise, async, await

์ฝœ๋ฐฑ ์ง€์˜ฅ์—์„œ ๋น ์ ธ๋‚˜์˜ค๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ•๋“ค! #29 ๋น„๋™๊ธฐ ์ฒซ๊ฑธ์Œ ์ˆ˜์—…์„ ๋“ค์—ˆ์—ˆ์ง€๋งŒ, ์•„์ง ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•ด ๋ณผ ๊ธฐํšŒ๋Š” ์—†์—ˆ์–ด์„œ ๋‹ค์‹œ ์ •๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

Promise์˜ ์ƒํƒœ

  • pending : ๋Œ€๊ธฐ ์ƒํƒœ
  • fulfilled : ์ดํ–‰์ƒํƒœ
  • rejected : ์‹คํŒจ ์ƒํƒœ

1. Promise

function sayHello() {
    return new Promise((resolve, reject) => {
        const hello = "Hello Hello";
        resolve(hello);
        // reject(new Error());
    });
}

sayHello()
    .then((resolvedData) => {
        console.log(resolvedData);
      // ์•ž์—์„œ return ํ•˜๋ฉด ๋’ค์˜ then์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ง.
        return resolvedData;
    })
    .then((resolvedData) => {
        console.log(resolvedData);
        return resolvedData;
    })
    .then((resolvedData) => {
        console.log(resolvedData);
    })
    .catch((error) => {
        console.log(error)
    });

์ „์— ๋‹ค๋ค˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Promise๋ฅผ ์ƒ์„ฑํ•˜๊ณ  then, catch, finally ๋กœ ๋‹ค์Œ์— ํ•  ์ž‘์—…์„ ์ ์–ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ then์„ ๋„ˆ๋ฌด ๋งŽ์ด ์“ฐ๋Š” ๊ฒƒ๋„ ์ฝ๊ธฐ ์–ด๋ ต๊ณ  ์–ด๋–ค ๋™์ž‘์„ ํ•  ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— async, await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


2. async, await

async function test() {
    // await : ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚œ ๋‹ค์Œ์— ๋ฐ‘์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค. (๋™๊ธฐ)
    // await๋ฅผ ์“ฐ๋ ค๋ฉด ํ•จ์ˆ˜์— async๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
    const hello1 = await sayHello();
    console.log(hello1);
}
test();



3. ์„œ๋ฒ„ ๊ตฌ์ถ• ์ค€๋น„

  • ์„œ๋ฒ„ : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•ด์ฃผ๋Š” ์žฅ์น˜. literally server (์š”์ฒญ์— ๋งž๋Š” ์ •๋ณด๋ฅผ serve ํ•ด ์ค€๋‹ค.)
  • localhost : ํ˜„์žฌ ์ปดํ“จํ„ฐ์˜ ๋‚ด๋ถ€ ์ฃผ์†Œ - ์„œ๋ฒ„ ๊ฐœ๋ฐœ ์‹œ ํ…Œ์ŠคํŠธ ์šฉ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. 1ํ•™๋…„ ํ”„๋กœ์ ํŠธ ๊ณผ๋ชฉ ๋“ค์„๋•Œ, ์•„ํŒŸ์น˜ + php๋กœ localhost ๋กœ๊ทธ์ธ์ฐฝ ๋งŒ๋“ค์—ˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ์„œ๋ฒ„๋ฅผ ์ผœ๊ณ  ์ ‘์†ํ•œ๊ฑด์ง€... 4๋…„๋งŒ์— ์•Œ์•˜๋‹ค....
  • port : ์„œ๋ฒ„ ๋‚ด์˜ ํ”„๋กœ์„ธ์Šค ๋ฒˆํ˜ธ - ์„œ๋ฒ„์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์ผ์„ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํฌํŠธ ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

1. Postman

-> ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘๊ทผํ•˜๋ฉด ์„œ๋ฒ„์˜ ์ผ๋ถ€๋ถ„์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Postman์„ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

method, url, body ๋ฅผ ๋„ฃ๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์‘๋‹ต์ด ์–ด๋–ป๊ฒŒ ์˜ค๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค. ์ฒ˜์Œ์—๋Š” ์–ผ๋ ˆ๋ฒŒ๋ ˆ ์„ ์ƒ๋‹˜์„ ๋”ฐ๋ผ ์„ค์น˜ํ–ˆ๋Š”๋ฐ, UI๊ฐ€ ๊น”๋”ํ•ด์„œ ๋ณด๊ธฐ ํŽธํ•˜๋‹ค.


2. ๊ฐ„๋‹จํ•œ API ์„œ๋ฒ„

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•ด์„œ ๋ณด๋‚ด๋Š” ์‹์˜ ์„œ๋ฒ„์ด๋‹ค.

const http = require("http");

// http : ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ชจ๋“ˆ.
http
    // createServer : ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์š”์ฒญ, ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜.
    .createServer((request, response) => {
        // url์— ๋”ฐ๋ฅธ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
        if(request.url === "/") {
          
            // ์‘๋‹ต์— 200๋ฒˆ(์ž˜ ๋“ค์–ด๊ฐ€๋ฉด 200)์„ ์จ์„œ ์ค€๋‹ค.
            response.writeHead(200);
          
            // ์‘๋‹ต์ด ๋๋‚  ๋•Œ, "main url" ๋„ ํ•จ๊ป˜ ์ค€๋‹ค.
            // end์— ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋ฉด http body์— ์ด ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ„๋‹ค.
            response.end("main url");
          
        } else if (request.url === "/upload") {
            response.writeHead(200);
            response.end("upload url");
        } else if (request.url === "/delete") {
            response.writeHead(200);
            response.end("delete url");
        } else {
            response.writeHead(404);
            response.end("Not found!!");
        }
    }).listen(3000, () => {
        console.log("port 3000 ์ ‘์† ์™„๋ฃŒ");
    });




3. Express

1. npm (node package manager)

npm

  • node.js๋กœ ์ด๋ฏธ ๋งŒ๋“ค์–ด๋†“์€ ํŒจํ‚ค์ง€(ํ”„๋กœ๊ทธ๋žจ)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ, ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํˆด!
  • ํŒจํ‚ค์ง€ ์ค‘์—๋Š” ์„œ๋กœ ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ๊ฒƒ๋“ค๋„ ์žˆ๊ณ , ๋ฒ„์ ผ๋งˆ๋‹ค ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, package.json ์„ ํ†ตํ•ด ๋ฒ„์ ผ, ์˜์กด์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

npm์„ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , package์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ์„ค์ •์„ ํ•ด๋ณด์•˜๋‹ค.

npm init
# ์„ ์ง„ํ–‰ํ•˜๋ฉด, package.json ์— ์ •๋ณด๋ฅผ ๋„ฃ๋Š” ์ฐฝ์ด ๋œฌ๋‹ค.
# ๋Œ€๋ถ€๋ถ„์˜ ์ •๋ณด๋ฅผ ์•Œ์•„์„œ ์ฑ„์›Œ์ค˜์„œ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ์ €์ž ์ด๋ฆ„์„ ์ œ์™ธํ•˜๊ณค ๊ทธ๋ƒฅ ๋น„์šฐ๊ณ  ์ง„ํ–‰ํ–ˆ๋‹ค.
# ์ž…๋ ฅํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ package.json ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

// package.json
{
  "name": "npm_test", // ์ด๋ฆ„
  "version": "1.0.0", // ํ”„๋กœ์ ํŠธ ๋ฒ„์ ผ
  "description": "", // ์„ค๋ช…
  "main": "index.js", // ์‹คํ–‰ํ•  js ํŒŒ์ผ ์ด๋ฆ„
  "scripts": { // ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅํ•  ๋ช…๋ น์–ด
    "test": "echo \"Error: no test specified\" && exit 1",
    "hello": "echo hello"
  },
  // git repository : ์‚ฌ์šฉํ•  ๊นƒ ์ €์žฅ์†Œ ์ฃผ์†Œ
  // keywords : ๋‚˜์ค‘์— ์ฐพ์„ ๋•Œ ์‚ฌ์šฉํ•  ํ‚ค์›Œ๋“œ
  "author": "EJ",
  "license": "ISC"
}
npm run test # test command ์—์„œ ์„ค์ •ํ•œ ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅด๋ฉด, ํ•ด๋‹น ๋™์ž‘์„ ํ•œ๋‹ค.
npm run hello # hello

2. express

  • express : ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ.
  • framework : ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋Š” 'frame', ๊ธฐ์ดˆ ํ‹€์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ. ์ฝ”๋“œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๋‹ค. <-> library : ์ฝ”๋“œ๋ฅผ ์ด๋ฏธ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ. ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
  • express-generator : express์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

express ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

# ์ฒ˜์Œ์—๋Š” ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ธ๊ฐ€ ํ–ˆ๋Š”๋ฐ, ๋ณต์Šตํ•˜๋ฉด์„œ ๋‹ค์‹œ ๋ณด๋‹ˆ๊นŒ ์ดํ•ด๊ฐ€ ๊ฐ„๋‹ค.
bin/www - ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํŒŒ์ผ. ์‚ฌ์šฉํ•  ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์—ฌ๊ธฐ์„œ ์ง€์ • ๊ฐ€๋Šฅ.
public/images js css - ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋“ค
routes - ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ ์ €์žฅ, ์‹ค์ œ ์„œ๋ฒ„ ๋กœ์ง ์ž‘์„ฑ # ์–ด๋–ค url์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ์–ด๋–ค ๋™์ž‘์„ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋งํ•˜๊ณ , ์‹ค์ œ๋กœ ์šฐ๋ฆฌ ์ฝ”๋“œ๋„ ๊ฑฐ์˜ ์—ฌ๊ธฐ์„œ ์ž‘์„ฑํ–ˆ๋‹ค.
views - ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ .jade .ejs : HTML ์•ˆ์— <% js %> ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ํ˜•์‹์˜ ํŒŒ์ผ์ด๋‹ค. #.ejs๊ฐ€ html๊ณผ ๋” ์œ ์‚ฌํ•ด์„œ ์šฐ๋ฆฌ๋Š” .ejs๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
app.js - ํ•ต์‹ฌ์ ์ธ ์„œ๋ฒ„ ์—ญํ• . ๋ผ์šฐํŒ…์˜ ์‹œ์ž‘์ 
package.json - ์˜์กด์„ฑ/๋ฒ„์ ผ ๊ด€๋ฆฌ

express ๋ฅผ ์„ค์น˜ํ•˜๊ณ , ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์•˜๋‹ค.

npm install express
# package-lock.json : ์„ค์น˜ํ•œ ๋ชจ๋“  ํŒจํ‚ค์ง€ ํŒŒ์ผ ๋ฒ„์ ผ ์ •๋ณด ์ €์žฅ
# node-modules : ๋ชจ๋“  ์˜์กด์„ฑ ์žˆ๋Š” ํŒจํ‚ค์ง€๋“ค์„ ํ•ด๋‹น ํด๋”์— ๋„ฃ์–ด์„œ ๊ด€๋ฆฌ
npm install -D nodemon
# -D : ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉ (์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ X)
sudo npm install -g express-generator nodemon
# -g : global ๋ชจ๋“  ํŒจํ‚ค์ง€์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ. ํ•œ๋ฒˆ ์„ค์น˜ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธํ•ด์„œ ์‚ฌ์šฉ
sudo npm install -g express-generator

express --ejs first-project # views ํŒŒ์ผ์„ ejs ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค. 
cd first-project
npm install # package.json์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ ์„ค์น˜
npm start # express๋กœ ๊ตฌ์„ฑ๋œ ์„œ๋ฒ„ ์‹คํ–‰.

index.ejs ๋ฅผ ์ˆ˜์ •ํ•ด์„œ express project ๊ธฐ๋ณธ ๋ฌธ๊ตฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์›๋ž˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์„œ๋ฒ„๋ฅผ ๊ป๋‹ค ์ผœ์•ผ ํ•˜๋Š”๋ฐ, nodemon ./bin/www ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋ฒ„๋ฅผ ๊ป๋‹ค ์ผœ์ง€ ์•Š์•„๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋œ๋‹ค.

  // ์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ๋ฉด npm start๋กœ nodemon์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  "scripts": {
    "start": "nodemon ./bin/www"
  },

3. Routing

routing : ์š”์ฒญ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๊ฒƒ. ๊ธธ ์ฐพ๊ธฐ!
express ํ™˜๊ฒฝ์—์„œ๋Š” routing ์„ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

// app.js
// url์ด / ์ด๋ฉด indexRouter๋กœ, /users๋ฉด usersRouter์— ํ•ด๋‹น ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. 
// ๋’ค๋กœ url์ด ๋” ๋ถ™์œผ๋ฉด index.js, users.js ์•ˆ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. 4์—์„œ ๊ตฌํ˜„ํ•  ๊ฒƒ์ž„!
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

app.use('/', indexRouter);
app.use('/users', usersRouter);

4. HTTP method

CRUD (์„œ๋ฒ„์˜ ๊ธฐ๋ณธ)

  • POST : CREATE - ์š”์ฒญ๋œ ์ž์›์„ ์ƒ์„ฑ
  • GET : READ - ์š”์ฒญ๋œ ์ž์›์„ ์ฝ์Œ
  • PUT : UPDATE - ์š”์ฒญ๋œ ์ž์›์„ ์ˆ˜์ •
  • DELETE : DELETE - ์š”์ฒญ๋œ ์ž์›์„ ์‚ญ์ œ
// GET, POST, PUT, DELETE ๋ฉ”์„œ๋“œ๋กœ data๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ด๋ณด๋Š” ๊ฒƒ!
var express = require('express');
var router = express.Router();

// post, put, delete๋ฅผ ํ•  ๋•Œ data๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด.
let arr = [];

/* GET home page. */
router.get('/read', (req, res) => {
  res.status(200).json({
    message: "read ์„ฑ๊ณต"
  });
});

// POST method
router.post('/create', (req, res) => {
  // req.body.data ๋Š” request์—์„œ ๋ณด๋‚ด๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค. 
  // request์— ๋ณด๋‚ธ๊ฒŒ { "key": "123" } ์ด๋ฉด req.body.key๋กœ ๋ฝ‘์•„์•ผํ•œ๋‹ค.
  // const data = req.body.data; 
  const { data } = req.body; // ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์œผ๋กœ ํ•œ๋ฒˆ์— ๋ฝ‘๊ธฐ
  arr.push(data);
  res.status(200).json({
    message: "create ์„ฑ๊ณต",
    result: arr // response์— data๋„ ๊ฐ™์ด ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค.
  });
});

// PUT method
router.put("/update/:id", (req, res) => {
  // update ํ•˜๋ ค๋ฉด ๋ฐฐ์—ด ์•ˆ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡๋ฒˆ์งธ์ธ์ง€๋ฅผ ์•Œ์•„์•ผ ํ•จ.
  // router๋ฅผ ์ด์šฉํ•ด์„œ ์•Œ๋ ค์ฃผ๋Š” ๊ณผ์ •.
  const { id } = req.params; // url์— ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” params์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค. /update/0 ์ด๋ ‡๊ฒŒ ๋‚ ๋ฆฌ๋ฉด id = 0์ด ๋จ.
  const { data } = req.body;
  arr[id] = data;
  res.status(200).json({
    message: "update ์„ฑ๊ณต",
    result: arr
  });
});

// DELETE method
router.delete("/delete/:id", (req, res) => {
  const { id } = req.params;
  arr.splice(id, 1); // ํ•ด๋‹น id๋ถ€ํ„ฐ ํ•˜๋‚˜๋งŒ ์‚ญ์ œ. splice๋ฅผ ์„œ๋ฒ„์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ๊ตฌ๋‚˜..!!!
  res.status(200).json({
    message: "delete ์„ฑ๊ณต",
    result: arr
  });
});

module.exports = router;

5. middleware

request์™€ response ์ค‘๊ฐ„์—์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋“ค.

ex) ๋กœ๊ทธ์ธ ์ฒดํฌ : create, delete, update ๊ฐ™์€ ๋กœ๊ทธ์ธ ํ–ˆ์„ ๋•Œ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” method๋ฅผ ๋‚ ๋ ธ์„ ๋•Œ, ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ๋กœ๊ทธ์ธ์„ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. 3๊ฐœ ๋ฉ”์„œ๋“œ ์ „์ฒด์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋กœ๊ทธ์ธ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋Œ€์‘ํ•œ๋‹ค. ๊ทธ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋ฅผ middleware ๋ผ๊ณ  ํ•œ๋‹ค.

// app.js
// ์–ด๋–ค ์š”์ฒญ์ด ๋“ค์–ด์™€๋„ middleware ํ•จ์ˆ˜๋Š” ํ•œ๋ฒˆ์€ ์‹คํ–‰์ด ๋œ๋‹ค.
app.use((req, res, next) => {
  console.log("middleware");
  next();
});

์–ด๋–ค ์š”์ฒญ์„ ํ•ด๋„ ์‹คํ–‰์ด ๋˜๋Š” ๋ชจ์Šต!


// middleware ํ•จ์ˆ˜.
// module ํด๋”์— ๋งŒ๋“ค๊ธฐ.
const loginCheck = (req, res, next) => {
    const userLogin = true;
    if (userLogin) {
        next();
    } else {
        res.status(400).json({
            message: "login fail!!",
        });
    }
};

module.exports = loginCheck;

์—ฌ๊ธฐ์„œ module export ํ•˜๋Š”๊ฑธ export - import๋กœ ๋ฐ”๊ฟ”๋ณด๊ณ  ์‹ถ์€๋ฐ ์•ˆ๋ผ์„œ ํ•œ์ฐธ ํ—ค๋งธ๋Š”๋ฐ... ๋‚ด๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒŒ ์•„๋‹ˆ์—ˆ๋‹ค... package.json์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฑฐ์˜€๋‹ค...

// index.js
router.get('/', loginCheck, (req, res) => {
  res.status(200).json({
    message: "login success",
  });
});

6. multer

multer package - form-data ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ๋•Œ ์œ ์šฉํ•œ ํŒจํ‚ค์ง€.

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ ์‹ค์Šต์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

npm install multer
upload.single("image");
// upload : ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐฉ์‹์„ upload ์— ์ €์žฅ.
// single("image") : ํŒŒ์ผ 1๊ฐœ๋ฅผ ์—…๋กœ๋“œ. image๋ผ๋Š” form data๋ฅผ ์ „์†กํ•˜์—ฌ ์—…๋กœ๋“œ.
// ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ์€ req.file๋กœ, ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋Š” req.body ๋กœ ๋ฐ›์•„์˜ค๋ฉด ๋œ๋‹ค.
// module/imageUpload.js
const multer = require("multer");
// const upload = multer({ dest : "uploads/" });
// ํŒŒ์ผ ์ €์žฅ ๊ฒฝ๋กœ, ํŒŒ์ผ ์ด๋ฆ„์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ middleware ํ•จ์ˆ˜.
const storage = multer.diskStorage({
    destination : (req, file, cb) => {
      // public/images ์— ์ €์žฅ.
        cb(null, 'public/images/');
    },
    filename : (req, file, cb) => {
      // file ์ด๋ฆ„ ์ง€์ •.
        cb(null, file.originalname);
    }
});
const upload = multer({ storage : storage });

module.exports = upload;
// index.js
// upload ๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ƒˆ์„ ๋•Œ, middleware (multer ํŒจํ‚ค์ง€์˜ ํ•จ์ˆ˜) ๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ.
router.post("/upload", upload.single('image'), (req, res) => {
  // const file = req.file;
  // console.log(file);
  res.status(200).json({
    message : "upload success",
  })
});

7. ejs (Embedded JavaScript Template)

HTML๋กœ ๋งŒ๋“ค๋˜ ์ •์  ์›นํŽ˜์ด์ง€์—์„œ ๋ฒ—์–ด๋‚˜, JavaScript ๋ณ€์ˆ˜๋ฅผ View ํŒŒ์ผ์—์„œ๋„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ์›นํŽ˜์ด์ง€๋กœ ๊ธฐ๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ˜•์‹. ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ์„ ์“ฐ๋Š”๋ฐ ๋‚ด์šฉ๋งŒ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค. <% %> ์•ˆ์— js ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

// routes/template.js
const express = require("express");
const router = express.Router();

router.get('/ejs', (req, res) => {
    res.render("template", { data: "test data" });
});

module.exports = router;
// localhost:3000/template/ejs
// app.js
const templateRouter = require('./routes/template');

app.use('/template', templateRouter);
<!-- view/template.ejs-->
<!DOCTYPE html>
<html lang="ko">
<head>
    <title></title>
</head>
<body>
    <% include ./layout/navbar.ejs %>
    <%= data %> <!-- = ๋ถ™์ด๋ฉด data๊ฐ€ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ js ๋ณ€์ˆ˜๊ฐ€ ๋จ.-->
      
    <% if(false) { %>
        <div>ejs working</div>
    <% } else {  %>
        <div>ejs not working</div>
    <% } %>
    <div>ejs template</div>
</body>
</html>
      
<!-- view/layout/template.ejs-->
<nav style="height: 30px; background-color: skyblue; width: 100%;">
    nav
</nav>

8. express-session

express-session : express ํ™˜๊ฒฝ์—์„œ ์„ธ์…˜์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€

์„ธ์…˜ : ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ id์™€ pw๋ฅผ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ๋ณด๋ƒ„. ๊ทธ์น˜๋งŒ ํ†ต์‹  ํŠน์„ฑ์ƒ ์ด ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ๊ทธ์ธ ํ›„์— ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ์—…๋กœ๋“œ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์„ธ์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„๋Š” ์„ธ์…˜์— ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€, ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.

npm install express-session
// app.js
const session = require("express-session");

var app = express();

app.use(session({
  secret: "first project", // ์„ธ์…˜ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐ’ -> ์„ธ์…˜ ํ•˜์ด์žฌํ‚น ๊ณต๊ฒฉ์— ๋Œ€๋น„ํ•˜์—ฌ ํ•ด์‹œ์— ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค! salt๋กœ ์‚ฌ์šฉ๋˜๋Š”๊ฑธ๊นŒ? -> ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ ๋งž๋‹ค๊ณ  ํ•œ๋‹ค!
  resave: false, // ์„ธ์…˜์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  saveUninitialized: true, // ์„ธ์…˜์ด ์ €์žฅ๋˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”
}));
// localhost:3000/users
// localhost:3000/users/login/lim/asdf ๋กœ ๋กœ๊ทธ์ธ ํ›„์— 
// localhost:3000/users ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€๋ฉด ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
// routes/user.js : ๋กœ๊ทธ์ธ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด๋‹ˆ user๋กœ!
var express = require('express');
var router = express.Router();

// ๋กœ๊ทธ์ธ ์‹œ DB์— user id pw๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.
const userInfo = {
  lim: {
    password: "asdf",
  },
  kim: {
    password: "qwer",
  },
};

router.get("/", (req, res) => {
  const session = req.session;
  res.render('index', {
    username: session.username,
  });
});

/* GET users listing. */
router.get('/login/:username/:password', (req, res) => {
  const session = req.session;
  const {username, password} = req.params;
  if(!userInfo[username]) {
    res.status(400).json({
      message: "user not found",
    });
  }

  if(userInfo[username]["password"] === password) {
    // session์— ์ €์žฅ
    session.username = username;
    res.status(200).json({
      message: "login success",
    });
  } else {
    res.status(400).json({
      message: "user pw incorrect!!",
    });
  }
});

router.get('/logout', (req,res) => {
  const session = req.session;
  if(session.username) {
    req.session.destroy((err) => {
      if (err) {
        console.log(err);
      } else {
        res.redirect("/users");
      }
    });
  } else {
    res.redirect("/users");
  }
})

module.exports = router;




4. DB

  • DB : ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ์ €์žฅ์‹œ์ผœ ๋†“์€ ์ง‘ํ•ฉ์ฒด
  • Query : DB๋ฅผ ๊ด€๋ฆฌ ํ•˜๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด

1. SQL vs No SQL

SQL(Structured Query Language)

  • ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์กฐํ™” ํ•ด๋‘” ๊ฒƒ. ์Šคํ‚ค๋งˆ๊ฐ€ ์—„๊ฒฉํ•˜๊ฒŒ ์กด์žฌํ•œ๋‹ค.
  • schema : ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์–ด๋–ค ์ œ์•ฝ์กฐ๊ฑด์œผ๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ •์˜ํ•œ ๊ฒƒ.
  • ์žฅ์  : ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ์Šคํ‚ค๋งˆ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต ์—†์ด ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋‹จ์  : ์œ ์—ฐํ•˜์ง€ ์•Š๋‹ค. ์Šคํ‚ค๋งˆ ์ˆ˜์ •ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

no SQL (Not Only SQL)

  • ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌ์กฐํ™”๋œ ๊ด€๊ณ„๋„ ์—†๋‹ค.
  • JSON ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.
  • ์žฅ : ์œ ์—ฐํ•˜๊ณ  ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ๋‹จ : ๋ฐ์ดํ„ฐ์— ์ผ๊ด€์„ฑ์ด ์—†๋‹ค.

2. mongoDB

no SQL์˜ ๋Œ€ํ‘œ์ ์ธ DB์ด๋‹ค. ๋งจ๋‚  ๋ชฝ๊ณ ๋””๋น„ ๋ชฝ๊ณ ๋””๋น„ ํ•  ๋•Œ ๊ทธ๊ฒŒ ๋ญ์—ฌ ๋ฐฑ์—”๋“œ๋ž‘ ๊ด€๋ จ๋œ๊ฑด๊ฐ€๋ด ํ•˜๊ณ  ๋ง์•˜๋Š”๋ฐ, ์‹ค์ฒด๋ฅผ ์•Œ๊ฒŒ ๋˜๋‹ˆ๊นŒ ์ฆ๊ฑฐ์› ๋‹ค.

ํŠน์ง•

  • Document Oriented : document ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. document ์ง‘ํ•ฉ์€ collection
  • schema ์ œ์•ฝ X : no SQL ์˜ ๋Œ€ํ‘œ์ ์ธ DB
  • json ํ˜•ํƒœ : Node.js ํ˜ธํ™˜์„ฑ์ด ์ข‹๋‹ค.

mongoDB ํ˜ธ์ŠคํŒ… ์—…์ฒด ์ค‘ atlas๋ฅผ ์ด์šฉํ•ด์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.
์ƒ์„ฑ ์‹œ ์œ ์˜ ์  : ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—๋Š” ์–ด๋–ค IP ์ฃผ์†Œ์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋‘์ž!

ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ ํ›„, DB๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ compass GUI ํˆด๋กœ ๋‚ด ๋กœ์ปฌ ์ปดํ“จํ„ฐ์™€ atlas ์ชฝ ๋ฐ์ดํ„ฐ์‹ค์— ์ƒ์„ฑ๋œ ๋‚˜์˜ mongoDB ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ์ด ๋•Œ username, password๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ ‘์†ํ•ด์•ผ ํ•œ๋‹ค!


3. mongoose + CRUD ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

mongoose : mongoDB ODM (Object Document Mapping)

  • mongoDB๋ฅผ ๋”์šฑ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€.
  • Document๋ฅผ ์กฐํšŒํ•  ๋•Œ document๋ฅผ js์˜ Object๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
npm install mongoose
// bin/www
const dbConfig = require("../config/dbConfig.json"); // ํ‚ค๊ด€๋ฆฌ

/**
 * Get port from environment and store in Express.
 */

const mongoose = require("mongoose");
const db = mongoose.connection;
db.on("error", console.error);
db.once("open", () => {
  console.log("Connected to mongodb server");
});

// connect your application์„ ํ†ตํ•ด ์—ฐ๊ฒฐ.
mongoose.connect(
  `mongodb+srv://ddosang:${dbConfig.password}@first-project.7rouh.mongodb.net/${dbConfig.name}?retryWrites=true&w=majority`,
  { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false  }
)

schema ์ž‘์„ฑ

์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋Š”๊ฒŒ ๋ชฝ๊ณ ๋””๋น„์˜ ์žฅ์ ์ด์ง€๋งŒ, ํ˜‘์—…์„ ํ•  ๋•Œ๋Š” ์œ„ํ—˜์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ชฝ๊ตฌ์Šค์—์„œ๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

// model/post.js
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const postSchema = new Schema({
    title: String,
    content: String,
    create_date: { type: Date, default: new Date() }, // default ์„ค์ • ๊ฐ€๋Šฅ.
});

module.exports = mongoose.model("post", postSchema);
// routes/index.js
const postModel = require("../model/post");

router.post('/', async (req, res) => {
  const { title, content } = req.body;
  const post = new postModel({
    title: title,
    content: content,
  });

  try {
    // ์‘๋‹ต์„ ํ•˜๋Š” ์‹œ์ ์€ ๋™๊ธฐ์ ์ด์–ด์•ผํ•œ๋‹ค.
    const result = await post.save();
    res.status(200).json({
      message: "upload success",
      data: result,
    });
  } catch(error) {
    res.status(500).json({
      message: error,
    });
  }
});

// ๊ฒŒ์‹œ๋ฌผ ์ œ๋ชฉ์œผ๋กœ ์กฐํšŒ
router.get('/', async (req, res) => {
  try {
    const result = await postModel.find({ title : "first" });
    res.status(200).json({
      message: "read success",
      data: result,
    });
  } catch(error) {
    res.status(500).json({
      message: error,
    });
  }
});

// ๊ฒŒ์‹œ๋ฌผ id๋กœ ์กฐํšŒ
router.get('/:id', async (req, res) => {
  const { id } = req.params;
  try {
    const result = await postModel.findById(id);
    res.status(200).json({
      message: "detail success",
      data: result,
    });
  } catch(error) {
    res.status(500).json({
      message: error,
    });
  }
});

router.put("/:id", async (req, res) => {
  const {id} = req.params;
  const {title, content} = req.body;
  try {
    const result = await postModel.findByIdAndUpdate(id, {
      title: title,
      content: content,
    }, {
      // ์—…๋ฐ์ดํŠธ ํ›„์— ์—…๋ฐ์ดํŠธ ๋œ ๊ฒŒ์‹œ๋ฌผ์„ ๋ฐ˜ํ™˜ํ• ์ง€. ์—†์œผ๋ฉด ์—…๋ฐ์ดํŠธ ์ „ ๊ฒŒ์‹œ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•จ.
      new: true, 
    });
    res.status(200).json({
      message: "update success",
      data: result,
    });
  } catch(error) {
    res.status(500).json({
      message: error,
    });
  } 
});


// delete
router.delete("/:id", (req, res) => {
  const { id } = req.params;
  try {
    await postModel.findByIdAndDelete(id);
    res.status(200).json({
      message: "delete success"
    });
  } catch(error) {
    res.status(500).json({
      message: error
    });
  }
});


postman์œผ๋กœ ์š”์ฒญ์„ ๋‚ ๋ ค์„œ mongoDB์— ์Œ“์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.




์ถœ์ฒ˜

์ฝ”๋“œ๋ผ์ด์–ธ ์ผ๋‹จ ๋งŒ๋“œ๋Š” node.js - ์ด๋™ํ›ˆ ๊ฐ•์‚ฌ๋‹˜

profile
0๋…„์ฐจ iOS ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

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