** 상황가정 **
- 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)를 호출하면 설정에 따라서 데이터베이스에 연결을 시도하며, 이 때 여러 연결이 풀에 생성된다.