TIL 53: [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] MVC

์˜ค๋Š˜์€ MVC ๋ฐ”ํƒ•์œผ๋กœ ํ’€์—ˆ๋˜ Sprint์—์„œ ๋ณต์Šตํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค! Sprint๋ฅผ ํ’€๋ฉด์„œ MVC๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ์‹ค์งˆ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

mysql์— ์ ‘์†ํ•ด์„œ CREATE DATABASE cmarket;๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ด ๋•Œ, ์ปค๋งจ๋“œ ์ฐฝ์— ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅด๊ฒŒ, ํ•„์š”ํ•œ ๋ช…๋ น์„ ์ •๋ฆฌํ•œ ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ๋ฐฐ์น˜๋ชจ๋“œ๋กœ ์‹คํ–‰ ์ค‘์ธ MySQL ์„œ๋ฒ„์— ํ•œ ๋ฒˆ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ฐฐ์น˜๋ชจ๋“œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

https://dev.mysql.com/doc/refman/8.0/en/batch-mode.html

 

์ดํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. CLI ํ™˜๊ฒฝ์—์„œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์ง„์ž…ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

mysql -u root -p < server/schema.sql -Dcmarket

 

 

ํ˜น์‹œ ์ž˜๋ชป๋œ SQL์„ ์ž‘์„ฑํ•˜์—ฌ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ, ์ž˜๋ชป ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ SQL ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

DROP DATABASE IF EXISTS [๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] CREATE DATABASE [๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค]

 

 

MySQL ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž ์‹œ ๋‹ค๋ฃจ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ์ƒ/ํŽธ์˜์ƒ ์ด์œ ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด ๋†“๋Š” ํŽธ์ด ์ข‹์Šต๋‹ˆ๋‹ค. github๊ณผ ๊ฐ™์ด ๊ณต๊ฐœ๋œ ํ™˜๊ฒฝ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋…ธ์ถœ๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ์ผ(.env)์€ ๋ฐ˜๋“œ์‹œ .gitignore ํŒŒ์ผ์— ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
.envํŒŒ์ผ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

DATABASE_PASSWORD=`Insert your password`



config.js์— MySQL๊ณผ์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด DATABASE_PASSWORD๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” npm ๋ชจ๋“ˆ dotenv๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const dotenv = require('dotenv');
dotenv.config();
// Require and configure dotenv.

const config = {
  development: {
    host: 'localhost',
    user: 'root',
    password: process.env.DATABASE_PASSWORD,
    database: 'cmarket'
  },
  test: {
    host: 'localhost',
    user: 'root',
    password: process.env.DATABASE_PASSWORD,
    database: 'cmarket_test'
  }
};
// After adding environment-specific variables to a .env file in the root directory of your project, process.env now has the keys and values you defined in .env file. 

module.exports = config;

 

 

Server

App.js ํŒŒ์ผ์—์„œ express ์„ค์ •์„ ํ•ฉ๋‹ˆ๋‹ค. express๋Š” Node.js ์›น ์„œ๋ฒ„์˜ ์ง„์ž…์ ์ด์ž ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 

 

 

Router

Router๋Š” Controller๋กœ ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” endpoint์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด /users URL๋กœ POST ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒฝ์šฐ, users ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํŒŒ์ผ ์•ˆ์— ๋ชจ๋‘ ๊ตฌ์„ฑํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ๊ณ , endpoint์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜์—ฌ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์„œ User์™€ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const express = require('express');
const router = express.Router();

router.get('user/:userId/orders', controller.orders.get);
router.post('user/:userId/orders', controller.orders.post);

module.export = router;

 

 

Controller

endpoint์— ๋”ฐ๋ผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์•Œ๋งž๊ฒŒ Model์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์™€ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

const models = require('../models'); //Connecting to Model

module.exports = {
  items: {
    get: (req, res) => {
      models.items.get((error,result) => {
        if (error) {
          res.status(500).send('Internal Server Error');
        } else {
          res.status(200).json(result);
        }
      });
    },
    post: (req, res) => {
      models.items.post(
      	...
      )
    }
  }
};

 

 

Model

Model์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” mysql ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Controller์—์„œ ์‚ฌ์šฉํ•œ Method๋“ค์„ ์—ฌ๊ธฐ์„œ SQL์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ DB์˜ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์ •์˜ํ•ด์ค๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ์š”์ฒญ์ธ ์ ์„ ๋ฐ˜๋“œ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const db = require('../db'); // Connecting to Database

module.exports = {
  items: {
    get: (callback) => {
      const queryString = `SELECT * FROM items`;
      
      db.query(queryString, (error, result) => {
      	callback (error, result);
      });
    }
  }
}

์œ„ ์ฝ”๋“œ์— ๋”ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ฃผ๋ฌธ์„ ํ–ˆ์„ ๋•Œ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ INSERT INTO ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์•„๋ž˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://www.w3schools.com/nodejs/nodejs_mysql_insert.asp

 

Node.js MySQL Insert Into

Node.js MySQL Insert Into Insert Into Table To fill a table in MySQL, use the "INSERT INTO" statement. Example Insert a record in the "customers" table: var mysql = require('mysql'); var con = mysql.createConnection({   host: "localhost",   user: "yourus

www.w3schools.com

 

ํ•œ๋ฒˆ์— ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๊ฐ’์„ ํฌํ•จํ•œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ค€ ๋‹ค์Œ, VALUES ๋’ค์— '?'๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. '?'์— value ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, ์ž๋™์ ์œผ๋กœ result์— ๋งˆ์ง€๋ง‰ ๋ฒˆํ˜ธ + 1๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ( result. insertId )