Node.js에서 fork를 사용해 독립적인 프로세스를 통한 연산

이전에 아래의 포스트를 통해 Node.js에서 스레드를 사용해 연산을 처리한 글을 올렸습니다.

Node.js에서 Thread 사용

이번에는 별도의 독립적인 프로세스를 통한 연산 수행해 그 결과를 얻는 코드에 대해 정리합니다. 위의 글과 동일한 기능을 구현하며 Thread 대신 Process를 이용한다는 차이점만 있습니다./p>

서버에 대한 코드는 다음과 같습니다.

const express = require("express");
const app = express();

const { fork } = require("child_process");

app.get("/", (req, res) => {
    const child = fork("./task.js");
    
    child.send("start");

    child.on("message", (sum) => {
        res.send({sum: sum});
    })
});

app.listen(3000);

외부 프로세스에서 수행할 연산에 대한 코드는 task.js 파일에 정의되는데.. 아래와 같습니다.

process.on("message", (message) => {
    if(message === "start") {
        let total = 0;

        for(let i=0; i<10000000000; i++) {
            total++;
        }
        
        process.send(total);
    }
})

Node.js에서 PostgreSQL 연결

이 글은 아래의 포스트 내용에 대해 DBMS를 이용해 재작성되었습니다.

Node.js의 GET, POST 처리

위 글에 대해서 클라언트의 코드는 모두 동일하고 서버의 코드만 변경되었습니다. 서버에 대한 전체 코드는 다음과 같습니다.

const express = require("express");
const app = express();

const { Client } = require("pg");

const dbClient = new Client({
    user: "postgres",
    host: "localhost",
    database: "postgres",
    password: "****",
    port: 5432
});

dbClient.connect();

app.get("/names", (req, res) => {
    dbClient.query("SELECT name FROM names", (error, result) => {
        if(error) {
            res.sendStatus(500);
        } else {
            res.status(200).json(result.rows);
        }
    });    
});

app.get("/alias", (req, res) => {
    const name = req.query.name;

    dbClient.query(`SELECT alias FROM names WHERE name = '${name}'`, (error, result) => {
        if(error) {
            res.sendStatus(500);
        } else {
            res.status(200).json(result.rows);
        }
    });
});

app.use(express.json());

app.post("/add", (req, res) => {
    const item = req.body;

    if(item.name && item.alias) {
        dbClient.query(`INSERT INTO names (name, alias) VALUES ('${item.name}', '${item.alias}');`, 
            (error, result) => {
                if(result) {
                    console.log(`Changed Row Count ${result.rowCount}`);
                    res.sendStatus(200);
                } else {
                    res.sendStatus(500);           
                }
            }
        );
    } else {
         res.sendStatus(400);
    }    
});

app.use(express.static(__dirname + "/static"));
app.listen(3000);

위의 코드에서 만약 DBMS에 대한 Connection Pool을 도입하고자 한다면 4~12번 코드를 다음처럼 변경하기만 하면 됩니다.

const { Pool } = require("pg");

const dbClient = new Pool({
    user: "postgres",
    host: "localhost",
    database: "postgres",
    password: "3224",
    port: 5432
});