Responsive Advertisement

Node.js์—์„œ MySQL ์‚ฌ์šฉํ•˜๊ธฐ: ์‹œ์ž‘ ๊ฐ€์ด๋“œ

MySQL์€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(RDBMS)์œผ๋กœ, ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ์— ํƒ์›”ํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Node.js๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์œผ๋กœ, MySQL๊ณผ์˜ ํ†ตํ•ฉ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Node.js์—์„œ MySQL์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Node.js์™€ MySQL ํ†ตํ•ฉ: ๊ธฐ๋ณธ ์ค€๋น„

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

1. MySQL ์„ค์น˜

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

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

2. MySQL ์„ค์ • ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

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

$ mysql -u root -p
mysql> CREATE DATABASE node_mysql;

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด node_mysql๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. MySQL ํŒจํ‚ค์ง€ ์„ค์น˜

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

$ npm install mysql2

Node.js์—์„œ MySQL ์—ฐ๊ฒฐ ์„ค์ •

MySQL๊ณผ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด MySQL ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ ์ •๋ณด(ํ˜ธ์ŠคํŠธ, ์‚ฌ์šฉ์ž๋ช…, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„ ๋“ฑ)๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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'  // ์—ฐ๊ฒฐํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„
});

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

์œ„ ์ฝ”๋“œ๋Š” MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋ณธ ์„ค์ •์ž…๋‹ˆ๋‹ค. mysql.createConnection()์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๊ณ , connect() ๋ฉ”์„œ๋“œ๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•˜๋ฉด "MySQL์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

MySQL ์ฟผ๋ฆฌ ์‹คํ–‰

MySQL ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•˜๋ฉด, ์ด์ œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. query() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ

๋จผ์ €, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— users ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

์œ„ ์ฝ”๋“œ๋Š” users ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์ด ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉฐ, ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

2. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

์ด์ œ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์ฟผ๋ฆฌ
const insertQuery = 'INSERT INTO users (name, email) VALUES (?, ?)';
const userData = ['John Doe', 'john@example.com'];

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

์œ„ ์ฝ”๋“œ๋Š” users ํ…Œ์ด๋ธ”์— ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” SQL ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. query() ๋ฉ”์„œ๋“œ์— ์ฟผ๋ฆฌ์™€ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด, ์‚ฝ์ž…๋œ ํ–‰์˜ ID๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

3. ๋ฐ์ดํ„ฐ ์กฐํšŒ

ํ…Œ์ด๋ธ”์— ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. SELECT ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๋ฐ์ดํ„ฐ ์กฐํšŒ ์ฟผ๋ฆฌ
const selectQuery = 'SELECT * FROM users';

// ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํ–‰
connection.query(selectQuery, (err, results) => {
    if (err) {
        console.error('๋ฐ์ดํ„ฐ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ:', results);
});

์œ„ ์ฝ”๋“œ๋Š” users ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” results ๋ฐฐ์—ด์— ์ €์žฅ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ

์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด UPDATE ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ
const updateQuery = 'UPDATE users SET name = ? WHERE id = ?';
const updateData = ['Jane Doe', 1];

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

์œ„ ์ฝ”๋“œ๋Š” ID๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ "Jane Doe"๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ–‰์˜ ์ˆ˜๋Š” affectedRows ์†์„ฑ์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋ฐ์ดํ„ฐ ์‚ญ์ œ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์ฟผ๋ฆฌ
const deleteQuery = 'DELETE FROM users WHERE id = ?';
const deleteData = [1];

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

์œ„ ์ฝ”๋“œ๋Š” ID๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž๋ฅผ ์‚ญ์ œํ•˜๋Š” SQL ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ํ–‰์˜ ์ˆ˜ ์—ญ์‹œ affectedRows ์†์„ฑ์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

๊ฒฐ๋ก 

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

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