MySQL์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์คํ ์์ค ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ (RDBMS)์ผ๋ก, ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ์ ํ์ํ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Node.js๋ ์๋ฒ ์ฌ์ด๋์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ํ๊ฒฝ์ผ๋ก, MySQL๊ณผ์ ํตํฉ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ Node.js์์ MySQL์ ์ค์ ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
Node.js์ MySQL ํตํฉ: ๊ธฐ๋ณธ ์ค๋น
Node.js์์ MySQL์ ์ฌ์ฉํ๋ ค๋ฉด MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ ํจํค์ง๊ฐ ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ mysql2๋ผ๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1. MySQL ์ค์น
๋จผ์ , Node.js๊ฐ 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์ ํตํฉํด ๋ค์ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด์ธ์!
๋๊ธ ์ฐ๊ธฐ