MSSQL 연결 풀을 Express 4 웹 애플리케이션의 여러 라우트에서 하나만 공유하려면, 별도의 모듈(예: db.js)에서 풀을 생성하고 내보낸 뒤, 모든 라우트 핸들러 파일에서 이를 불러와 사용하면 됩니다. Node.js 모듈 캐싱 덕분에 한 번만 생성된 풀을 모든 라우터 파일에서 동일하게 공유할 수 있습니다.
구현 방법
1단계: 별도 모듈에서 연결 풀 생성
db.js
const sql = require('mssql');
const config = {
// 데이터베이스 설정 정보
user: 'YOUR_USER',
password: 'YOUR_PASSWORD',
server: 'YOUR_SERVER',
database: 'YOUR_DATABASE',
options: {
encrypt: true // Azure 사용 시 true로 설정
}
};
const poolPromise = new sql.ConnectionPool(config)
.connect()
.then(pool => {
console.log('Connected to MSSQL');
return pool;
})
.catch(err => {
console.log('Database Connection Failed!', err);
throw err;
});
module.exports = {
sql, poolPromise
};
- 이 코드는 풀에 대한 Promise를 내보내며, require할 때마다 항상 동일한 객체가 반환됩니다.
2단계: 라우터 핸들러에서 연결 풀 사용
routes/set1.js
const express = require('express');
const router = express.Router();
const { poolPromise, sql } = require('../db');
router.get('/', async (req, res) => {
try {
const pool = await poolPromise;
const result = await pool
.request()
.input('input_parameter', sql.Int, req.query.id)
.query('SELECT * FROM mytable WHERE id = @input_parameter');
res.json(result.recordset);
} catch (err) {
res.status(500).send({ message: err.message });
}
});
module.exports = router;
- 각 라우터는 동일한 풀 인스턴스를 await poolPromise로 사용합니다.
3단계: 메인 애플리케이션에서 라우터 등록
server.js
const express = require('express');
const set1Router = require('./routes/set1');
const set2Router = require('./routes/set2');
const app = express();
app.use('/set1', set1Router);
app.use('/set2', set2Router);
app.listen(process.env.PORT || 3000, () => {
console.log(`App listening at http://localhost:${process.env.PORT || 3000}`);
});
- 연결 풀을 따로 연결할 필요 없으며, 서버만 시작하면 자동으로 모든 라우트에서 공유됩니다.
핵심 포인트
- 모듈 캐싱 덕분에 require('./db')를 통해 언제든 동일한 객체가 반환됩니다. 따라서 MSSQL 풀이 한 번만 생성되어 전체에서 공유됩니다.
- 풀 생성 시 poolPromise를 내보내고, 각 라우터에서 이를 가져와서 사용합니다.
- Promise(await poolPromise)를 사용하면 풀 초기화와 재사용 문제가 자동으로 해결됩니다.
에러 처리 및 풀 재초기화
풀에 에러가 발생하거나 닫힌 경우에는, pool의 'error' 또는 'close' 이벤트를 감지해 새로 풀을 초기화하는 로직을 db.js에 추가할 수 있습니다.
요약표
단계파일목적연결 풀 공유 방식
| 풀 생성 | db.js | 풀 생성/내보내기 | poolPromise 내보내기 |
| 라우터 사용 | routes/*.js | 핸들러에서 사용 | poolPromise 가져와서 사용 |
| 앱 실행 | server.js | 서버/라우트 구성 | 라우트 등록 시 자동 공유 |
이 방식으로 모든 라우터 및 로직 파일에서 하나의 글로벌 MSSQL 연결 풀을 사용하므로, 리소스 관리 및 코드 유지보수가 훨씬 효율적입니다.
'데이터베이스' 카테고리의 다른 글
| Node.js에서 MSSQL(Tedious) 사용 중 ConnectionError: Failed to connect to localhost:1433 - connect ECONNREFUSED 오류 (0) | 2025.09.05 |
|---|