https://myeongsu0257.tistory.com/227
저번포스팅에서는 CLI로 MariaDb에 접속해 테이블을 생성하고 Insert, Update 등의 sql문을 작성해 실습까지 해보았습니다. 적용을 하기위해 이번에는 저번에 하던 유튜브 토이프로젝트의 DB를 생성해보겠습니다.
https://myeongsu0257.tistory.com/226
이전에는 CLI로 DB및 테이블을 생성했었는데 이번에는 GUI로 해보겠습니다. 그러기 위해서는 MySqlWorkBench 환경을 설치해줍니다.
DB생성 및 테이블생성
사용자 테이블
id | 이메일 | 이름 | 비밀번호 | 연락처 |
1 | choi@mail.com | 최명수 | 1111 | 010-1234-5678 |
2 | park@mail.com | 박명수 | 2222 | 010-5555-5555 |
3 | kim@mail.com | 김명수 | 3333 | 010-5555-7777 |
4 | chim@mail.com | 김침착 | 5555 | 010-1111-2222 |
채널
채널번호 | 채널명 | 구독자수 | 영상수 | user_id |
1 | 달려라 명수 | 1 | 5 | 1 |
2 | 달려라 명수 | 20 | 50 | 2 |
3 | 걸어라 명수 | 500 | 200 | 3 |
4 | 집가고싶은채널 | 1000 | 600 | 2 |
5 | 침착맨 | 10000000 | 900 | 4 |
users테이블
먼저 사용자테이블 즉 유저테이블을 생성해보겠습니다. 이번에는 MySql WorkBench에서 생성해보겠습니다.
Youtube 스키마를 성생해주고 오른쪽마우스를 눌러 테이블생성을 해줍니다.
Apply후 확인해보면 잘 설정된 것을 볼 수 있습니다.
channels 테이블
channels테이블입니다. 채널테이블에서는 특별히 users테이블의 id를 FK(Foreign Key)로 설정해주었습니다. 그리고 sub_num과 video_count의 기본값을 0으로 설정해주었습니다.
데이터삽입
먼저 users테이블에 데이터를 삽입해주겠습니다. id는 auto_increment이기 때문에 값을 입력하지 않아도 자동으로 올라갑니다( 단, id를 입력을 한 경우 계속 입력해주는게 좋습니다. 일관성이 유지 안될 수 있기때문 따라서 왠만하면 db가자동으로 입력할 수 있도록 두는것이 좋습니다 )
channels데이터 삽입입니다. 마찬가지로 잘 들어갑니다. 주의해야할점은 user_id 즉 FK에 users테이블에 있는 id값을 넣어주어야 재대로 생성이 됩니다.
EXRESS-데이터베이스 연동
vscode의 터미널에서 npm을 이용해 설치해줍니다.
npm install --save mysql2
그리고 db-demo.js파일을 하나 만들어 아래의 코드를 입력하고 실행해줍니다.
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);
}
)
결과입니다.이전의 db에 생성된 값들이 잘 나옵니다.
이제 이 값들을 하나씩 꺼내어 사용해보겠습니다. 위의 결과를 보시면 results는 테이블에 해당하는 데이터들의 배열입니다. 따라서 results[0].id와 같이 입력하면 1을 얻을 수 있고 results[0].name을 입력하면 '최명수'를 얻을 수 있습니다. 따라서 비구조화 할당를 이용해 값을 출력해보겠습니다.
그리고 Date값을 출력해보고 싶어서 users테이블에 created_at이라는 컬럼을 하나 생성해주겠습니다.
timezone설정
콘솔로 확인해보면 값이 잘 나옵니다. 하지만 값을 보면 db의 시간과 다른걸 볼 수 있습니다. 따라서 timezone을 맞춰줘야합니다.
일단 MySQLWorkBench로가서 아래의 쿼리를 입력해주고 실행해줍니다. Global로 전체데이터베이스에 적용해주기 위해 입력해주고
아래처럼 한번더 입력해줍니다. 그러고나면 데이터베이스에서는 created_at이 대한민국시간으로 잘 변경되었습니다.
그러고 난뒤 node.js에서 확인해보면 여전히 db의 값이 아닙니다. 자세히보면 뒤에 Z가 붙어있고 소수점이 있습니다.
따라서 dateString을 이용해 형식을 맞춰줘야합니다.
dateStrings을 true로 변경해주어야합니다.
결과입니다. 이제야 db에 있는 값이 정확히 나옵니다.
db모듈화
위에 작성한 코드 즉 require하고 connection하고 query까지 작성한 코드를 필요할때마다 어떤파일에서 작성하면 비효율적일거같습니다. 따라서 모듈화를 해주면편리하게 사용할 수 있습니다.
위에 db를 불러오는 코드를 보면 현재 connection변수에 많은 것들이 담겨져있는 것을 볼 수 있는데 connection을 exports해주겠습니다. 그리고 connection.query는 복사하고 잠시 삭제하겠습니다.
const mysql = require('mysql2');
const connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'root',
database:'Youtube',
dateStrings:true
});
connection.query(
'SELECT * FROM `users`',
function(err,results,fields){
let{id,email,name,created_at}=results[0];
console.log(id);
console.log(email);
console.log(name);
console.log(created_at);
}
)
module.exports=connection;
그리고 users.js에서 불러오겠습니다.
// express 모듈 셋팅
const express = require('express')
const router = express.Router()
//db모듈불러오기
const conn = require('../mariadb')
conn.query(
'SELECT * FROM `users`',
function(err,results,fields){
let{id,email,name,created_at}=results[0];
console.log(id);
console.log(email);
console.log(name);
console.log(created_at);
}
)
.....
실행시킨 결과입니다. 모듈이 잘 불러와지고 query문도 잘 나옵니다.
그럼 현재 url이 'users'인 get메서드에 query를 작성해보면 아래처럼 body에 email을 받고 query문안에 해당 emial을 넣어주는 방식으로 처음에 작성했는데 결과값인 results에 undefined가 나왔습니다.
router
.route('/users')
.get((req, res) => {
let { email } = req.body;
console.log(email);
conn.query(
`SELECT * FROM users WHERE email=${email}`,
function (err, results, fields) {
console.log(results);
if(results.length)
{
res.status(200).json(results);
}
else{
res.status(404).json({
message: `해당 회원이 없습니다.`
})
}
}
)
})
그래서 아래처럼 수정하였습니다. SQL문에 물음표(?)로 설정한 위치에 두번째 인자에 변수(email)을 적용해줘야합니다.
conn.query(
`SELECT * FROM users WHERE email=?`,email,
function (err, results, fields) {
console.log(results);
if(results.length)
{
res.status(200).json(results);
}
else{
res.status(404).json({
message: `해당 회원이 없습니다.`
})
}
}
)
결과입니다. 데이터베이스에 있는 값이 잘 나오는 것을 확인할 수 있습니다.
'백엔드 > node.js(express)' 카테고리의 다른 글
토이프로젝트 유튜브4 (유효성검사,next) (0) | 2023.12.23 |
---|---|
토이프로젝트 유튜브4(회원API,채널API sql적용) (1) | 2023.12.22 |
Docker MariaDB db생성 및 테이블생성(삽입,수정,join) (0) | 2023.12.19 |
토이프로젝트 유튜브2(채널 API 리팩토링) (2) | 2023.12.18 |
토이프로젝트 유튜브1(회원API설계), router (0) | 2023.12.18 |