sungyup's.

PostgreSQL / Managing Database Design with Schema Migrations / 6.3 Accessing PostgreSQL FROM API's

6.3Accessing PostgreSQL FROM API's

API를 통해 Postgres 데이터 접근하기

이번 포스팅에선 Node API를 통해 Postgres를 쓰는 방법에 대해 알아보자.

우선, 새로 프로젝트를 위한 새로운 폴더를 만들고 필요한 dependency들을 설치하자.

bash
npm install dedent express jest node-pg-migrate nodemon pg pg-format supertest

package.json 파일의 스크립트를 아래와 같이 수정한다.

javascript
"scripts": { "migrate": "node-pg-migrate", "start": "nodemon index.js" }

이후, 마이그레이션 파일을 만든다. 혹시 지난번 포스팅까지 쓰던 socialnetwork 데이터베이스가 있다면, PGAdmin4에서 지우고 새로 만들자.

npm run migrate create add users table

javascript
exports.up = (pgm) => { pgm.sql(` CREATE TABLE users ( id SERIAL PRIMARY KEY, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, bio VARCHAR(400), username VARCHAR(30) NOT NULL ); `); }; exports.down = (pgm) => { pgm.sql(` DROP TABLE users; `); };

우리의 Node API는 아래와 같은 Route와 Method들로 구성되어 users 테이블의 데이터를 가져오거나 추가하고 수정한다.

RouteMethod기능
/usersGETusers 테이블의 모든 유저 가져오기
/users/:idGETid로 유저 가져오기
/usersPOST새 유저 만들기
/users/:idPUTid로 유저 업데이트하기
/users/:idDELETEid로 유저 지우기

앞서 만든 프로젝트 폴더에 src라는 폴더를 만들고 app.js 파일을 만든다.

javascript
const express = require('express'); module.exports = () => { const app = express(); app.use(express.json()); return app; }

이후, routes 폴더를 만들고 users.js를 만든다.

javascript
const express = require('express'); const router = express.Router(); router.get('/users', async (req, res) => {}); router.get('/users/:id', async (req, res) => {}); router.post('/users', async (req, res) => {}); router.put('/users/:id', async (req, res) => {}); router.delete('/users/:id', async (req, res) => {}); module.exports = router;

해당 usersRouter를 쓰기 위해 app.js를 수정한다.

javascript
const express = require("express"); const usersRouter = require("./routes/users"); module.exports = () => { const app = express(); app.use(express.json()); app.use(usersRouter); return app; };

Postgres Connection을 만들기 위해 PG 모듈 사용하기

src 폴더 안에 pool.js 파일을 작성한다. 참고로, 우리는 class 문법을 통해 pool을 만드는데 일반적인 방식은 아니다. 이 방식은 이후에 여러개의 데이터베이스에 연결하기 위해 취한 것이다.

javascript
const pg = require("pg"); class Pool { _pool = null; connect(options) { this._pool = new pg.Pool(options); // PG 모듈은 클라이언트가 있어야만 Postgres 연결을 시켜주므로 간단한 쿼리를 작성해서 연결시킨다. return this._pool.query("SELECT 1 + 1;"); } } module.exports = new Pool();

이후, index.js를 프로젝트 루트 폴더에 작성한다.

javascript
const app = require("./src/app"); const pool = require("./src/pool"); pool .connect({ host: "localhost", port: 5432, database: "socialnetwork", user: "sungyupju", password: "", }) .then(() => { app().listen(3005, () => { console.log("Server is running on port 3005"); }); });

이후 node index.js 명령어로 터미널에서 서버를 실행할 수 있다.

쿼리 넣기와 서버 닫기

쿼리를 쓰고, 서버를 닫는 것은 Pool 클래스에 메소드들을 추가함으로 가능해진다.

javascript
const pg = require("pg"); class Pool { _pool = null; connect(options) { this._pool = new pg.Pool(options); // PG 모듈은 클라이언트가 있어야만 Postgres 연결을 시켜주므로 간단한 쿼리를 작성해서 연결시킨다. return this._pool.query("SELECT 1 + 1;"); } close() { return this._pool.end(); } // 보안 문제 있음!!! query(sql) { return this._pool.query(sql); } } module.exports = new Pool();

다음 포스팅에서 본격적으로 이 api를 통해 Postgres로 접근해보자.