기타

NodeJS에서 MsSql 연동과 Connection Pool 설정

DevStory 2021. 6. 16.

Node.js에서 MS-SQL 연동 및 Connection Pool 설정 방법입니다.


Connection Pool

Connection Pool에 대해 간단하게 설명합니다.

 

일반적인 데이터베이스 연결 방법입니다.

  1. 데이터베이스 드라이버를 사용하여 데이터베이스 연결
  2. 데이터베이스에서 데이터 읽기 / 쓰기
  3. 연결 닫기

데이터베이스에서 데이터 읽기 / 쓰기 작업이 필요한 경우 위 사이클 반복합니다.

 

일반적인 방법은 데이터베이스에서 데이터 읽기 / 쓰기 작업을 할 때마다 연결 작업이 필요하므로 상당히 비용이 많이 소모됩니다.

리소스와 비용의 소모를 줄이기 위해 Connection Pool 방식을 사용합니다.

 

Connection Pool의 연결 방법입니다.

  1. 서버 실행시 데이터베이스 Connection 객체를 미리 생성하여 Pool이라는 공간에 저장
  2. 데이터베이스에서 데이터 읽기 / 쓰기 작업이 필요한 경우 Pool영역에서 Connection 객체를 사용하면 되므로 다시 연결하거나 연결을 닫을 필요가 없음(재사용성)

파일 구조 및 역할

main.js : 라우팅 처리

db.js : DataBase Driver 정보 및 Connection Pool 생성

server.js : 서버를 실행하기 위한 설정

 

Node에서 지원하는 MS-SQL 관련 패키지를 사용하기 위해 아래 명령어로 MS-SQL 패키지를 설치합니다.

npm install mssql

코드로 설명

server.js

const express = require('express');
const app = express();
const router = require('./routes/main')(app); 

var server = app.listen(3001, function(){
    console.log("Express server has started on port 3001")
});

Node 서버의 포트를 3001로 설정하였으며, main.js에서 요청에 대한 처리를 합니다.

 

db.js

const sql = require('mssql');

const config = {
    server: 'IP',
    port: PORT,
    options: { encrypt:false, database: 'database' },
    authentication:{
        type:"default",
        options:{
            userName:"userName",
            password:"password"
        }
    }
};

const pool = new sql.ConnectionPool(config)
  .connect()
  .then(pool => {
    console.log('Connected to MSSQL')
    return pool
  })
  .catch(err => console.log('Database Connection Failed! Bad Config: ', err))

module.exports = {
  sql, pool
}

config 객체에서 MS-SQL 접속 정보를 작성 후 ConnectionPool 객체를 생성합니다.

 

main.js

const { sql, pool } = require('../db');

module.exports = function(app)
{
    app.get('/', async (req,res) => {
        try{
        const pool = await pool;
    
        const result = await pool.request()
            .input('A', sql.Numeric, '2')
            .query('SELECT * FROM TEST WHERE A = @A');
        res.send(result);
        } catch(err) {
            res.status(500);
            res.send(err.message);
        }
    });

    app.get('/about', async(req,res) => {
        console.log('about.html request');
        res.send('about.html');
    });
}

기본 경로 '/'로 접속시 Connection Pool을 사용하여 DataBase Server에서 데이터를 조회합니다.

 

※ 주의사항

const result = await pool.request()
	.query('SELECT * FROM TEST WHERE A = 10');

TEST 테이블에서 A라는 칼럼의 Type이 숫자형이 아닌데, 위 쿼리를 사용할 경우 아래 에러가 발생합니다.

「 Conversion failed when converting the nvarchar value 'YJM' to data type int. 」

const result = await pool.request()
	.query('SELECT * FROM TEST WHERE A = ' + String(10) + '');

위 방식으로 코드를 작성해도 동일한 에러가 발생하며, SQL Injection이 가능합니다.

귀찮더라도 매개 변수를 사용하여 쿼리를 작성하는 방법을 권장합니다.


서버 실행 후 데이터 확인

DataBase Server에 저장되어 있는 데이터입니다.

조회된 데이터입니다.


Query가 아닌 프로시저를 호출하는 경우

프로시저

CREATE PROC KJS_TEST_PROCEDURE
(
@B INT
)
AS

BEGIN

SELECT *
FROM TEST
WHERE B = @B

END

main.js

const { sql, pool } = require('../db');

module.exports = function(app)
{
    app.get('/', async (req,res) => {
        try{
        const pool = await pool;
    
        const result = await pool.request()
            .input('B', sql.Numeric, 2)
            .execute('KJS_TEST_PROCEDURE');
        res.send(result);
        } catch(err) {
            res.status(500);
            res.send(err.message);
        }
    });

    app.get('/about', async(req,res) => {
        console.log('about.html request');
        res.send('about.html');
    });
}

실행 결과


MS-SQL 패키지의 추가적인 기능은 공식 사이트에서 확인 부탁드립니다.

 

mssql

Microsoft SQL Server client for Node.js.

www.npmjs.com

 

반응형

댓글