Web/Node.js

[Node.js + PostgreSQL] Node.js에서 PostgreSQL 연동하기

poopooreum 2024. 10. 23. 12:07
반응형

안녕하세요!

최근 회사에서 PostgreSQL과 Node.js에서 프로젝트를 진행하게 되어서 오늘은 Node.js에서 PostgreSQL을 연동하는 방법과

PostgreSQL 설정 방법을 업로드 해보겠습니다.

 

 

✏️  AWS에서 PostgreSQL 데이터베이스 생성하기

 

만드는 방법은 그렇게 어렵지 않아서 간단하게 사진으로만 보여드리겠습니다

스토리지 자동 조절 활성화 끄기
퍼블릭 액세스 예로 바꿔주기(안해주면 따로 SSH 터널을 만들어줘야 하는데 그건 다음에 포스팅을 하겠습니다
PostgreSQL은 port번호가 5432입니다
아러고 생성을 해주시면 됩니다.

저는 이미 VPC보안 그룹이 설정되어 있어서 기존에 쓰던 거를 그대로 사용했는데, 안 되어 있으신 분들은 데이터베이스 생성 후 인바운드 규칙 편집에서 본인의 IP를 추가해주시면 됩니다


✏️  datagrip에 연결 + 테이블 생성하기

 

데이터베이스 서버를 구축했으니 이젠 데이터베이스를 수 있도록 연결을 하고 테이블을 생성해 볼 차례입니다.

아래 사진과 같이 클릭 후 하나씩 입력해 주시면 됩니다.

 

Host창에 위에서 만들었던 데이터베이스의 엔드포인트를 복사해서 그대로 복사붙여넣기를 하신 후

User와 Password에는 위에서 만들었던 유저 이름와 마스터 암호를 입력하신 후 TestConnection을 눌러서 확인해보시면 됩니다.

 

잘 입력하셨다면 아래 사진과 같은 초록불이 나옵니다

 

연결을 했으니 이젠 테이블을 만들어볼 차례입니다.

저는 아래 사진과 같이 만들었습니다.

create table "Member"
(
    name     varchar(20)                                          not null,
    password varchar(100)                                         not null,
    email    varchar(50)                                          not null,
    nickname varchar(30)                                          not null,
    id       varchar(20)                                          not null,
    idx      integer default nextval('"Member_id_seq"'::regclass) not null
        constraint member_pk
            primary key,
    salt     varchar                                              not null
);

alter table "Member"
    owner to dearmate;
    
    
-- auto-generated definition
create sequence "Member_id_seq";

alter sequence "Member_id_seq" owner to dearmate;

alter sequence "Member_id_seq" owned by "Member".idx;


✏️ node.js 설정해주기

 

코드를 작성하기에 앞서 필요한 의존성들을 node_modules에 추가를 해줘야 합니다

/* 맥 터미널 창*/
brew install postgresql

/* vsc 터미널 창*/
npm install // npm 설치하기
npm install express // express 설치하기
npm install pg // postgresql 드라이버 설치하기

 

저는 connection pool 방식을 이용해서 구현을 해보았습니다.

커넥션 풀에 대한 설명은 여기를 참고하시면 될 것 같아요

 

 

pgConnect.js

데이터베이스 연결을 위해 설정해주는 코드라고 생각하시면 될 것 같습니다.

host, port, user, password, database에 각각 위에서 만들었던 데이터베이스에 해당하는 값들을 입력해 주시면 됩니다.

그리고 나서 풀에서 연결을 가져오는 getConnection함수와 연결을 해제하는 closeConnection함수를 각각 만들었습니다.

추가로 각각의 함수들은 모두 async, await가 붙여진 비동기 처리 함수입니다

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

const pool = new Pool({
    host: '',
    port: '5432',
    user: '',
    password: '',
    database: '',
    ssl: {
        rejectUnauthorized: false, // AWS RDS의 기본 인증서 사용 시 필요
    },
    max: 20, // 최대 클라이언트 수
    idleTimeoutMillis: 30000, // 사용되지 않는 연결을 풀에서 제거하는 시간 (ms)
    connectionTimeoutMillis: 2000, // 연결을 생성하는 데 걸리는 최대 시간 (ms)
});

// 연결을 가져오기 위한 함수
const getConnection = async () => {
    try {
        const client = await pool.connect(); // 풀에서 연결을 가져옴
        console.log('Database connected successfully');
        return client;
    } catch (err) {
        console.error('Database connection error:', err.stack);
        throw err;
    }
};

// 연결을 반납하는 함수
const closeConnection = (client) => {
    try {
        client.release(); // 연결을 풀에 반납
        console.log('Database connection released back to pool');
    } catch (err) {
        console.error('Error releasing database connection:', err.stack);
    }
};

module.exports = {
    getConnection,
    closeConnection,
};

 

 

app.js

이렇게 설정을 해주시면 되고 express에 대한 설명은 아래와 같습니다

https://despiteallthat.tistory.com/139를 참고했습니다.

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const db = require('./config/pgConnect');

app.use(express.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.get('/', (req, res) => {
    return res.status(200).send('Server is running');
});

app.get('/member', async (req, res) => {
    let getSQL = 'select idx, name, password, email, nickname from "Member"';
    try {
        client = await db.getConnection();
        let result = await client.query(getSQL);
        console.log(result);
        return res.status(200).json({ result: 'ok', members: result.rows });
    } catch (err) {
        console.error(err);
        return res.status(500).json({ error: 'Database operation failed' });
    } finally {
        if (client) db.closeConnection(client); // 클라이언트를 한 번만 반환
    }
});

✏️ 결과(멤버 테이블 조회하기)

반응형