1️⃣ MySql Workbrench
처음 실행하게 되면 아래와 같은 화면이 뜬다

시작에 앞서 docker가 켜져있는지 확인하는 것도 중요함(mysql은 docker위에 설치되어 있기 때문)

여기서 커넥션을 새로 만들면(Database -> connect to database) 다음과 같은 창이 나온다

실행을 하면 다음과 같은 화면이 나옴

내가 만든 보드와 테이블들이 나옴

내가 만든 테이블이 어떤 컬럼의 형태인지도 나옴

SELECT를 해보니 오류가 발생함 👉 보드를 더블클릭 후 만들어야 한다는 말

실행을 해보니 테이블을 잘 확인할 수 있음

여기서 테이블 칸을 더블클릭하면 바로 수정이 가능함! 수정이 너무 쉬워짐

2️⃣ 커넥션 메서드에 나오는 항목들은 아래와 같은 의미를 가짐

1️⃣ SQL 에디터의 폰트 크기를 바꿔보자

2️⃣ 스키마 만들기



3️⃣ 테이블 만들기
테이블은 스키마 안에 있는 테이블을 우클릭하면 바로 만들 수 있다.

테이블 생성에 들어가면 컬럼을 만들 수 있다.
데이터 타입도 바로 설정이 가능하며, 기능 설정은 선택하면 된다

테이블 설정을 마치고 Apply를 하게되면 검토할 수 있는 창이 나온다.

1️⃣ channels 테이블을 만들어 보자
id는 PK, NN, AI(자동 올림)로 설정해둔다
구독자 수와 비디오 수는 NULL값으로 두는 것 보다는 기본을 0으로 둔다

FK의 경우는 아래 Foreign Keys에서 상세하게 설정을 해줄 수 있다.

Apply를 클릭하면 리뷰가 나오고
user_id) 컬럼을 REFERENCES Youtube.users (id)과 엮어서 쓰겠다는 내용
2️⃣ 테이블 INSERT를 해보자
테이블의 오른쪽 끝 버튼을 클릭하면 값을 하나씩 넣어줄 수 있음

Auto Increment로 인하여 아이디는 자동으로 하나씩 늘어나게 됨
내가 중간에 아이디를 수정하게 되면 그 값대로 늘어나기 때문에 웬만하면 손대지 않고 AI에 맡기는 것이 좋음

채널 테이블에서 없는 user_id를 넣게 되면 에러가 발생하기도 함
FK에 데이터를 넣을 때는 주의하자

1️⃣ 워크벤치로 만든 디비를 코드와 연동하기
연동을 위한 모듈 설치를 위해 npm 홈페이지에서 mariadb 모듈을 찾아 설치하자
아니면 mysql 모듈을 설치해도 좋다. mariadb는 어차피 mysql위에서 돌아가기 때문임
2️⃣ 데이터베이스 연동을 확인해보자(에러 발생)
// Get the client
import mysql from 'mysql2/promise';
// Create the connection to database
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
});
// A simple SELECT query
try {
const [results, fields] = await connection.query(
'SELECT * FROM `table` WHERE `name` = "Page" AND `age` > 45'
);
console.log(results); // results contains rows returned by server
console.log(fields); // fields contains extra meta data about results, if available
} catch (err) {
console.log(err);
}
// Using placeholders
try {
const [results] = await connection.query(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['Page', 45]
);
console.log(results);
} catch (err) {
console.log(err);
}
SyntaxError: Cannot use import statement outside a module
에러가 발생하는 이유는 기본적으로 Node.js가 CommonJS 방식의 require 문법을 사용하는데, 여기서 import 문법을 사용하려고 했기 때문이다.
따라서, package.json에 "type": "module"을 추가하거나, import 문법 대신 CommonJS 문법인 require를 사용하면 해결된다.
3️⃣ 정상 작동 확인
// Get the client
const mysql = require('mysql2/promise');
// Create the connection to database
async function connectToDatabase() {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'Youtube', // 유튜브로 수정
});
// A simple SELECT query
try {
const [results, fields] = await connection.query(
'SELECT * FROM `users`'
);
console.log(results); // results contains rows returned by server
console.log(fields); // fields contains extra meta data about results, if available
} catch (err) {
console.log(err);
}
}
connectToDatabase();

