
๐ฏ MySQL Workbench๋ฅผ ์ค์นํ๊ณ , ๊ธฐ์กด ์ฝ๋์ DB๋ฅผ ์ฐ๋ํฉ๋๋ค.
MySQL์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ก๊ทธ๋จ (MySQL ์ ์ฉ GUI ๋๊ตฌ)์
๋๋ค.

๐ค ์ ์ฌ์ฉํ ๊น?
SQL ์ฟผ๋ฆฌ๋ฅผ ํธํ๊ฒ ์ ๋ ฅํ๊ณ ์คํ ๊ฐ๋ฅํ๊ณ , ์์ ์ฒ๋ผ GUI๋ก ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ MySQL Workbench ๊ณต์ ๋ค์ด๋ก๋ ํ์ด์ง
Installer๋ฅผ ๋ค์ด๋ก๋ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
ํ์๊ฐ์
์์ด ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.

์ค์ ์ ํ์ Custom์ผ๋ก ์ ํํ๊ณ Next >๋ฅผ ๋๋ฌ์ค๋๋ค.

์ค์นํ Server, Workbench, Shell์ ๋ฒ์ ์ ๊ณจ๋ผ ์ฎ๊ฒจ์ฃผ๊ณ Next >๋ฅผ ๋๋ฌ์ค๋๋ค.

์ค์น ํ๋ก๊ทธ๋จ์ ํ์ธํ๊ณ Execute๋ฅผ ๋๋ฌ ์ค์นํด์ค๋๋ค.

์ค์น๊ฐ ์๋ฃ๋๋ฉด Next >๋ฅผ ๋๋ฌ์ค๋๋ค.

ํ๊ฒฝ ์ค์ ์ ๋ํ ์๋ด๋ฅผ ํ์ธํ๊ณ Next >๋ฅผ ๋๋ฌ์ค๋๋ค.

โ ๏ธ ๋ฐ์ํ ์ค๋ฅ
์๋ฒ ์ฐ๊ฒฐ ํฌํธ์The specific port is already in use์ค๋ฅ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
ํด๋น ํฌํธ ๋ฒํธ๊ฐ ์ด๋ฏธ ์ฌ์ฉ ์ค์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ๋ชป ํ๋ค๋ ์๋ฏธ์์ต๋๋ค.
๐ก ํด๊ฒฐ ๊ณผ์ ( Windows ํด๊ฒฐ ๋ฐฉ๋ฒ )
1๏ธโฃ ํฌํธ๋๋ฒ์ ํด๋นํ๋ ๋คํธ์ํฌ ์ํ ์์ฒญ
netstat -ano | findstr :<ํฌํธ๋๋ฒ>2๏ธโฃ ํด๋น ํฌํธ์์ ์ฌ์ฉ ์ค์ธ ํ๋ก์ธ์ค ๊ฐ์ ์ข ๋ฃ
taskkill /PID <ํ๋ก์ธ์คID> /F
Config Type ๋ฐ TCP/IP, ํฌํธ ๋ฒํธ(3306)๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ํด์ค๋๋ค.๐ค ๋ฐฉํ๋ฒฝ ํด์ ๋ ์ ํ์ํ ๊น?
๋ฐฉํ๋ฒฝ์ ๋คํธ์ํฌ ๋ณด์์ ์ํด ์ธ๋ถ ์ ๊ทผ์ ์ฐจ๋จํ๋ ์ญํ ์ ํฉ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ปดํจํฐ์์ MySQL ์๋ฒ์ ์๊ฒฉ์ผ๋ก ์ ์ํ๊ธฐ ์ํด ๋ฐฉํ๋ฒฝ์ด ์ด๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.

์ธ์ฆ ๋ฐฉ์์ ์ ํํ์ฌ Next >๋ฅผ ๋๋ฌ์ค๋๋ค.
๊ฐ๋ ฌํ ๋น๋ฐ๋ฒํธ ์ํธํ ๋ฐฉ์ (โ ์ถ์ฒ)
โ ๏ธ ๋ง์ฝ ์ฌ์ฉ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๊ฐ ์ด ๋ฐฉ์์ ์ง์ํ์ง ์์ผ๋ฉด, MySQL ์๋ฒ์ ์ฐ๊ฒฐํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
์ต์ ๋ณด์ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ ์์ ํ๊ฒ ๋ณดํธํฉ๋๋ค.
์๋ ์ธ์ฆ ๋ฐฉ์ ์ฌ์ฉ (๊ตฌ๋ฒ์ ํธํ ์ ์ง)

