개발 일기

Node Mysql ? 본문

서버/Node.js

Node Mysql ?

이건욱

MYSQL은 일단 대표적인 관계형 데이터베이스중에 하나입니다. 

 

사전 준비:)

  • MYSQL 설치

기본 설정:)

npm install --save mysql

 

MYSQL  연동 :)

일단 제일 먼저 간단한 소스 예제를 보여드리겠습니다. 

설명은 주석으로 작성하겠습니다.

const mysql = require('mysql')

let pool

// 제일 먼저 초기화 하는 부분입니다.
// async await 사용을 하셔도 됩니다. 일단 기본적으로 promise로 이렇게 구성하였습니다.
export async function initialize(process){

	// 현재 저는 단일커넥션 (createConnection) 과 커넥션 풀(createPool) 중에 커넥션 풀으로 사용하였습니다.
    new Promise((resolve , reject) => {
    	//db 정보를 입력합니다.
        let connection = mysql.createPool({
            host: process.DB_HOST,  // db host
            user: process.DB_USER,  // db user
            password: process.DB_PASS, // db password           
            acquireTimeout: 15000, // 시간 초과 (기본값 10000)  
            connectionLimit: 50 // 한번에 최대 limit 수 ( 기본값 10 )
        })
		
        // 데이터 베이스 생성 schema == database 같습니다.
        connection.getConnection((err, connection) => { 
            if (err) { return reject(err) } 
            connection.query('CREATE SCHEMA IF NOT EXISTS words DEFAULT CHARACTER SET utf8', null , (error, result) => {
                connection.release() 
                error ? reject(error) : resolve(result)
            })
        })
    }).then(() => {
        pool = mysql.createPool({
            host: process.DB_HOST,        
            database: process.DB_NAME,        
            user: process.DB_USER,               
            password: process.DB_PASS,            
            acquireTimeout: 15000,      
            connectionLimit: 50
        })
    }).catch(error => {
        console.log(error)
    })
}

// 쿼리 요청
// 요청 예시 :)
let obj = {
  sql : "INSERT INTO users ( email , code ) VALUES (? , ?)",
  params : [email , code]
}
export async function query(sqlObj) {
    return new Promise((resolve, reject) => {
    	// connection 얻고 쿼리 실행
        pool.getConnection((err, connection) => { 
            if (err) { return reject(err) } 
            connection.query(sqlObj.sql, sqlObj.params, (error, result) => {
                connection.release() 
                error ? reject(error) : resolve(result)
            })
        })
    })
}


// mysql은 transaction을 지원합니다. 
// 그래서 다음과 같이 rollback or commit을 할수가 있습니다.
export async function transaction(sqlArr) {
    return new Promise((resolve, reject) => {
        pool.getConnection((poolError, connection) => { 
            if (poolError) { return reject(poolError) } 
            // transaction 시작
            connection.beginTransaction(async err => { 
                if (err) { return reject(err) } 
                let result = [],	
                    errInfo = null
                for (let i = 0; i < sqlArr.length; i++) {
                    try {
                        result.push(await new Promise((resolve, reject) => {
                            connection.query(sqlArr[i].sql, sqlArr[i].params, (err, result) => {
                                err ? reject(err) : resolve(result)
                            })
                        }))
                    } catch (e) { 
                        errInfo = e
                        break
                    }
                }
                
                if (errInfo) {
                	// 에러가 생기면 이때 가지 한 내용 취소
                    connection.rollback(() => {
                    	connection.release()
                        reject(errInfo)
                    })
                } else {
                	// 저장
                    connection.commit(err => { 
                    	connection.release()
                        err ? reject(err) : resolve(result)
                    })
                }
            })
        })
    })
}

 

'서버 > Node.js' 카테고리의 다른 글

CORS ?  (0) 2020.05.02
Database migration (db-migrate)  (0) 2020.05.02
bcrypt ?  (0) 2020.04.15
Node js 보안 - (1)  (0) 2020.04.11
Node Mailer 란?  (0) 2020.04.04
Comments