db에 연결하는 부분을 매번 코드로 다 작성해줄 수 없으니 기본적으로 연결해주는 부분과 비동기처리해주는 부분을 나눠서 모듈화해야 했다.
mysql2/promise 라이브러리를 사용하였고 createConnection보다 더 효율적이라는 createPool 메서드를 사용하여 연결을 해주었다. 연결이 끊기는 문제가 있을 수 있어 이 부분은 구글링을 통해 enableKeepAlive: true 옵션을 주었다.
연결해주는 부분은 다음과 같다.
import mysql from "mysql2/promise";
import dotenv from "dotenv";
dotenv.config();
export const pool = mysql.createPool({
host: process.env.AWS_DB_HOST,
user: process.env.AWS_DB_USER,
password: process.env.AWS_DB_PASSWORD,
port: process.env.AWS_DB_PORT,
database: "kurylyDB",
connectionLimit: 30,
enableKeepAlive: true,
});
비동기 처리 문법 복기를 위해 적어두기! (비동기처리 메서드는 promise 객체를 반환해야 await가 제대로 작동한다.)
async function 함수명() {
await 비동기처리_메서드명();
}
그리고 꼬박 10시간 정도를 머리 싸매고 고민했던 부분이다. 이렇게 db.js에서 실행하면 잘되는 코드가 export만 하면 난리가 나는 것이다. query문의 결과 rows 변수를 리턴해도 promise객체라서 갖다 쓰려면 복잡했다.
const getOrderItemQuery = async () => {
try {
const connection = await pool.getConnection(async (conn) => conn);
try {
let [rows] = await connection.query("SELECT * FROM `order`");
connection.release();
console.log(rows);
return rows;
} catch (err) {
console.log("Query Error", err);
connection.release();
return false;
}
} catch (err) {
console.log("DB error");
return false;
}
};
위 코드 적고 실행해봤을 때 무사히 db에서 값이 콘솔에는 찍히는데 이제 저 함수를 export 해서 컨트롤러에서 가져다 쓰면 난리법석이 나는 것이다. 그래서 계속 방법을 찾아봤더니 connect된 promise 객체를 callback 함수로 넘겨줘서 사용해야 한다고 한다.
원래는 getConnection함수를 await해주기만 했는데 해당 요소를 변수에 넣어서 그 변수 자체를 콜백함수에 넘겨주니까 제대로 db에 쿼리문을 쏠 수 있게 되었다ㅠㅠ
export async function getConnectionPool(callback) {
const connection = await pool.getConnection(async (err, conn) => {
if (!err) {
return conn;
} else {
console.log("db connection err", err);
throw err;
}
});
console.log("✅ Connected to DB 🎉");
callback(connection);
}
실제로 사용해본 컨트롤러 코드를 하나 가져오면 다음과 같다. order 데이터 베이스에 들어있는 모든 컬럼을 다 건네줘야한다.
import { getConnectionPool } from "../db";
export const getOrderItems = (req, res) => {
getConnectionPool(async (connection) => {
try {
let [rows] = await connection.query("SELECT * FROM `order`");
connection.release();
return res.send(rows);
} catch (err) {
console.log("Query Error", err);
connection.release();
return res.send(err);
}
});
};
catch(err) 했을 때 는 어떻게 해야할지 고민이다 사실.