root ๊ณ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํฉ๋๋ค.
(๊ณ์ ์ ์ถ๊ฐํ ์ ์์ง๋ง ๊ฐ์ธ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ถ๊ฐํ์ง ์๊ฒ ์ต๋๋ค.)

MySQL Server๋ฅผ Window Service๋ก ๋ฑ๋กํ๊ธฐ ์ํ ์ค์ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๊ณ Next >๋ฅผ ๋๋ฌ์ค๋๋ค.
(๊ธฐ๋ณธ ์๋น์ค ์ด๋ฆ์ด MySQL80์ธ ์ด์ ๋ MySQL 5.x๋ฅผ ์ด๋ฏธ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, "MySQL"์ด๋ผ๋ ์ด๋ฆ์ด ์ถฉ๋ํ ์ ์๊ธฐ ๋๋ฌธ์ 8.0์ด๋ผ๋ ๊ฒ์ ๋ช
์ํ๊ธฐ ์ํจ์
๋๋ค.)

์๋ฒ ํ์ผ ๊ถํ ์ค์ ์ต์
์ ์ ํํ ํ Next >๋ฅผ ๋๋ฌ์ค๋๋ค.
windows ์๋น์ค ์ฌ์ฉ์์ ๊ด๋ฆฌ์ ๊ทธ๋ฃน์ ํํด์ ์ ์ฒด ์์ธ์ค ๊ถํ์ ๋ถ์ฌ(โ ์ถ์ฒ)
๊ถํ ๋ ๋ฒจ์ ๊ฒํ ํ๊ณ ๊ตฌ์ฑํ ์ ์๋๋ก ์ค์
์๋ฒ ๊ตฌ์ฑ ํ ๊ถํ์ ๊ด๋ฆฌ

Execute ๋ฒํผ์ ๋๋ฌ ๊ฐ ํญ๋ชฉ ์ค์ ์ ์๋ฃํฉ๋๋ค.
Finish ๋ฒํผ์ ๋๋ฌ ์ค์ ์ ๋ง์นฉ๋๋ค.
Finish ๋ฒํผ์ ๋๋ฌ ์์
์ ๋ง์นฉ๋๋ค.
(๐๋์ปค๋ฅผ ์คํํ ์ํ์์ ์งํํด์ผ ํฉ๋๋ค.)
+ ๋ฒํผ์ ๋๋ฌ Database์ ์ฐ๊ฒฐ์ ํด์ค๋๋ค.

์ด๋ฆ์ ์ ์ด์ฃผ๊ณ , OK ๋ฒํผ์ ๋๋ฌ ์๋ฃํด์ค๋๋ค.

๋น๋ฐ๋ฒํธ๋ฅผ ์ ๊ณ OK ๋ฒํผ์ ๋๋ฌ ์
์ฅํฉ๋๋ค.

์์ฑํ ํ์ผ์ ๋ค์ด๊ฐ Query ํญ์ ๋ช
๋ น๋ฌธ์ ์
๋ ฅํ๊ณ ์์ ๋ฒ๊ฐ(์คํ)โก๋ฒํผ์ ๋๋ฌ ๋ช
๋ น๋ฌธ์ ์คํ์ํต๋๋ค.

์๋ก publisher_community ์คํค๋ง๋ฅผ ๋ง๋ ํ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

๋ช
๋ น์ด๋ฅผ ํ์ธํด์ฃผ๊ณ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

์ธก๋ฉด ๋ค๋น๊ฒ์ดํฐํญ์์ ์ฐํด๋ฆญ์ ํตํด ์คํค๋ง๋ฅผ ์์ฑํ์ฌ ์ค๋๋ค.

