The Ultimate MySQL Bootcamp 16강을 공부하며 정리한 내용입니다.
16강에서는 Node.js와 MySQL을 사용해서 간단한 웹앱(JOIN US)를 구현한다.
A Startup Mailing List Application
: collecting people's emails to send updates or invite them
withshepherd/faker
(faker
has been deleted for some reason. use npm install @withshepherd/faker
instead)mysql
NodeJS의 mysql 패키지를 설치해 Node와 MySQL을 연결하고 Faker 패키지를 설치해 500개 이상의 랜덤 유저 이메일을 생성하고 DB에 추가해보자.
const faker = require("@withshepherd/faker");
const mysql = require("mysql");
const connection = mysql.createConnection({
host: "localhost",
user: process.env.USER,
password: process.env.PW,
database: process.env.DATABASE,
});
//예시
const query = "SELECT CURTIME() AS time, CURDATE() AS date, NOW() AS now";
connection.query(query, function (err, results, fields) {
if (err) throw err;
console.log("The solution is: ", results[0]);
});
connection.end();
//schema.sql
//source /schema.sql
CREATE TABLE users (
email VARCHAR(255) PRIMARY KEY,
created_at TIMESTAMP DEFAULT NOW()
);
const person = {
email: 'Jenny55@gmail.com'
};
const query = 'INSERT INTO users SET ?'
connection.query(query, function (err, results, fields) {
if(err) throw err;
console.log(results);
})'
connection.end();
//위의 쿼리문은 다음과 동일하다.
const query = 'INSERT INTO users (email) VALUES ('Jenny55@gmail.com')'
//faker를 사용해 동적으로 데이터 추가하기
const person = {
email: faker.internet.email(),
created_at: faker.date.past()
};
const query = 'INSERT INTO users SET ?';
connection.query(query, person, function(err, results, fields) {
if(err) throw err;
console.log(results);
});
const data = [];
for(let i=0; i<500; i++){
data.push([
faker.internet.email(),
faker.data.past()
]);
}
//console.log(data);
/*
[
[ 'Elva62@yahoo.com', 2021-07-09T05:43:47.154Z ],
[ 'Joseph.Gerlach@gmail.com', 2021-02-26T16:45:10.016Z ],
[ 'Nadia28@yahoo.com', 2021-05-15T14:43:03.037Z ],
[ 'Rico.Beer@yahoo.com', 2021-01-28T06:19:29.752Z ], ...
]
*/
const query = 'INSERT INTO users (email, created_at) VALUES ?';
connection.query(query, [data], function(err, results, fields) {
if(err) throw err;
console.log(results);
});
connection.end();
🔍 MySQL에 직접 날짜를 입력하고, MySQL에 저장되는 형식과 다르게 저장한다면 다음과 같은 에러가 발생한다.
INSERT INTO (email, created_at) VALUES ('soh@gmail.com','MON')
🔍 faker 패키지의 faker.date.past()
로 만들어진 날짜도 위의 예시처럼 MySQL에 저장되는 형식과 다르다. 만약 mysql 패키지에서 쿼리문을 보내도 에러가 발생할까?
const person = {
email: faker.internet.email(),
created_at: faker.date.past(),
};
console.log(person);
//{ email: 'Jon14@yahoo.com', created_at: 2022-01-06T17:23:52.418Z }
const query = "INSERT INTO users SET ?";
const res = connection.query(query, person, function (err, results, fields) {
if (err) throw err;
console.log(results);
});
console.log(res.sql);
//INSERT INTO users SET `email` = 'Clinton38@gmail.com', `created_at` = '2021-09-22 15:42:48.828'
위에서 볼 수 있는 것처럼 mysql 패키지를 통해 MySQL DB에 데이터를 추가하는 경우, 전달한 created_at의 데이터타입은 DB에서 저장되는 데이터타입과 다르지만, 패키지 자체적으로 문자열로 전환해 전송함으로써 DB에 적절하게 데이터가 추가된다.
이 내용은 mysqljs/mysql에서 확인할 수 있다.
🔍 다음 데이터를 조회하는 쿼리문을 작성해보자.
SELECT
DATE_FORMAT(min(created_at), '%M %D %Y')
AS earliest_date
FROM users;
SELECT *
FROM users
WHERE created_at = (SELECT MIN(created_at) FROM users);
SELECT
MONTHNAME(created_at) AS month,
count(*) AS count
FROM users
GROUP BY month
ORDER BY count;
SELECT
count(*) AS yahoo_users
FROM users
WHERE email LIKE '%@yahoo.com';
SELECT
CASE
WHEN email LIKE '%@gmail.com%' THEN 'gmail'
WHEN email LIKE '%@yahoo.com%' THEN 'yahoo'
WHEN email LIKE '%@hotmail.com%' THEN 'hotmail'
ELSE 'other'
END AS provider,
COUNT(*) as total_users
FROM users
GROUP BY provider
ORDER BY total_users DESC;