1️⃣ DB에서 데이터를 꺼내써보자
// Get the client
const mysql = require('mysql2/promise');
// Create the connection to database
async function connectToDatabase() {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'Youtube', // 데이터베이스 이름을 'Youtube'로 설정
});
// A simple SELECT query
try {
const [results, fields] = await connection.query( // await를 사용하여 쿼리 결과가 올 때까지 기다립니다. 쿼리의 결과는 results와 fields라는 두 가지 값으로 반환됩니다.
'SELECT * FROM `users`' // results: 데이터베이스에서 가져온 행들의 배열, fields: 쿼리 결과에 대한 메타데이터
);
let arr = [1, 2, 3];
console.log(arr[0]); // 1을 출력함, 원하는 것을 가져와서 출력할 수 있음
console.log(results[0].id); // 첫번째 배열의 id를 출력함
console.log(results); // 테이블에 저장된 데이터를 모두 가져와 출력
console.log(fields); // 메타데이터를 가져와 출력하는 것을 확인
} catch (err) {
console.log(err);
}
}
connectToDatabase(); //이 함수는 데이터베이스에 연결하고, 쿼리를 실행한 후 결과를 처리하는 비동기 함수입니다. connectToDatabase()를 호출하여 실제로 이 함수가 실행되도록 합니다.
2️⃣ 비구조화를 이용하면 더 빠르게 값을 가져올 수 있다
try {
const [results, fields] = await connection.query(
'SELECT * FROM `users`'
);
console.log(results[0].id); // 이렇게 가져오는 방식과
console.log(results[0].email);
console.log(results[0].name);
let {id, email, name} = results[0] // 비구조화로 가져오는 방식의 반환이 같음
console.log(id);
console.log(email);
console.log(name);
} catch (err) {
console.log(err);
}
}
3️⃣ users테이블에 created_at 추가
그렇다면 date에 대한 값도 잘 가져올 수 있는지 확인해 보기 위해 생성일자 컬럼을 추가해보자
users테이블 오른쪽 공구모양을 클릭하면 컬럼을 수정해줄 수 있다.
생성일자 컬럼의 데이터타입은 TIMESTAMP로 하고 기본값을 NOW 또는 CURRENT_TIMESTAMP()를 적어주면 된다.

잘 작동하는 것을 확인 할 수 있다.

1️⃣ 지역별 시간대를 설정해보자
// Get the client
const mysql = require('mysql2/promise');
// Create the connection to database
async function connectToDatabase() {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: '1234',
timezone: 'Asia/Seoul', // 시간대 지역을 서울로 설정
database: 'Youtube', // 데이터베이스 이름을 'Youtube'로 설정
});

2️⃣ 데이터베이스에서 타임존을 설정해주자
데이터베이스에서 설정해주기 위해 SET GLOBAL time_zone = 'Asia/Seoul'를 명령하고 확인해보면,,, 그래도 변하지 않은 걸 볼 수 있음

그렇다면 콘솔로그에서는? 한국시간으로 잘 출력이 된다!

데이터베이스의 세팅을 확인해보면 글로벌(전체영역)은 한국시간이지만 세션은 그대로인 것을 확인할 수 있었고

세션에 대해서 시간대 적용을 해주니 곧바로 바뀐 것을 확인할 수 있다.


근데 또 코드에서 timezone: 'Asia/Seoul'를 제거하고 실행하면 안된다... 이건 다음에 알아보자

3️⃣ 시간 뒤에 따라오는 소수점을 지우자
dateStrings: true를 추가해주면 된다.

데이터베이스에 저장을 하게 되면 string으로 저장되지 않고 날 것의 데이터로 저장되기 때문에 형식을 변경해주어야 한다.