MySQL ์ฐ๋ ๋ฐฉ๋ฒ
Node.js ์์ MySQL์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Sequelize
๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง
์ด๋ฒ ํฌ์คํ
์์๋ raw query๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ง์ mysql์ ์ฐ๋ํ๋ ๊ณผ์ ์ ์งํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
mysql ์ ์
ํฐ๋ฏธ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ ๋ค ์ํธ๋ฅผ ์ ๋ ฅํ๊ณ DB์ ์ ์ํฉ๋๋ค.
$ mysql -u root -p
database ๋ฐ table ์์ฑ
๋ฐ๋ชจ๋ฅผ ์ํด tutorial
์ด๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
mysql> create database tutorial;
๊ทธ๋ฆฌ๊ณ tutorial ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ๋ด์ board
ํ
์ด๋ธ์ ์์ฑํฉ๋๋ค.
mysql> use tutorial;
mysql> create table board (
idx int unsigned not null primary key auto_increment,
creator_id varchar(100) not null,
title varchar(100) not null,
content MEDIUMTEXT not null,
passwd varchar(100) not null,
hit int unsigned not null default 0
);
์ดํ ํ ์คํธ๋ฅผ ์ํด ์์์ ๋ ์ฝ๋๋ฅผ 2๊ฐ ์์ฑํฉ๋๋ค.
mysql> insert into board(
creator_id, title, content, passwd, hit) values
('simpson', 'tutorial blog', 'hello', '1234', 0), ('bart', 'another blog', 'hello', '1234', 0);
๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฅ๋์๋์ง SELECT ๋ฌธ์ ํตํด ํ์ธํด๋ด ์๋ค.
mysql> select * from board;
+-----+------------+---------------+---------+--------+-----+
| idx | creator_id | title | content | passwd | hit |
+-----+------------+---------------+---------+--------+-----+
| 3 | simpson | tutorial blog | hello | 1234 | 0 |
| 4 | bart | another blog | hello | 1234 | 0 |
+-----+------------+---------------+---------+--------+-----+
Node.js ์ค์
mysql ํจํค์ง ์ค์น
$ npm i mysql
database.js ์์ฑ
Node.js์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๋ํ๊ธฐ ์ํด config
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ ๋ค์,
๊ทธ ์์ database.js
๋ฅผ ๋ง๋ค์ด ํ์ํ ์ค์ ์ ์ ์ํฉ๋๋ค.init
ํจ์๋ฅผ ํตํด Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ค์ ์ฐ๊ฒฐ์ connect
ํจ์๋ฅผ ํตํด ์ํ๋ฉ๋๋ค.
config/database.js
const mysql = require("mysql");
const db_config = {
host: "localhost",
port: "3306",
user: "root",
password: "๋น๋ฐ๋ฒํธ",
database: "tutorial",
};
module.exports = () => {
return {
init() {
return mysql.createConnection(db_config);
},
test_connection(con) {
con.connect((err) => {
if (err) {
console.error("mysql connection error : " + err);
} else {
console.log("mysql connected successfully!");
}
});
},
};
};
์ค์ ์ฟผ๋ฆฌ๋ ์ด๋ฃจ์ด์ง์ง ์์ง๋ง ์๋ฒ ์คํ์ MySQL์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐ ๋์๋์ง ํ์ธํ๊ธฐ ์ํด
app.js
์์ test_connection
ํจ์๋ฅผ ํธ์ถํ๋๋ก ํ๊ฒ ์ต๋๋ค.
app.js
// ... ์ค๋ต
const db_config = require("./config/database")();
const app = express();
// database connection
const connection = db_config.init();
db_config.test_connection(connection);
์คํ
์ค์ ์ ๋ง์ณค๋ค๋ฉด npm start
๋ฅผ ํตํด ์๋ฒ๋ฅผ ์คํ์์ผ๋ด
๋๋ค.
๋ง์ฝ mysql 8
์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์ด ๊ธ์ ์์ฑํ๋ 2020๋
๊ธฐ์ค์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
mysql connection error : Error: ER_NOT_SUPPORTED_AUTH_MODE:
Client does not support authentication protocol requested by server;
consider upgrading MySQL client
์ด ๊ฒฝ์ฐ์๋ ํฐ๋ฏธ๋์ ์ด๊ณ mysql์ ์ ์ํ ๋ค ๋ค์๊ณผ ๊ฐ์ด mysql8 ๊ถํ ์ค์ ์ ๋ณ๊ฒฝํด์ค๋๋ค.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
ํด๋น ์ค๋ฅ์ ๊ด๋ จ๋ ์์ธํ ๋ด์ฉ์ ๋ค์์ stack overflow
๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
์ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊น?
์งง๊ฒ ์์ฝํ๋ฉด `mysql 8` ๋ถํฐ ์ํธํ ๋ฐฉ๋ฒ์ด ๋ฐ๋์ด `caching_sha2_password` ๋ฅผ ์ฌ์ฉํ๋๋ฐ,
์ฐ๋ฆฌ๊ฐ ๋ค์ด๋ฐ์ `mysql` ํจํค์ง๊ฐ ํด๋น ์ํธํ ๋ฐฉ๋ฒ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์
๋๋ค.
๊ฒ์๊ธ ๋ถ๋ฌ์ค๊ธฐ
์ด์ ๋ผ์ฐํฐ๋ฅผ ํ๋ ์์ฑํด์ ์ฟผ๋ฆฌ๋ฌธ์ ํตํด board ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
routes ๋๋ ํ ๋ฆฌ์ index.js์์ ๋ฉ์ธ ํ๋ฉด์ ์ถ๋ ฅํด์ค ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ๋ฌธ์ ํตํด ํธ์ถํฉ๋๋ค.
routes/index.js
const express = require("express");
const db_config = require("../config/database")();
const router = express.Router();
// database connection
const connection = db_config.init();
connection.connect();
/* GET home page. */
router.get("/", function (req, res, next) {
const qry = "SELECT * FROM board";
connection.query(qry, (err, rows) => {
if (err) {
console.error("query error" + err);
res.status(500).send("Internal Server Error");
} else {
res.render("index", { title: "MySQL ์ฐ๋ ๋ฐ๋ชจ", rows: rows });
}
});
});
module.exports = router;
connection ๊ฐ์ฒด์ query ํจ์์ ์ธ์๋ก ์ํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ํด์ ํธ์ถํ๋ฉด
๋ฑ๋ก๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์น ํ์ด์ง์์ ํ์ธํ๊ธฐ ์ํด index.ejs๋ฅผ ์์ฑํฉ๋๋ค.
(ํ๋ก์ ํธ ์์ฑ ์ ํ
ํ๋ฆฟ ์์ง์ ejs
๋ก ์ค์ ํ์ต๋๋ค.)
index.ejs
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel="stylesheet" href="/stylesheets/style.css" />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<% for(let row of rows) { %>
<p><%= row.idx%></p>
<p><%= row.creator_id%></p>
<p><%= row.title%></p>
<p><%= row.content%></p>
<p><%= row.regdate%></p>
<hr />
<% } %>
</body>
</html>
์คํ ๊ฒฐ๊ณผ
์ด์ ์๋ฒ๋ฅผ ๋ค์ ์ผ๊ณ ๋ฉ์ธ ํ์ด์ง๋ก ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์์ต๋๋ค.
'๐จโ๐ป web.dev > node' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Node.js ์๋ฒ์ Redis ์ ์ฉํ๊ธฐ (1) | 2022.05.28 |
---|---|
multer ๋ชจ๋์ ํ์ฉํ ์ด๋ฏธ์ง ํ์ผ ์ ๋ก๋ ํํ ๋ฆฌ์ผ (2) | 2021.03.05 |
Sequelize ORM์์ migration ํ์ฉํ๊ธฐ (0) | 2021.03.03 |
Node.js ํ๊ฒฝ์์ ๋ค์ด๋ฒ Open API ํ์ฉํ๊ธฐ (0) | 2021.03.02 |
Node.js CORS ์ค์ ํ๊ธฐ (2) | 2021.03.02 |
๐ฌ ๋๊ธ