์ง๋๋ฒ ๋ง๋ค์๋ ํ ์ด๋ธ์ ์์ ํ์ฌ ์ด๋ฅผ ๋ฐ์ดํฐ ํ ์ด๋ธ๋ก ์์ฑํ๊ฒ ์ต๋๋ค.
| ๋ฒํธ(id) | ์๊ฐ๋ช | ๊ตฌ๋ ์ ์ | ์ฑ ์ | user_id |
|---|---|---|---|---|
| 1 | ์กฐ์ ๋ | 100 | 10 | 1 |
| 2 | ๊นํ | 20 | 20 | 2 |
| 3 | ํ๊ฐ | 500 | 10 | 3 |
| 4 | ์ ๊ฒฝ์ | 100 | 10 | 1 |
| 5 | ํฉ์์ | 200 | 15 | 3 |
| 6 | ์ต์์ | 300 | 5 | 1 |
| 7 | ์ค์ดํ | 150 | 7 | 3 |
| ํ์ ID | ์ถํ์ฌ | ๋น๋ฐ๋ฒํธ | ์ฐ๋ฝ์ฒ | ์ด๋ฉ์ผ |
|---|---|---|---|---|
| 1 | ๋ฌธํ๋๋ค | 1111 | 031-955-8888 | contact@munhak.com |
| 2 | ๋ฏผ์์ฌ | 2222 | 02-515-2000 | info@minumsa.com |
| 3 | ์ฐฝ๋น | 3333 | 02-3780-0700 | support@changbi.com |
users ํ
์ด๋ธ ์์ฑํ ํ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

๐ค ํ๋จ Auto Increment๊ฐ ๋นํ์ฑ์ผ ๋
์ ์ฒดํฌ๋ฐ์ค์ ์๋ ์ฒดํฌ๋ฐ์ค๋ ๊ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ AI(Auto Increment) ์ฒดํฌ๋ฒํผโ ์ ๋๋ฌ์ค๋๋ค.
users ํ
์ด๋ธ ๋ช
๋ น์ด๋ฅผ ํ์ธํด์ฃผ๊ณ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

authors ํ
์ด๋ธ์ ์์ฑํ ํ FKํค๋ฅผ ์์ฑํ๊ธฐ ์ํด ํ๋จ์ Foreign Keys ํญ์ ๋๋ฌ์ค๋๋ค.

์ฐธ์กฐํ ํ
์ด๋ธ์ ์ ํํ ํ, ์ฐธ์กฐํ๋ ํ
์ด๋ธ๊ณผ ์ฐธ์กฐ๋๋ ํ
์ด๋ธ์ ์นผ๋ผ์ ์ง์ ํ๊ณ Apply ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.

authors ํ
์ด๋ธ ๋ช
๋ น์ด๋ฅผ ํ์ธํด์ฃผ๊ณ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

INDEX:user_id์ปฌ๋ผ์ ๋ํดASC(์ค๋ฆ์ฐจ์) ์ ๋ ฌ๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑํฉ๋๋ค.
CONSTRAINT:user_id์ปฌ๋ผ์ ๋ํด ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํฉ๋๋ค.
ON DELETE NO ACTION:usersํ ์ด๋ธ์id๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐauthorsํ ์ด๋ธ์์ ํด๋นuser_id๊ฐ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
ON UPDATE NO ACTION:usersํ ์ด๋ธ์id๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋authorsํ ์ด๋ธ์user_id๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
users ํ
์ด๋ธ์ ๊ฐ์ ๋ฃ๊ธฐ ์ํด ํ ์์ด์ฝ์ ์ ํํ ํ insert rows ์์ด์ฝ์ ์ ํํ์ฌ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

users ํ
์ด๋ธ INSERT ๋ช
๋ น์ด๋ฅผ ํ์ธํด์ฃผ๊ณ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

authors ํ
์ด๋ธ์ ๊ฐ์ ๋ฃ๊ธฐ ์ํด ํ ์์ด์ฝ์ ์ ํํ ํ insert rows ์์ด์ฝ์ ์ ํํ์ฌ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.

authors ํ
์ด๋ธ INSERT ๋ช
๋ น์ด๋ฅผ ํ์ธํด์ฃผ๊ณ Apply ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.


npm install โsave mysql2
์ฝ๋ DB๋ฅผ ์ฐ๋ํ๊ธฐ ์ํด์ mysql2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ค๋๋ค.
์์ ์ฝ๋๋ฅผ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
// Get the client
const mysql = require('mysql2');
// Create the connection to database
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'publisher_community',
});
// A simple SELECT query
connection.query('SELECT * FROM `users` ', function (err, results, fields) {
console.log(results); // results contains rows returned by server
console.log(fields); // fields contains extra meta data about results, if available
});
์ถ๋ ฅ๋ result์ fields ๊ฐ์ ํ์ธํฉ๋๋ค.

