기존에 사용하던 mysql은 콜백 기반이기 때문에 promise를 사용하지 못하고 promise-mysql 모듈을 따로 설치해서 사용해야한다
하지만, mysql2는 promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능하다
기존에 사용했던 connection을 재사용하여 새로운 connection을 구축할 때 생기는 오버헤드를 모두 피해 쿼리 지연시간을 향상시키기 위해 createPool 을 사용한다
pool 은 쿼리가 수행되면 connection은 자동 해제된다
// mysql/config.ts
import { createPool } from "mysql2/promise";
export default () => {
const connection = createPool({
host: process.env.MYSQL_HOST,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_ROOT_PASSWORD,
database: process.env.MYSQL_DATABASE,
connectionLimit: 30
});
return connection;
}
// index.ts
import express, { ErrorRequestHandler, NextFunction, Request, Response } from "express";
import dotenv from "dotenv";
import { FieldPacket, RowDataPacket } from "mysql2/promise";
import pool from "./mysql/config";
dotenv.config();
const app: express.Application = express();
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
const SELECTALL = "select * from TEST";
interface InfoModel extends RowDataPacket {
Date: string
Sabun: string
Entered: string
Exited: string
}
app.get("/", async (req: Request, res: Response, next: NextFunction) => {
try {
const conn = pool();
const [results]: [InfoModel[], FieldPacket[]] = await conn.query<InfoModel[]>(SELECTALL);
results.map(r => {
console.log(r.Date, r.Sabun, r.Entered, r.Exited); // interface가 적용 됐는지 확인하는 용도
});
res.json({ results });
} catch (error) {
next(Error)
}
});
app.use(((err, req, res, next) => {
console.log(err)
}) as ErrorRequestHandler);
app.listen(process.env.NODE_PORT, () => console.log("Running typescript server"));

