node.js와 DB 사용

node.js와 DB 사용

  1. npm install mysql 모듈 설치

  2. mysql.createConnection(DATABASE-CONFIG); 커넥션

    • 커넥션 설정

      • host, port : DMBS 주소와 포트(기본 3306)
      • user, password : DBMS 사용자 계정과 암호
      • database : 데이터베이스 이름
      • multipleStatements : 동시에 여러 SQL 실행. 보안에 주의
      • connectTimeout : DBMS 연결 타임 아웃 시간. 기본은 10,000 ms
      1
      2
      3
      4
      5
      6
      7
      var dbConfig = {
      host : 'localhost',
      user : 'root',
      password : '1234'
      database : 'Moviest'
      };
      var connection = mysql.createConnection(dbConfig);
    • 커넥션 연결과 닫기

      1
      2
      3
      4
      5
      6
      7
      8
      connection.connect(function(err) {
      if (err) {
      console.error('error connecting: ' + err.stack);
      return;
      }
      console.log('connected as id ' +v connection.threadId);
      connection.end();
      });
    • 커넥션 풀 사용하기

      • 생성

        1
        mysql.createPool(Option)
      • 풀의 옵션풀 옵션

        • waitForConnections : 풀에 여유 커넥션이 없는 경우 대기 여부
        • connectionLimit : 최대 커넥션 개수. 기본 10개
      1
      2
      3
      4
      5
      6
      var pool = mysql.createPool({
      host : 'localhost',
      user : 'user',
      password : '1234’,
      connectionLimit : 50
      });
      • 풀에서 커넥션 얻기

        1
        2
        3
        pool.getConnection(function(err, connection{
        // connected! (unless `err` is set)
        });
      • 풀에 커넥션 반환 conn.release();

      • 풀 닫기 pool.end();

    • 커넥션 모듈 분리

      • DB 커넥션 모듈

        1
        2
        3
        var mysql = require('mysql');
        var dbPool = mysql.createPool(dbConfig);
        module.exports = dbPool;
      • 모듈 사용

        1
        2
        var pool = require(‘./dbconnection’);
        pool.getConnection(function(err, conn) {});
  3. SQL 문 실행

    1
    2
    3
    4
    5
    6
    7
    8
    var sql = 'INSERT INTO movies ...';
    connection.query(sql,function(err, results) {
    if ( err ) {
    console.error('INSERT Error', err);
    } else {
    console.log('results : ', results);
    }
    });
    1
    2
    3
    4
    5
    var sql = 'INSERT INTO movies (title, director, year) VALUES (?, ?, ?);';
    // 인터스텔라, 크리스퍼 놀란, 2015가 순차적으로 들어간다
    connection.query(sql, ['인터스텔라', '크리스토퍼 놀란', 2015],function(err, results){
    // 에러와 결과 처리
    });
    • insert 문 실행

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      var data = {
      title : '메멘토',
      director : '크리스토퍼 놀란',
      year : 2000
      };
      var sql = 'INSERT INTO movies SET ?';
      connection.query(sql, data, function(err, results) {
      // 에러 처리
      // 결과 사용
      connection.release();
      });
      • 실행 결과
        • affectedRow : 영향을 받은 열의 갯수
        • insertID : 새로 추가한 경우 Primary Key
        • changedRow : 변경된 열의 수
    • select 문 실행

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      var sql = 'SELECT * FROM movies';
      conn.query(sql, function(err, results) {
      if ( err ) {
      console.error('Error', err);
      return;
      }
      for (var i = 0 ; i < results.length ; i++) {
      var movieInfo = results[i];
      console.log('제목 : ' + movieInfo.title + ' 감독 : ' + movieInfo.director);
      }
      conn.release();
      });
      • movieInfo에 하나의 레코드가 반환된다

SQL Injection 방지하기

mysql.escape()을 사용하거나 PlaceHolder 사용하기 (?,?,?)

트랜잭션

conn.beginTransaction(function(err) { } );

  • conn.commit() : 트랜잭션 내 변경 확정
  • conn.rollback() : 트랜잭션 내 변경 되돌리기

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
conn.beginTransaction(function(err) {
conn.query(sql1, function(err, result) {
if ( err ) {
conn.rollback();
return;
}
conn.query(sql2, function(err, result) {
if ( err ) {
conn.rollback();
return;
}
conn.commit();
});
});
});