์ง๊ธ๊น์ง๋ Terminal ๊ธฐ๋ฐ CLI๋ก MariaDB๋ฅผ ๋ค๋ค์๊ณ , ๋๋ถ๋ถ์ ์์
์ ํฐ ๋ถํธ์ ์์๋ค. ํ์ง๋ง ์คํค๋ง๋ ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ํ๋์ ํ์ธํ๊ฑฐ๋ ์๊ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ๋ฐ์๋ ํ๊ณ๊ฐ ์์๋ค.
์ค๋์ GUI ๊ธฐ๋ฐ ๋๊ตฌ์ธ MySQL Workbench๋ฅผ ํ์ฉ์ ๋ฐฐ์ ๋๋ฐ, ์์์น ๋ชปํ ์ค๋ฅ๋ฅผ ๊ฒช์ด์ ๋ค๋ฅธ ํด๊ฒฐ์ฑ
๋ ์ฐพ์๋ณด๊ฒ ๋์๋ค. Workbench ์ค๋ฅ๋ฅผ ๋์ฒดํ๊ธฐ ์ํ ๋ฐฉ์๊ณผ, ์๋ก ๋ฐฐ์ด ๋ด์ฉ๋ค(DB ์ฐ๋, ๋ฆฌํฉํ ๋ง)์ ์ ๋ฆฌํด๋ณธ๋ค.
๐ฌMySQL GUI
MySQL Workbench
MySQL Workbench๋ SQL ๊ฐ๋ฐ๊ณผ ๊ด๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ, ๊ทธ๋ฆฌ๊ณ ์ ์ง๋ฅผ ์ํ ๋จ์ผ ๊ฐ๋ฐ ํตํฉ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๋น์ฃผ์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ๋๊ตฌ
MySQL Workbench๋ ์ฒ์ ์จ๋ณด๋๊ฒ ์๋๋ค. DB ์ ๊ณต ๊ณผ๋ชฉ์ ๋ค์ ๋, ์ค์ต์ ์ํด MySQL๊ณผ Workbench๋ฅผ ์ฌ์ฉํด๋ณด์๊ณ , ์ด๊ฒ ์ค๋์ ์ค์ต์ ๋ฐ๋ชฉ์ ์ก๋ ์
์ด ๋์๋ค...
์ด๋ฏธ Workbench๊ฐ ์ค์น๋์ด ์์ด์, ์ค์น ๊ณผ์ ์ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ก Database Connection์ ์๋ํ๋ค. Docker Desktop์ ์คํํ๊ณ , Hostname(127.0.0.1), Port(3306), Username(root), Password๊น์ง ๋ชจ๋ ์ ๋๋ก ์ค์ ํ๊ณ connect๋ฅผ ๋๋ฌ๋ณด์๋ค.
์ ์ ์์ฒด์๋ ๋ฌธ์ ๊ฐ ์์์ง๋ง ์ ์ ํ ๋ณด์ด๋ ํ๋ฉด์ด ๋ฌธ์ ์๋ค. ๋ฐ๋ธ์ฝ์ค ์ค์ต์ ์ํด ์ฌ์ฉํ๋ MariaDB ์์ ํ
์ด๋ธ์ด ์๋๋ผ MySQL ์ค์ต ์ ์ฌ์ฉํ๋ ํ
์ด๋ธ๋ค์ด ๋ณด์ด๊ณ ์์๋ค. ๋ด๊ฐ ์ ์ํ๋ ค๊ณ ํ๋ DB๋ Docker ์ปจํ
์ด๋์์ ์คํ๋๋ mariadb์์ง๋ง, ์ด์งธ์์ธ์ง ๋ก์ปฌ๋ก ์ค์ตํ์๋ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณด์ธ ๊ฒ์ด๋ค.
---
(ํด๊ฒฐ๋ฐฉ๋ฒ #1 ์ ๋ฆฌ์ค)
---
VSCode MySQL Extension
๋ ๊ฐ๋จํ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๋ฅ ๋ค๋ฅธ GUI๋ฅผ ์ฐ๋ฉด ๋๋ ๊ฒ. ๋๋ ๊ฐ๋ฐ ํธ์์ฑ์ ์ํด IDE ๋ด์์ ํด๊ฒฐํ๊ณ ์ถ์ด VSCode์ Extension์ ์ฌ์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
ํ์ฅ ํ๋ก๊ทธ๋จ ๊ฒ์์ฐฝ์์ MySQL์ ๊ฒ์ํ์ ๋, ๋ ๋ฒ์งธ๋ก ๋์จ Extension์ ์ค์นํ๋ค.

Extension์ ์ค์นํ ํ, ๋ฉ๋ด ๋ชฉ๋ก์์ Database๋ฅผ ํด๋ฆญํ๋ฉด Connect to Server ํ๋ฉด์ด ๋์จ๋ค. ์ด ํ๋ฉด์์ ํธ์คํธ, ํฌํธ, ์ ์ , ํจ์ค์๋๋ฅผ ์ ๋ ฅํ๊ณ connect๋ฅผ ๋๋ ๋๋ mariadb์์ ์์ฑํ ํ ์ด๋ธ์ด ์ ์์ ์ผ๋ก ํ์๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.


์ ์์ ์ธ ๋ฐฉ๋ฒ์ MySQL Workbench์ธ ๊ฒ ๊ฐ๊ธด ํ์ง๋ง, ๋์ฒ๋ผ ์ฐฝ์ ์ฌ๋ฌ๊ฐ ๋์ฐ๋ ๊ฒ์ด ๋ถ๋ด์ค๋ฝ๊ณ IDE ๋ด์์ ํ ๋ฒ์ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ฉด Extension ์ฌ์ฉ๋ ์ข์ ์ ํ์ผ ๊ฒ ๊ฐ๋ค.
๐งฉํ ์ด๋ธ ์์ฑ
Youtube ์คํค๋ง๋ฅผ ์์ฑํ๊ณ , users์ channels ํ ์ด๋ธ์ ์์ฑํ๋ค. workbench ์์๋ GUI ๊ธฐ๋ฐ์ผ๋ก, ์ฒดํฌ๋ฐ์ค ํด๋ฆญํ์ฌ ๊ฐ๋จํ๊ฒ ํ ์ด๋ธ ์์ฑ์ด ๊ฐ๋ฅํ๋ฐ vscode mysql์์๋ ์ง์ SQL์ ์์ฑํด์ค์ผ ํ๋ค๋๊ฒ ์กฐ๊ธ ๋ฒ๊ฑฐ๋ก์ด ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค. MySQL Workbench์์๋ GUI์์ row ์ถ๊ฐ ํ ์คํํ๋ฉด, SQL ๋ช ๋ น์ด๋ ๋์ค๋๋ฐ mysql Extension์ SQL๋ก Exportํ๋๊ฒ ์ ๋ฃ ํ๋์ผ๋ก ์ ๊ณต๋๊ณ ์๊ธฐ๋ ํ๋ค. ๊ทธ๋๋ ํ์ํ ๊ธฐ๋ฅ์ ๋ค ์ ๊ณตํ๊ณ IDE์์ ํ๋ฒ์ ํด๊ฒฐ ๊ฐ๋ฅํ๋ค๋๊ฒ ๋๋ฌด ํธํด์ ์ถฉ๋ถํ ๋ง์กฑํ๊ณ ์ฌ์ฉ์ค
CREATE TABLE users(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(100) NOT NULL UNIQUE,
name VARCHAR(45) NOT NULL,
password VARCHAR(20) NOT NULL,
contact VARCHAR(45),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE channels (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
sub_num INT NOT NULL DEFAULT 0,
video_count INT NOT NULL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_id INT NOT NULL,
FOREIGN KEY(user_id) REFERENCES users(id)
);


๐๏ธDB ์ฐ๋ํ์ฌ API ๋ฆฌํฉํ ๋งํ๊ธฐ
์ฐ์ mysql2 ํจํค์ง๋ฅผ ์ค์นํด์ค๋ค
npm install --save mysql2
ํจํค์ง ์ค์น ํ, db ์ฐ๊ฒฐ์ ์ํํ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ๊ณ , ์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ์๋ค.
const mysql = require("mysql2");
const connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "Youtube",
});
connection.query("SELECT * FROM `users` ", function (err, results, fields) {
console.log(results);
console.log(fields);
});
- ์ค์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์ค users์ธ ํ ์ด๋ธ์ ๋ฐ์์, ๊ฒฐ๊ณผ๊ฐ๊ณผ ํ๋(๊ฒฐ๊ณผ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ)๋ฅผ ์ถ๋ ฅํ๋ค.
Timezone ์ค์
created_at
์ปฌ๋ผ์ ์๊ฐ์ ํ์ธํด๋ณด๋, ํ์ฌ ์๊ฐ๊ณผ ๋ง์ง ์๋ ์ด์ํ ๊ฐ์ด ์ ์ฅ๋์ด ์์๋ค. ์ด๋ MariadDB์ ๊ธฐ๋ณธ ํ์์กด ์ค์ ์ด UTC๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ํ๊ตญ ์๊ฐ(KST, UTC+9)์ ๋ง์ถฐ์ ๊ฐ์ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๋ ค๋ฉด, time_zone
์ค์ ์ ๋ฐ๋ก ํด์ฃผ์ด์ผ ํ๋ค.
SET GLOBAL time_zone = 'Asia/Seoul';
SET time_zone = 'Asia/Seoul';
Global
์ ์ ์ฒด ์๋ฒ ์ค์ ์ ๋ฐ๊พธ๋ ๋ช ๋ น์ด์ด๊ณ ,SESSION
์ ํ์ฌ ์ธ์ (์ฟผ๋ฆฌ ์คํ ์ค์ธ ์ฐ๊ฒฐ)์๋ง ์ ์ฉ๋๋ค.
time_zone
์ค์ ์ด ์ ์ ์ฉ๋์๋์ง ํ์ธํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ฟผ๋ฆฌํ๋ค.
SELECT @@global.time_zone, @@session.time_zone;
โญ Asia/seoul๋ก ์ ์ค์ ๋์๋ค๋ฉด, ์ดํ๋ถํฐ๋ created_at ๊ฐ์ TIMESTAMP/DATETIME ์ปฌ๋ผ์ ํ์ฌ ํ๊ตญ ์๊ฐ์ด ์ ์ฅ๋๋ค.
โ์ด์: ๊ธฐ์กด ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์๊ฐ๋๋ UTC ๊ธฐ์ค์ผ๋ก ํ์๋๋ ๋ฌธ์
time_zone
์ ์ค์ ํ์์๋ ๋ถ๊ตฌํ๊ณ , ๊ธฐ์กด์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์๊ฐ๋๋ ์ฌ์ ํ ์ด์ ์ค์ (UTC ๊ธฐ์ค)์ผ๋ก ํ์๋๋ ๋ฌธ์ ๊ฐ ์์๋ค.
๊ฐ์ฌ๋ ํ๋ฉด์์๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ ์ ์์ ์ผ๋ก KST๋ก ๋ณํ๋์ด ๋ณด์์ง๋ง, ๋ด ๋ก์ปฌ์์๋ ์ด๋ฏธ ์ฝ์
๋ ๋ฐ์ดํฐ์ ์๊ฐ์ ๋ณํ์ง ์์๋ค.
โ
์์ธ ๋ถ์
MySQL DATETIME
ํ์
์ timezone ์ ๋ณด ์์ด ๋ฌธ์์ด๋ก ์๊ฐ๋ง ์ ์ฅํ๋ ํ์
์ด๋ค. ์ฆ,
DATETIME
์ปฌ๋ผ์ ์ ๋ ฅ๋ ์๊ฐ์ด ๊ทธ ์์ ์ ์์คํ ์๊ฐ ๊ธฐ์ค์ผ๋ก ๊ทธ๋๋ก ์ ์ฅ๋๋ค.timezone
์ ๋ฐ๊ฟ๋ ๊ธฐ์กด์ ์ ์ฅ๋DATETIME
๊ฐ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.- ๋ฐ๋๋ ๊ฑด
timezone
์ค์ ๋ณ๊ฒฝ ์ดํ์ INSERT ๋๋ ๋ฐ์ดํฐ ๋ฟ์ด๋ค.
๐ค๊ทธ๋ฐ๋ฐ ๊ฐ์ฌ๋ ํ๋ฉด์์๋ ์ ๋ฐ๊ผ์ง??
๊ฐ์ฌ๋๊ป์๋ created_at
์์ฑ ์, TIMESTAMP
๋ฅผ ์ฌ์ฉํด์ ์์ฑํ์
จ๊ธฐ์ ์๋์ผ๋ก ๋ณํ๋์ด ๋ณด์ธ ๊ฒ์ด์๋ค. DATETIME
๊ณผ ๋ค๋ฅด๊ฒ, TIMESTAMP
๋ timezone
์ํฅ์ ๋ฐ๋ ํ์
์ด๊ธฐ์ timezone
์ค์ ์ ๋ฐ๊พธ๋ฉด ์ด์ ๋ง์ถฐ ์๋ ๋ณํ๋์ด ๋ณด์ธ๋ค.
๋๋ DATETIME์ผ๋ก created_at์ ์์ฑํ๊ณ , ๊ฐ์ฌ๋์ TIMESTAMP๋ฅผ ์ฐ์ ์ ์ด๋ฐ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ ๊ฒ!
๐จDATETIME์ผ๋ก ์ ์ฅ๋ ๊ฐ์ KST๋ก ๋ณํํ๋ ๋ฐฉ๋ฒCONVERT_TZ()
ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
UPDATE users
SET created_at = CONVERT_TZ(created_at, '+00:00', 'Asia/Seoul');
- ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๊ธฐ์กด ๊ฐ๋ค์ด Asia/Seoul ์๊ฐ๋๋ก ์ ๋ณํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ฐ ์์ฒด๋ฅผ ๋ฐ๊พธ๋ ์ฟผ๋ฆฌ์ด๋ฏ๋ก, ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค. ๊ธฐ์กด๊ฐ์ด UTC์ธ์ง, ๊ทธ๋ฆฌ๊ณ 9์๊ฐ ์ฐจ์ด๊ฐ ๋๋์ง ๊ผญ ํ์ธํ๊ณ ์ฌ์ฉํด์ผ ํ๋ค.
SELECT created_at,
CONVERT_TZ(created_at, '+00:00', 'Asia/Seoul') AS kst_time
FROM users;
๐ฅธ์ค๋ฌด์ ์ ์ฉ
๋๋ DB์ ์ ์ฅ๋ ๊ฐ์ ์์ ํ ๋ณํํ๋๋ฐ, ์ค์ ๋ก๋ ์ด๋ ๊ฒ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๊ณ ํ๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, DB์๋ UTC์ ์ ์ฅํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
๋จ์ด๋ SELECT ์ฟผ๋ฆฌ์์๋ง KST๋ก ๋ณํํด์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ ๋ง์ด ์ด๋ค๊ณ ํ๋ค.
- ์๋ฒ๋ฅผ ์ฌ๋ฌ ๋/๊ตญ๊ฐ๋ฅผ ์ด์ํ ๋ ํผ๋์ด ์ค๊ณ
- ์๊ฐ ๊ธฐ์ค์ผ๋ก ํต์ผํด๋๋ฉด ๋๋ฒ๊น ์ด ์ฝ๊ณ
- ํ์์กด ์ ์ฑ ์ด ๋ฐ๋ ๋๋ ์ ์ฐํ ๋์ ๊ฐ๋ฅํด์
ํ์์กด ๋ณ๊ฒฝ์ ์ ์ฐํ ๋์์ ์ํด์๋ DATETIME
๋ณด๋ค๋ TIMESTAMP
๋ฅผ ์ฌ์ฉํ์ฌ create_at
๋ฑ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
โญ๊ฒฐ๋ก : DATETIME vs TIMESTAMP
์ ์ฅ ํํ | ๋ฌธ์์ด๋ก ๊ณ ์ ์๊ฐ ์ ์ฅ | UTC๋ก ์ ์ฅ + timezone ๋ณํ |
timezone ์ค์ ์ํฅ | ์์ | ์์ |
์ถ์ฒ ์ฉ๋ | ๊ณ ์ ๋ ์๊ฐ ์ ๋ณด๊ฐ ํ์ํ ๊ฒฝ์ฐ | ์์ฑ์ผ, ์์ ์ผ ๋ฑ ์์คํ ์๊ฐ ์ ์ฅ ์ |
dateStrings ์ต์
Node.js์์ DB๋ฅผ ์กฐํํ ๋, created_at
๊ฐ์ .000Z
๊ฐ ๋ถ์ด์ ์ถ๋ ฅ๋๋ค. ์ด ๊ฐ์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด Mysql2 ๋ชจ๋ ์ค์ ์์ dateStrings
์ต์
์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
const connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "Youtube",
dateStrings: true
});
dateStrings
์ต์ ์ ํตํด DATETIME์ด๋ TIMESTAMP ๊ฐ์ด ๋ฌธ์์ด ํํ๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์, ํ์ฑ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
DB ๋ชจ๋ํ
DB ์ฐ๊ฒฐ ์ฝ๋๋ฅผ ๋ณ๋ ๋ชจ๋๋ก ๋ถ๋ฆฌํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํ๋ค.
const mysql = require("mysql2");
const connection = mysql.createConnection({
host: "localhost", // ECONNREFUSED ๋ฐฉ์ง๋ฅผ ์ํด IP๋ก ๋ณ๊ฒฝ
user: "root",
password: "root",
database: "Youtube",
dateStrings: true,
});
module.exports = connection;
์ด์ API ์์๋ require('./mariadb')
๋ก ์ฝ๊ฒ DB ์ปค๋ฅ์
์ ์ฌ์ฉํ ์ ์๋ค.
โ์ค๋ฅ: Error socket hang up
API๋ฅผ ํ
์คํธ ํ๋ ๋์ค, socket hang up
์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
conn.query(
`SELECT * FROM users Where email = ${email}`,
function(err, results, fields) {
res.status(200).json(results)
}
)
์์ SELECT ๊ตฌ๋ฌธ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค.
ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด ๊ฐ์ ์ง์ ์ฃผ์
ํ๋ฉด, SQL Injection ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ๊ณ , ๊ฐ์ด null
, string
๋ฑ์ ํ์์ผ ๋ ์ฟผ๋ฆฌ ํ์ฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์๋ฒ๊ฐ ๊ฐ์ ๋ก ์ข
๋ฃ๋๋ค.
`SELECT * FROM users WHERE email = ?`, email,
prepared statement ๋ฐฉ์์ผ๋ก ์์ ํ์ฌ, ์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
โ์ค๋ฅ: connect ECONNREFUSED 127.0.0.1:7777
์ด๋ MySQL์ด 127.0.0.1
๊ธฐ์ค์ผ๋ก๋ง ํฌํธ ์ฐ๊ฒฐ์ ๋ฐ๋๋ก ์ค์ ๋์ด ์๋๋ฐ, Node.js์์๋ localhost
๊ฐ ๋ด๋ถ์ ์ผ๋ก IPv6(::1)๋ก ํด์๋๋ฉด์ ์ถฉ๋์ด ๋ฐ์ํ์ฌ ์๊ธฐ๋ ์ค๋ฅ์ด๋ค. host
๋ฅผ ๋ช
ํํ IP๋ก ์ง์ ํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
๐ฉ๋ฆฌํฉํ ๋ง ๊ฒฐ๊ณผ
๊ธฐ์กด์๋ Map ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง๋ง, ์ด์ ๋ MariaDB์ ์ฐ๋ํ์ฌ ์ค์ DB์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋๋ก ๋ฆฌํฉํ ๋งํ๋ค.
(์ฝ๋ ์ผ๋ถ๋ง ์ฒจ๋ถ)
//ํ์๊ฐ์
router.post("/signup", function (req, res) {
if (req.body !== undefined && req.body.email) {
const { email, password, name, contact } = req.body;
// ์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฉ์ผ์ธ์ง ํ์ธ
const checkQuery = "SELECT * FROM users WHERE email = ?";
conn.query(checkQuery, [email], (err, results) => {
if (err) {
console.error("ํ์๊ฐ์
์ค๋ณต ํ์ธ ์ค๋ฅ:", err);
return res.status(500).json({ message: "์๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค." });
}
if (results.length > 0) {
return res.status(409).json({ message: "์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฉ์ผ์
๋๋ค." });
}
// ์๋ก์ด ์ฌ์ฉ์ ์ถ๊ฐ
const insertQuery =
"INSERT INTO users (email, password, name, contact) VALUES (?, ?, ?, ?)";
conn.query(
insertQuery,
[email, password, name, contact || null],
(err, result) => {
if (err) {
console.error("ํ์๊ฐ์
์ค๋ฅ:", err);
return res
.status(500)
.json({ message: "์๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค." });
}
res.status(201).json({
message: `${name}๋ ํ์๊ฐ์
์ ํ์ํฉ๋๋ค.`,
});
}
);
});
} else {
res.status(400).json({ message: "์์ฒญ๊ฐ์ ์ ๋๋ก ๋ณด๋ด์ฃผ์ธ์" });
}
});
๋ฆฌํฉํ ๋ง ํ Postman์ผ๋ก API ํ ์คํธ๋ฅผ ์งํํ ๊ฒฐ๊ณผ,
users
ํ ์ด๋ธ์ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ ์ฝ์- ์ค๋ณต ์ด๋ฉ์ผ์
409 conflict
๋ก ์๋ต - ์๋ฌ ๋ฉ์์ง๋ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์ด, ์์ธ์ ํ์ ํ๊ธฐ ํธํด์ก๋ค.


GUI๋ฅผ ํ์ฉํด๋ณด๋ ์๊ฐ๋ณด๋ค ํจ์ฌ ํธ๋ฆฌํ๋ค. Workbench๊ฐ ์๊พธ ์ค๋ฅ๊ฐ ๋์ CLI๋ฅผ ๊ณ์ ์ฌ์ฉํด์ผ ํ๋ ๊ณ ๋ฏผํ์๋๋ฐ, ํ์ฅ ํ๋ก๊ทธ๋จ์ ํตํด GUI๋ฅผ ์ฌ์ฉํด๋ณด๋ ํจ์ฌ ์ง๊ด์ ์ด๊ณ ์ฟผ๋ฆฌ ์์ฑ๋ ์์ํ๋ค. datetime๊ณผ timestamp์ ์ฐจ์ด๋ฅผ ์๊ฒ ๋ ๊ฒ๋ ํฐ ์ํ์ด์๋ค. timezone ์ค์ ์ ์ค์ตํ๋ ์ค ๋ง์ฃผ์น ์ค๋ฅ ๋๋ฌธ์ ์ฒ์์ ๋นํฉํ์ง๋ง, ์์ธ์ ์ฐพ๊ณ ํด๊ฒฐํ๋ ๊ณผ์ ์ ํตํด ๊ฐ๋ ์ ๋ช ํํ ์ดํดํ ์ ์์ด์ ์คํ๋ ค ์ข์ ๊ฒฝํ์ด์๋ ๊ฒ ๊ฐ๋ค. ๋ณธ๊ฒฉ์ ์ผ๋ก DB์ ์ฐ๋ํ API๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ ๊ฑธ์ ๋ ๋ค๊ฐ๊ฐ๋ ๊ธฐ๋ถ์ด ๋ค์ด ๋งค์ฐ ๋ฟ๋ฏํจ