개발노트/Node.js

[Node.JS] ConnectionPool

Dahoon06 2021. 11. 30. 14:18
728x90
반응형

기존에 사용했던 방법은 DB에 접근할 때마다 connection 객체를 생성하여 값을 조회하는 방식으로 진행하였다.

 

하지만 이렇게 되면 매번 새로운 객체가 생성됨으로 속도가 저하될 수도 있다.

 

그렇기 때문에 미리 connectionPool을 준비해줌으로써 새로 객체를 생성하지 않고 준비된 pool을 이용하여 DB에 접근할 수 있다.

 

사용된 코드는 아래와 같다.

 

db.ts
import { MongoClient } from "mongodb";

export namespace DB {
    //DB
    export const NAME: string = 'DATA';

    //COLLECTION
    export enum COLLECTIONS {
        ToDo = 'ToDo',
        Board = 'Board',
    }

    export class MongoConn {
        // private connection: string = process.env.NODE_ENV ? 'mongodb://localhost:27017/localDB' : 'mongodb://localhost:27017/localDB';
        private connection: string = process.env.NODE_ENV !== 'development' ? `mongodb+srv://${process.env.atlasID}:${process.env.atlasPW}@cluster.qjven.mongodb.net/myFirstDatabase?retryWrites=true&w=majority` : `mongodb+srv://${process.env.atlasID}:${process.env.atlasPW}@cluster.qjven.mongodb.net/test`;
        private static instance: MongoConn;
        private db ?: MongoClient;

        async connect(): Promise<MongoClient> {
            try {
                if(this.db && this.db.isConnected()) return this.db;
                this.db = new MongoClient(this.connection,{
                    useNewUrlParser: true,
                    useUnifiedTopology: true,
                });
                console.warn('DB CONNECTED');
                return await this.db.connect();
            } catch (e: any) {
                throw new Error(e);
            }
        }

        static get getInstance() {
            if(!MongoConn.instance) MongoConn.instance = new MongoConn();
            return MongoConn.instance;
        }
    }
}

인스턴스가 존재하지않다면 인스턴스를 새로 만들어서 반환해주고, 존재한다면 반환된 인스턴스를 다시 재사용하여 계속해서 새로 생성되는것을 방지 할 수 있다.

 

ConnectionPool을 꺼내서 사용할때는 getInstace로 접근하여 인스턴스를 가져온다.

export class TodoController {

    constructor() {
    }

    async getTodoList(){
        const client = await DB.MongoConn.getInstance.connect();
        const exists = await client.db(DB.NAME).collection(DB.COLLECTIONS.ToDo).aggregate([
            {$match: { deleteCheck: '1'}},
            {$group: {
                    _id: {
                        doing: {
                            $switch: {
                                branches: [
                                    { case: { $eq: ['$doing', '2']}, then: '진행중'},
                                    { case: { $eq: ['$doing', '3']}, then: '완료'},
                                ],
                                default: '해야할일'
                            }
                        },
                        todo_content: '$todo_content',
                        updatedAt: '$updatedAt',
                        obId: '$_id'
                    },
                }},
            {$sort: { '_id': -1 }},
        ]).toArray();
        if(exists){
            return {
                result: true,
                exists
            }
        }
        throw new Error('조회 실패');
    }

 

model역할을 할 파일을 만들어서 라우트쪽에서 불러와 사용하였다.

import {NextFunction, Request, Response, Router} from 'express';
import {TodoController} from "../../controller/TodoController";

const router = Router();
const tc = new TodoController();

router.get('/',async (req: Request, res: Response, next: NextFunction) => {
   try{
      const { result, exists } = await tc.getTodoList();
      if(result){
         return res.status(200).send(exists);
      }
   } catch (e: any) {
      throw new Error(e);
   }
})

 

 


728x90
반응형