Responsive Advertisement

Node.js์—์„œ MySQL ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

Node.js์™€ MySQL์„ ๊ฒฐํ•ฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜์˜ ๊ฐ•๋ ฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Node.js์—์„œ MySQL ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜๊ณ , SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

Node.js์™€ MySQL: ๊ธฐ๋ณธ ์ค€๋น„

Node.js์—์„œ MySQL๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ ค๋ฉด mysql2 ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋Š” MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

1. MySQL ์„ค์น˜ ๋ฐ ์„ค์ •

MySQL์ด ์‹œ์Šคํ…œ์— ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๋จผ์ € ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด ์šด์˜์ฒด์ œ์— ๋งž๋Š” MySQL ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MySQL ์„ค์น˜ ๊ฐ€์ด๋“œ ๋ณด๊ธฐ

MySQL ์„ค์น˜ ํ›„, mysql -u root -p ๋ช…๋ น์–ด๋กœ MySQL ํ„ฐ๋ฏธ๋„์— ๋กœ๊ทธ์ธํ•œ ๋’ค, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •ํ•˜์„ธ์š”.

2. Node.js ํ”„๋กœ์ ํŠธ์— mysql2 ํŒจํ‚ค์ง€ ์„ค์น˜

Node.js์—์„œ MySQL๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด mysql2 ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$ npm init -y
$ npm install mysql2

์œ„ ๋ช…๋ น์–ด๋กœ Node.js ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  MySQL ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

MySQL์— ์—ฐ๊ฒฐํ•˜๊ณ  ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

Node.js์—์„œ MySQL ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•œ ๋‹ค์Œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

1. MySQL ์—ฐ๊ฒฐ ์„ค์ •

MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์„ ๋จผ์ € ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜ธ์ŠคํŠธ, ์‚ฌ์šฉ์ž๋ช…, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ์„ ์„ค์ •ํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

// app.js

const mysql = require('mysql2');

// MySQL ์—ฐ๊ฒฐ ์„ค์ •
const connection = mysql.createConnection({
    host: 'localhost',      // MySQL ์„œ๋ฒ„ ํ˜ธ์ŠคํŠธ
    user: 'root',           // MySQL ์‚ฌ์šฉ์ž๋ช…
    password: 'your-password',  // MySQL ๋น„๋ฐ€๋ฒˆํ˜ธ
    database: 'node_mysql'  // ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„
});

// MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
connection.connect((err) => {
    if (err) {
        console.error('MySQL ์—ฐ๊ฒฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('MySQL์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
});

์œ„ ์ฝ”๋“œ๋Š” MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์€ ์ด๋ฏธ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. MySQL ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ฟผ๋ฆฌ

MySQL์— ์—ฐ๊ฒฐํ•œ ํ›„, SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๋ฅผ ์ €์žฅํ•  users ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ฟผ๋ฆฌ
const createTableQuery = `
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100),
        email VARCHAR(100),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
`;

// ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹คํ–‰
connection.query(createTableQuery, (err, results) => {
    if (err) {
        console.error('ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('ํ…Œ์ด๋ธ”์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
});

์œ„ SQL ์ฟผ๋ฆฌ๋Š” users๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉฐ, id, name, email, created_at ๋“ฑ์˜ ์ปฌ๋Ÿผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. AUTO_INCREMENT๋Š” id ์ปฌ๋Ÿผ์ด ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉฐ, IF NOT EXISTS๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ…Œ์ด๋ธ”์ด ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

3. MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ

ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ ํ›„์—๋Š” MySQL ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. connection.end() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ
connection.end((err) => {
    if (err) {
        console.error('MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('MySQL ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
});

์œ„ ์ฝ”๋“œ๋Š” MySQL ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ ์˜ˆ์‹œ

์œ„์—์„œ ์„ค๋ช…ํ•œ ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ํ•ฉ์น˜๋ฉด, Node.js์—์„œ MySQL ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// app.js

const mysql = require('mysql2');

// MySQL ์—ฐ๊ฒฐ ์„ค์ •
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'your-password',
    database: 'node_mysql'
});

// MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
connection.connect((err) => {
    if (err) {
        console.error('MySQL ์—ฐ๊ฒฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('MySQL์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
    
    // ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ฟผ๋ฆฌ
    const createTableQuery = `
        CREATE TABLE IF NOT EXISTS users (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(100),
            email VARCHAR(100),
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    `;

    // ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹คํ–‰
    connection.query(createTableQuery, (err, results) => {
        if (err) {
            console.error('ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
            return;
        }
        console.log('ํ…Œ์ด๋ธ”์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');

        // MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ
        connection.end((err) => {
            if (err) {
                console.error('MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
                return;
            }
            console.log('MySQL ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
        });
    });
});

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•œ ํ›„ users ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์—๋Š” ์—ฐ๊ฒฐ์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ปฌ๋Ÿผ๊ณผ ์˜ต์…˜ ์„ค์ •

ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ๋‹ค์–‘ํ•œ ์ปฌ๋Ÿผ๊ณผ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, NOT NULL ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ํŠน์ • ์ปฌ๋Ÿผ์ด ๋น„์–ด ์žˆ์„ ์ˆ˜ ์—†๋„๋ก ์„ค์ •ํ•˜๊ฑฐ๋‚˜, DEFAULT ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CREATE TABLE IF NOT EXISTS products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    stock INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

์œ„ ์˜ˆ์‹œ๋Š” ์ œํ’ˆ์„ ์ €์žฅํ•˜๋Š” products ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. price๋Š” ์†Œ์ˆ˜์  ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, stock ์ปฌ๋Ÿผ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

Node.js์—์„œ MySQL ํ…Œ์ด๋ธ” ์ƒ์„ฑ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. mysql2 ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , SQL ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”!

๋Œ“๊ธ€ ์“ฐ๊ธฐ