패키지 설치

npm install --save mysql2
npm install --save-dev @types/node

 

모듈화

import mysql, {ConnectionOptions, ResultSetHeader, RowDataPacket} from "mysql2/promise";
import "../config/env";
import {DatabaseError} from "../middleware/errors/DatabaseError";

const access: ConnectionOptions = {
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    port: Number(process.env.DB_PORT || "3306"),
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0,
    connectTimeout: 10000, // MySQL 서버에 연결할 때의 타임아웃(ms 단위)
    enableKeepAlive: true // 연결이 일정 시간 동안 비활성 상태일 때에도 끊어지지 않도록
};

export const database = mysql.createPool(access);

export const selectList = async <T extends RowDataPacket>(statement: string): Promise<T[]> => {
    let connection;

    try {
        connection = await database.pool.promise().getConnection();
        const result = await connection.query<T[]>(statement);
        return result[0];
    } catch (e: unknown) {
        if (e instanceof Error) {
            throw new DatabaseError(e.message);
        }
        throw new Error("DB Unexpected Error");
    } finally {
        if (connection) {
            connection.release();
        }
    }
};

export const selectOne = async <T extends RowDataPacket>(statement: string): Promise<T> => {
    let connection;

    try {
        connection = await database.pool.promise().getConnection();
        const result = await connection.query<T[]>(statement)

        return result[0][0];
    } catch (e: unknown) {
        if (e instanceof Error) {
            throw new DatabaseError(e.message);
        }
        throw new Error("DB Unexpected Error");
    } finally {
        if (connection) {
            connection.release();
        }
    }
};

export const mutation = async (statement: string): Promise<ResultSetHeader> => {
    let connection;

    try {
        connection = await database.pool.promise().getConnection();
        const result = await connection.query<ResultSetHeader>(statement);
        return result[0];
    } catch (e: unknown) {
        if (e instanceof Error) {
            throw new DatabaseError(e.message);
        }
        throw new Error("DB Unexpected Error");
    } finally {
        if (connection) {
            connection.release();
        }
    }
}

 

사용 방법

import {mutation, selectList, selectOne} from "../../config/db";
import {ResultSetHeader} from "mysql2/promise";
import UserType from "../../types/UserType";

class UserModel {
	static async getAllUsers(): Promise<UserType[]> {
        const statement = `
          SELECT USER_ID
          FROM USER_TABLE
        `;

        return await selectList<UserType>(statement);
      }

      static async getUserById(USER_ID: string): Promise<UserType> {
        const statement = `
          SELECT USER_ID
          FROM USER_TABLE
          WHERE USER_ID = '${USER_ID}'
        `;

        return await selectOne<UserType>(statement);
      }

      static async createUser(user: UserType): Promise<ResultSetHeader> {
        const statement = `INSERT INTO ...`
        return await mutation(statement);
      }
  
      tatic async updateUser(user: UserType): Promise<ResultSetHeader> {
        const statement = `UPDATE ...`
        return await mutation(statement);
      }
      
      static async deleteUser(user: UserType): Promise<ResultSetHeader> {
        const statement = `DELETE ...`
        return await mutation(statement);
      }
  }

export default UserModel;

 

 


 

 

Using MySQL2 with TypeScript | Quickstart

Installation

sidorares.github.io

 

'JavaScript > TypeScript' 카테고리의 다른 글

[TS] Express 속성 타입 추가하기  (0) 2024.06.17

 

모듈 설치

npm i express
npm i @types/express

 

# src/middleware/guard.ts
import {NextFunction, Request, Response} from "express";

export default (req: Request, res: Response, next: NextFunction) => {
    try {
        ...
        
        req.session = {
            LOGIN_ID: decodeTokenJson.LOGIN_ID
        }
        next();
    } catch (e: unknown) {
        next(e);
    }
}

JWT 검증에 성공한다면,  Request 정보에 LOGIN_IN 속성을 추가하여 뒷 단에서 decode한 값들은 사용하려 한다

 

# src/types/express/index.d.ts
import * as express from "express"

declare global {
  namespace Express {
    interface Request {
      session: {
        LOGIN_ID: string;
      }
    }
  }
}

types/express/index.d.ts 파일을 생성하여, 원하는 속성 타입을 추가한다

 

# tsconfig.json
{
  "compilerOptions": {
    "target": "ES2020",          /* JavaScript 버전 */
    "module": "commonjs",        /* 모듈 시스템 */
    "outDir": "./dist",          /* 컴파일된 파일 출력 디렉토리 */
    "rootDir": "./src",          /* 소스 파일 디렉토리 */
    "strict": true,              /* 엄격한 타입 검사 */
    "esModuleInterop": true,     /* ES 모듈과의 상호 운용성 */
    "skipLibCheck": true,         /* 라이브러리 체크 건너뛰기 */
    "typeRoots": ["./src/types", "./node_modules/@types"]
  }
}

typeRoots 속성을 추가한다. 중요한 것은  node_modules/@types 의 값이 나중에 선언되어야 적용된다

'JavaScript > TypeScript' 카테고리의 다른 글

[TS] mysql2 패키지 모듈화  (0) 2024.06.17

+ Recent posts