개발노트/Node.js

[NodeJS] MySQL 연결 ( Side Project - 스터디 사라져서 중단... )

Dahoon06 2021. 12. 3. 15:48
728x90
반응형

이전 포스팅에서 express 프로젝트 생성과 server 연결까지 진행했습니다.

 

이번에는 데이터베이스를 연결하는 작업을 진행하도록 하겠습니다.

 

작업을 하기전에 필요한 모듈이 있습니다.

npm i dotenv mysql2

dotenv는 사용자 정보를 담을 .env파일을 사용하기 위한 모듈입니다. 정보를 깃에 올리지 않기 위한 파일이니 다운받아주세요.

 

또한 mysql을 사용하지 않고 mysql2를 사용합니다.

mysql은 콜백 기반이기 때문에 promise를 사용하지 못하고 npm에 있는 promise-mysql 모듈을 따로 설치해서 사용해야 합니다. 하지만 mysql2promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능합니다.

* mysql을 사용하게 되면 async/await를 사용할 수 없습니다...

 

최상위 디렉토리 바로 하위에 db라는 디렉토리 안에 connectionPool을 사용할 db.connect.ts파일을 생성하였습니다.

 

 

MySQL ConnectionPool

db.connect.ts

import { createPool, Pool } from "mysql2/promise";
import dotenv from "dotenv";
dotenv.config();

export namespace DB {
    export const config = {
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        host: process.env.DB_HOST,
        port: Number(process.env.DB_PORT),
        database: process.env.DB_DATABASE,
        connectionLimit: 20,
    } as {
        user: string,
        password: string,
        host: string,
        port: number,
        database: string
    };

    export class MysqlConn {
        private static instance: MysqlConn;
        private db?: Pool;

        async connect() {
            try {
                if(this.db) return this.db;
                console.warn('DB CONNECT');

                this.db = await createPool(config);
                return await this.db?.getConnection();
            } catch (e) {
                throw new Error(e);
            }
        }

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


}

 

* mysql2 모듈을 가져올때 mysql2/promise로 가져와야합니다.

 

사용된 인스턴스가 없을 경우 새 인스턴스를 만들어서 반환하고 있을 경우에는 반환된 인스턴스를 다시 내보내줍니다.

싱글톤 패턴을 알고계시면 코드를 이해하는데 도움될것같습니다.

 

일단 20개의 connectionPool을 만들어서 준비해두었습니다.

 

연결은 이 db.connect.ts 파일 하나로 끝이 났습니다.

데이터베이스 연결이 필요하면 만들어둔 pool을 반환 받아서 사용하면 됩니다.

 

 

다음 포스팅에서 만들어둔 pool을 가지고 데이터베이스에서 값을 가져와보겠습니다.

 


728x90
반응형