์ค์ ํ users์ ๊ฐ์ ๋ถ๋ฌ์ต๋๋ค.
connection.query('SELECT * FROM `users` ', function (err, results, fields) {
let { id, password, email, created_at } = results[0];
console.log(id, password, email, created_at);
});
๐ค ๋ฌธ์ 1
์ฝ๋๋ฅผ ํตํด ๋ฐ์created_at์ ์๊ฐ๊ณผWorkbench์ ์ค์ ๋ ์๊ฐ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. (DB ์๊ฐ โ ์ฝ๋ ์ถ๋ ฅ ์๊ฐ)
![]()
๐ก ํด๊ฒฐ 1
timezone ๋ช ๋ น๋ฌธ์ ํตํด ํต์ผํด์ค๋๋ค.
SET GLOBAL time_zone = 'Asia/Seoul';
์ฝ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ ์๊ฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐ค ๋ฌธ์ 2
ํ์ฌ ์๊ฐ๊ณผ 9์๊ฐ์ ์ค์ฐจ๊ฐ ๋ฐ์ํฉ๋๋ค.
๐ก ํด๊ฒฐ 2
1๏ธโฃ Global Timezone๊ณผ Session(DB) Timezone์ ํ์ธํฉ๋๋ค.
SELECT @@global.time_zone, @@session.time_zone;
2๏ธโฃ ํ์ฌ DB์ timezone์ด ์ค์ ์ด ์๋์ด ์์ผ๋ฏ๋ก ํ๊ตญ ์๊ฐ์ผ๋ก ์ค์ ํด์ค๋๋ค.
SET time_zone = 'Asia/Seoul';
3๏ธโฃ ๋ณ๊ฒฝ๋ Timezone ํ์ธํ๋ฉด ์๊ฐ์ด ์ผ์นํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
dateStrings : true ์ค์ ์ ์ถ๊ฐํ ํ ๋ค์ ์ฝ๋๋ฅผ ํ์ธํ๋ฉด ์๊ฐ์ด ๋ชจ๋ ํ๊ตญ์๊ฐ์ผ๋ก ์ผ์นํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'publisher_community',
dateStrings: true,
});

์ค์ ํ๋ API๋ฅผ ๋ค์ DB๋ฅผ ๋ฐ์ํ๋๋ก ์์ ํ์์ต๋๋ค.
๋ก๊ทธ์ธ : POST /login
request: body(email, password)
response: ${name}๋ ํ์ํฉ๋๋ค โ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
ํ์ ๊ฐ์
: POST /join
request: body(email, name, password, contact)
response: ${name}๋ ํ์ํฉ๋๋ค โ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋
ํ์ ๊ฐ๋ณ ์กฐํ : GET /users
request: body(email)
response: id, name
ํ์ ๊ฐ๋ณ ํํด : DELETE /users
request: body(email)
response: ${name}๋ ๋ค์์ ๋ ๋ต๊ฒ ์ต๋๋ค. โ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
์ฃผํฉ๊ธ์จ : ๋ณ๊ฒฝ์ฌํญ
์๊ฐ ์์ฑ : POST /authors
request : body (name, user_id)
response : 201 Created ${name}๋์ ์๊ฐ ์ํ์ ์์ํฉ๋๋ค. -> ์๊ฐ ๊ด๋ฆฌ ํ์ด์ง
์๊ฐ ์์ : PUT /authors/:id
request: URL (id), body(name)
response : 200 Ok ์๊ฐ์ด๋ฆ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ ๋์์ต๋๋ค. ๊ธฐ์กด${} => ์์ ${}
์๊ฐ ๊ฐ๋ณ ์ญ์ : DELETE /authors/:id
request: URL(id)
response : 200 Ok ${name}๋์ด ์ญ์ ๋์์ต๋๋ค. => ๋ฉ์ธ ํ์ด์ง
์๊ฐ ์ ์ฒด ์กฐํ : GET /authors
body (user_id)200 Ok ์๊ฐ ์ ์ฒด ๋ฐ์ดํฐ list, json array์๊ฐ ๊ฐ๋ณ ์กฐํ : GET /authors/:id
request: URL(id)
response : ์๊ฐ ๊ฐ๋ณ ๋ฐ์ดํฐ
์ฃผํฉ๊ธ์จ : ๋ณ๊ฒฝ์ฌํญ
์ค์น ๊ณผ์ ์์ ํฌํธ ์ถฉ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง, ๊ธฐ์กด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์ฉํ์ฌ ์์ํ๊ฒ ํด๊ฒฐํ ์ ์์๊ณ , ๊ธฐ๋ก์ ์ค์์ฑ์ ๋ํด ๊นจ๋ซ๊ฒ ๋ ํ๋ฃจ์์ต๋๋ค.
