본문 바로가기
카테고리 없음

PM2, 커넥션 풀링

by 잘먹는 개발자 에단 2025. 4. 10.

** 상황가정 **

- PM2로 node api를 돌리고, 이를 IIS로 역방향 프록시를 걸어서 api에 전달한다. 

 

- PM2가 index.js를 실행하는 순간에 Node.js 프로세스가 메모리에 로드되고 실행된다.

- 이 때 index.js의 모든 초기화 코드가 실행되고, 그 중 커넥션 풀 생성코드 poolPromise도 실행된다.

- 즉 IIS 서버에 대한 어떠한 클라이언트 측 요청과 상관없이 PM2가 프로세스를 시작할 때, 이미 각 프로세스는 독립적으로 구동되고, 커넥션 풀도 생성되서 대기 상태가 된다.

 

** 역방향 프록시와의 관계

- IIS가 역방향 프록시 역할을 하여 리액트 앱에서 오는 요청을 Node 어플리케이션, 즉 pm2로 실행중인 프로세스로 전달한다. 

- 이 때 이미 실행된 Node.js 프로세스가 존재하기 때문에, 요청이 들어오면 해당 프로세스의 핸들러로 바로 전달되서 처리된다.

- 즉, IIS가 요청을 전달하는 시점에 새로운 프로세스가 생성되는 것이 아니라, PM2 시작 시점에 이미 프로세스와 커넥션 풀이 모두 생성된 상태이다. 

 

 

 

 

*** 커넥션 풀 ***

- 커넥션 풀이란 데이터베이스와의 연결을 여러개 생성하여 저장해두고, 클라이언트 요청이 들어올 때마다 이미 생성되어 있는 연결을 재사용하는 메커니즘을 의미합니다. 이를 통해서 매번 새로운 데이터베이스 연결을 생성하는 오버헤드를 줄이고 어플리케이션의 응답성을 높일 수 있다. 

 

 

const config = {
  server: "ETHANGRAM",
  database: "TEST",
  driver: "msnodesqlv8", // 드라이버 명시 (필요시)
  options: {
    trustServerCertificate: true,
    trustedConnection: true, // Windows 인증 활성화
  },
  pool: {
    max: 10, // 최대 연결 수
    min: 4, // 최소 연결 수
    idleTimeoutMillis: 10000,
    // 커넥션이 사용되지 않고, 대기상태일 때 얼마동안 유지할지지
  },
};

const poolPromise = sql
  .connect(config)
  .then((pool) => {
    console.log("SQL SERVER에 연결됨");
    return pool;
  })
  .catch((err) => {
    console.error("SQL SERVER 연결 실패", err);
    process.exit(1); // 연결 실패시 프로세스 종료
  });

 

* config 객체

- server, database, driver 등의 데이터베이스 연결 정보를 포함한다. 

- options 객체 내에 trustServerCertificate와 trustedConnection을 설정하여 보안 인증 관련 옵션을 지정한다.

- pool 객체 내에 max( 최대연결 수 ), min ( 최소 연결 수 ), idleTimeoutMillis ( 유휴 연결이 유지되는 시간 ) 등의 풀 동작에 관한 옵션을 포함한다.

 

* sql.connect(config)를 호출하면 설정에 따라서 데이터베이스에 연결을 시도하며, 이 때 여러 연결이 풀에 생성된다.