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들을 설치하자.
bashnpm 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
javascriptexports.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
테이블의 데이터를 가져오거나 추가하고 수정한다.
Route | Method | 기능 |
---|---|---|
/users | GET | users 테이블의 모든 유저 가져오기 |
/users/:id | GET | id로 유저 가져오기 |
/users | POST | 새 유저 만들기 |
/users/:id | PUT | id로 유저 업데이트하기 |
/users/:id | DELETE | id로 유저 지우기 |
앞서 만든 프로젝트 폴더에 src
라는 폴더를 만들고 app.js
파일을 만든다.
javascriptconst express = require('express'); module.exports = () => { const app = express(); app.use(express.json()); return app; }
이후, routes
폴더를 만들고 users.js
를 만든다.
javascriptconst 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
를 수정한다.
javascriptconst 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을 만드는데 일반적인 방식은 아니다. 이 방식은 이후에 여러개의 데이터베이스에 연결하기 위해 취한 것이다.
javascriptconst 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
를 프로젝트 루트 폴더에 작성한다.
javascriptconst 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
클래스에 메소드들을 추가함으로 가능해진다.
javascriptconst 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로 접근해보자.