현재 조명 쇼핑몰 만들기 토이 프로젝트를 진행하면서 서버를 띄워 두었었는데
많은 db요청으로 자꾸 서버가 뻗었었다...
이유를 찾아보니
기존에 npm mysql의 createConnection으로 connection을 계속 만들어 내니 과부하가 온것이다
그러다 Connection Pool을 알게 되었다.
Connection Pool은 내가 설정한 수의 커넥션을 pool에 저장하여 사용자의 요청이 발생하면 연결을 해주고
연결종료시 release()해주어 다시 connection에 저장해주는 것이다.
이렇게 하면 pool에서 생성한 connection으로 수행하기 때문에 만들어지는 connection이 적어지고 재사용 하면서
여러 요청이 동시에 발생해도 커넥션을 효율적으로 관리 할 수 있습니다.
또한 기존에는 npm mysql을 사용하였었는데 mysql2를 좀더 성능이 좋아보여서 mysql2로 옮기게 되었고 코드를 전부 수정하였습니다. ㅠ
mysql2는 promise를 지원해주어서 코드를 좀더 간결하게 정리 할 수 있다는 장점이 있었습니다.
또한 알아서 query요청후 release를 해주기 때문에 꽤나 코드도 간결해집니다.
결과적으로
기존에는
const maria = require('mysql');
const conn = maria.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PSWORD,
database: process.env.DB_DATABASE,
})
module.exports = conn;
로 createConnection을 선언하고
//maria database require
const maria = require('../database/connect/maria');
static save(register){
return new Promise((resolve, reject) => {
const query = "INSERT INTO USER_TB(USER_ID, USER_PW, USER_NM, PROFILE_TYPE, PROFILE_DATA) VALUES(?, ?, ?, ?, ?);";
maria.query(query, [register.id, register.psword, register.name, register.img_type, register.img_data]
, (err) => {
if(err) reject(`${err}`);
resolve({
success : true
});
});
});
}
다음과 같이 Promise객체를 만들어서 처리를 했었습니다.
하지만 mysql2를 사용하였고 그중 promise를 사용하면서
const maria = require('mysql2/promise');
const conn = maria.createPool({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PSWORD,
database: process.env.DB_DATABASE,
connectionLimit: 20,
})
module.exports = conn;
여기서 connectionLimit 은 pool에 넣어둘 connection의 최대 갯수입니다.
기본 10개로 설정되며
.env로 관리하는게 좋습니다. ;;(편의상 그냥 설정함)
쿼리 수행은 기본적으로
async function queryExe(query, params = []){
let conn;
try {
conn = await maria.getConnection();
return [rows, fields] = await conn.query(query, params);
} catch (error) {
throw error;
} finally {
if (conn) {
conn.release();
}
}
}
이런식으로 작동하고 편하게 쓸려고 함수화 하였습니다.
try문에서 getconnection을 수행하여 pool에 연결한뒤 쿼리를 수행합니다.
rows, fields 속성이 있는데
rows는 쿼리 수행뒤 각행의 데이터들이 배열로 들어가게 되고
fields는 컬럼들의 이름과 타입이 들어갑니다.
수행한뒤 connection을 release()하여 다시 pool에 넣어줍니다.
이함수를 이용하여
static async save(register){
const query = "INSERT INTO USER_TB(USER_ID, USER_PW, USER_NM, PROFILE_TYPE, PROFILE_DATA) VALUES(?, ?, ?, ?, ?);";
try{
await queryExe(query, [register.id, register.psword, register.name, register.img_type, register.img_data]);
return { success : true } ;
}
catch(error){
throw error;
}
}
이렇게 간단하게 코드가 정리되니 정말 마음이 편합니다.
pool을 사용하면 트랜잭션도 쉽게 구현할 수 있는데
다음 장에서 다루겠습니다.
'Node.js' 카테고리의 다른 글
디스코드 봇 만들기 - 사용자가 음성 채널에 들어갔을때 (0) | 2024.11.14 |
---|---|
Node.JS base64로 인코딩한 이미지 incorrect 오류 (0) | 2023.11.07 |
Node js cookie 설정시 option sameSite is invalid 오류 (0) | 2023.10.24 |
Promise { <pending> } 이 뜬다. (0) | 2023.10.10 |
JWT(json web token)으로 로그인시 토큰 발행 해주기(access, refresh) (0) | 2023.09.24 |