데이터베이스

Express 4에서 MSSQL Pool을 사용하는법

starshorse 2025. 9. 5. 11:50

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 연결 풀을 사용하므로, 리소스 관리 및 코드 유지보수가 훨씬 효율적입니다.