Rocky Linux 8.6에서 PostgreSQL 14, PostGIS 3.2.1 설치

# 전체 패키지 최신 버전으로 업데이트(옵션)

dnf upgrade --refresh -y

# Postgresql 14 설치

sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql14-server
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
(참조 : https://www.postgresql.org/download/linux/redhat)

# postgresql DBMS 접속

sudo -i -u postgres
psql

# PostGIS 3.2.1 설치

sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo dnf install dnf-plugins-core
sudo dnf config-manager --set-enabled powertools
sudo dnf -y install postgis32_14

[Rocky Linux] 최소 설치(Minimal Install) 시 네트워크 설정하기

아래의 명령을 통해 현재 네트워크 연결 여부를 확인할 수 있습니다.

nmcli device status

Disconnected 또는 Unavailable로 표시되는데, 전자는 선은 연결되어 있으나 활성화가 안되었다는 의미이고 후자는 선이 연결되어 있지 않다는 의미입니다.

아래의 명령을 통해 Network Manager를 실행합니다.

nmtui

[Edit a connection] 메뉴를 실행하고 Disconnected로 된 Ethernet을 선택하고 [Edit]를 실행합니다. 그러면 Edit Connection 창이 뜨는데 여기서 [Automatically connect]를 Checked 합니다.

이제 다음 명령을 실행해 Network Manager를 재실행합니다.

systemctl restart NetworkManager

이 글은 How to Setup Internet in CentOS, RHEL, Rocky Linux Minimal Install을 참조하였습니다.

Node.js 새로운 프로젝트 생성

npm init -y
npm i express
npm i --save-dev nodemon
npm run devStart

위의 devStart가 의미를 가지려면 package.json 파일의 “scripts”의 값을 다음처럼 변경해야 합니다.

"scripts": {
  "devStart": "nodemon server.js"
},

Node.js에서 Thread 사용

서버 개발 시에 Node.js를 사용할 때 스레드를 이용해 사용자의 요청을 동시에 처리할 수 있습니다.

먼저 서버에 대한 기본 코드입니다.

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

app.get("/", (req, res) => {
    let total = 0;
    for(let i=0; i<10000000000; i++) {
        total++;
    }

    res.status(200).json({total});
});

app.listen(3000);

웹브라우저에서 localhost:3000으로 접속하면 몇초간 응답이 없다가 결과가 표시됩니다. 이 몇초간의 무응답은 서버의 모든 것들이 이 하나의 클라이언트 요청을 처리하는데 전념한다는 점입니다. 이 몇초간 또 다른 클라이언트의 요청이 들어온다면... 서버는 응답은 커녕 듣지도(listen) 못합니다.

이 문제를 개선하기 위한 코드를 살펴보면.. 먼저 위의 코드를 다음처럼 변경합니다.

const express = require("express");
const app = express();
const { Worker } = require("worker_threads");

app.get("/", (req, res) => {
    const worker = new Worker("./worker.js");
    worker.on("message", (data) => {
        res.status(200).json({total: data});
    })
});

app.listen(3000);

worker_threads라는 모듈을 추가했고 클라이언트 요청에 대한 연산을 worker.js로 분리시켰습니다. worker.js가 바로 스레드가 수행하는 코드이고 완료되면 message라는 이벤트가 호출되어 그 결과가 전달됩니다. worker.js의 코드는 다음과 같습니다.

const { parentPort } = require("worker_threads");

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

parentPort.postMessage(total);

무거운 연산이 완료되면 parentPort.postMessage를 통해 결과를 전달합니다.