본문 바로가기

4. Node.js | React.js

5/10(수) IT K-DT(48일차) / twitter 예제(4)

 

 

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]);
}