
9. SQL
9-1. MySQL과의 상호작용
MySQL을 통해 node.js에 DB를 연동하는 작업 실행.
1. 스키마 생성
Create Sechema로 스키마를 새롭게 생성.

Name을 'Dwitter'로 지어주고, 우측하단의 Apply 클릭 후 계속 진행후 생성.

2. 테이블 생성
Create Tables로 테이블을 새롭게 생성.

아래의 'users' 테이블, 'tweets' 테이블 내용을 모두 채운 후 Apply 클릭.


foriegn key 설정 후 apply 클릭

3. 코드 작성
server 폴더 內 mysql과 nodejs의 연동에 필요한 라이브러리 설치
npm i mysql2
mysql2: Node.js를 사용하여 MySQL 데이터베이스에 연결하고 쿼리를 실행하는 데 사용되는 MySQL 클라이언트 라이브러리. 이 패키지는 비동기 처리를 지원하며, 높은 성능과 확장성을 제공함. Node.js 애플리케이션에서 MySQL 데이터베이스에 접속하고, 데이터를 조회, 삽입, 수정, 삭제하는 등의 작업을 수행함. 이 패키지는 MySQL 서버와의 연결을 관리하고, SQL 쿼리를 실행하며, 결과를 처리하는 기능을 제공함. |
C:\yjcho\Node.js\Project\Server\db\database.js
경로에 해당 내용 추가/수정.
import mysql from 'mysql2'; import {config} from '../config.js'; const pool = mysql.createPool({ host: config.db.host, // 연결정보 삽입. user: config.db.user, database: config.db.database, password: config.db.password // password는 문자취급해야하므로, parseIn()으로 씌우지 않는다. }); export const db = pool.promise(); |
database.js에 작성한 pool을 .env로 바꿔보기
C:\yjcho\Node.js\Project\Server\.env
경로에 해당 내용 추가/수정.
DB_HOST=localhost DB_USER=root DB_DATABASE=dwitter DB_PASSWORD=1234 |
C:\yjcho\Node.js\Project\Server\config.js
경로에 해당 내용 추가/수정.
export const config = { jwt: { secretKey: required('JWT_SECRET'), expiresInSec: parseInt(required('JWT_EXPIRES_SEC', 86400)), }, bcrypt: { saltRounds: parseInt(required('BCRYPT_SALT_ROUND', 12)), }, host: { port:parseInt(required('SERVER_PORT', 8080)) }, db: { host: required('DB_HOST'), user: required('DB_USER'), database: required('DB_DATABASE'), password: required('DB_PASSWORD') } } |
C:\yjcho\Node.js\Project\Server\index.js
경로에 해당 내용 추가/수정.
import {db} from "./db/database.js"; db.getConnection().then((connection)=>console.log(connection)); |
server 실행 후 정상적으로 작동 여부의 확인가능

C:\yjcho\Node.js\Project\Server\data\auth.js
경로에 해당 내용 추가/수정.
// password : abcd1234 -> $2b$10$Na0qDeTiUrfeDHZqnSF7yuzVoNvUI5rml57D/ZL11uk9wankrOWNO // let users = [{ // id: '1', // username: 'melon', // password:'$2b$10$Na0qDeTiUrfeDHZqnSF7yuzVoNvUI5rml57D/ZL11uk9wankrOWNO', // name:'이메론', // email:'melon@melon.com', // url:' https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS87Gr4eFO7Pt2pE8oym4dxXnxGZYL2Pl_N5A&usqp=C // } // ]; // 이제부터 db를 끌어오기 때문에 위의 내용은 더 이상 필요가 없음 import {db} from '../db/database.js'; export async function findByUsername(username){ return db.execute('select id from users where username=?', [username]).then((result)=>result[0][0]); } export async function createUser(user){ const {username, password, name, email, url} = user; return db.execute('insert into users (username, password, name, email, url) values (?, ?, ?, ?, ?)', [username, password, n ame, email, url]) .then((result)=>console.log(result)); } export async function findById(id){ return db.execute('select id from users where id=?', [id]).then((result)=>result[0][0]); } |
Server 실행
Postman 프로그램으로 send 실행 시 MySQL에도 연동되어 orange의 데이터가 입력된 것을 확인할 수 있다.


orange에서 avocado로 변경한 후, signup을 통해 확인해보기.

아래 터미널의 insertId가 2개로 변경됨.

다시 한번 실행해보면,

postman으로 실행 시 메시지가 뜸

id로도 이런식으로 찾기기능이 가능

9-2. Query문을 이용한 CRUD 기능 실행
경로 C:\yjcho\Node.js\Project\Server\data\tweet.js
공통
import * as userRepository from './auth.js'; import { db } from '../db/database.js'; const SELECT_JOIN = 'select tw.id, tw.text, tw.createdAt, tw.userId, us.username, us.name, us.email, us.url from tweets as tw left outer join users as us on tw.userId = us.id'; const ORDER_DESC = 'order by tw.createdAt DESC'; |
1)
export async function getAll() { return db.execute(`${SELECT_JOIN } ${ORDER_DESC }`) .then((result)=>result[0]); |
2)
export async function getAllByUsername(username) { return db.execute(`${SELECT_JOIN } WHERE us.username=? ${ORDER_DESC }`, [username]) .then((result)=>result[0]); |
3)
export async function getById(id) { return db.execute(`${SELECT_JOIN } WHERE tw.id=?`, [id]) .then((result)=>result[0][0]); } |
4)
export async function create(text, userId) { return db.execute("insert into tweets (text, createdAt, userId) values (?, ?, ?)", [text, new Date(), userId]) .then((result) => console.log(result)); } |
5)
export async function update(id, text) { return db.execute("update tweets set text=? where id=?", [text, id]) .then(() => getById(id)); } |
6)
export async function remove(id) { tweets = tweets.filter((tweet) => tweet.id !== id); return db.execute("delete from tweets where id=?", [id]); } |