Node.js에서 MS-SQL 연동 및 Connection Pool 설정 방법입니다.
Connection Pool
Connection Pool에 대해 간단하게 설명합니다.
일반적인 데이터베이스 연결 방법입니다.
- 데이터베이스 드라이버를 사용하여 데이터베이스 연결
- 데이터베이스에서 데이터 읽기 / 쓰기
- 연결 닫기
데이터베이스에서 데이터 읽기 / 쓰기 작업이 필요한 경우 위 사이클 반복합니다.
일반적인 방법은 데이터베이스에서 데이터 읽기 / 쓰기 작업을 할 때마다 연결 작업이 필요하므로 상당히 비용이 많이 소모됩니다.
리소스와 비용의 소모를 줄이기 위해 Connection Pool 방식을 사용합니다.
Connection Pool의 연결 방법입니다.
- 서버 실행시 데이터베이스 Connection 객체를 미리 생성하여 Pool이라는 공간에 저장
- 데이터베이스에서 데이터 읽기 / 쓰기 작업이 필요한 경우 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 패키지의 추가적인 기능은 공식 사이트에서 확인 부탁드립니다.
'기타' 카테고리의 다른 글
C# 온라인 컴파일러 .NET Fiddle (1) | 2021.07.24 |
---|---|
CodePen에서 React 개발환경 구축하기 (0) | 2021.07.04 |
[CodePen]티스토리와 CodePen 연동 (0) | 2021.05.19 |
[PowerShell]이 시스템에서 스크립트를 실행할 수 없으므로 파일을 로드할 수 없습니다. (0) | 2021.05.14 |
[Node]Window10에서 Node.js 버전 업그레이드 (0) | 2021.05.13 |
댓글