[node.js] mysql2, connection pool, async, await 으로 사용
0. 목차
1. 개요
2. 일단 한번 써보기
3. mysql2 async, await 깔끔 ^^
4. db.js 파일 분리
1. 개요
[mysql] connecting pool (feat.node.js)
0. 목차 1. 개요 2. connecting pool 쓰는 이유 3. node.js connecting pool 생성 1. 개요 https://kong-dev.tistory.com/125?category=998366 [nodejs] node에서 mySQL 연결(Error: connect ECONNREFUSED ::1:330..
kong-dev.tistory.com
이어지는 글이다.
수업에서 connecting pool 을 사용하면 코드가 더러워진다고 했다.
그런가..
그렇기때문에 코드를 조금이라도 깔끔하게 쓸 수 있는 방법을 찾아오는게 오늘의 과제
더러우면 얼마나 더럽길래..
일단 한번 써보자
2. 일단 한번 써보기
음 뭐 그냥로컬호스트:3000 접속했을때,
데이터 베이스에 있는 내용을 res.send 로 화면에 랜더링 해주는 아주 간단한 코드를 작성해보겠다.
이 정도로 간단하면 사실 더러운지 안더러운지 확인도 힘들것 같은데..
일단 해보자.
요 데이터가 화면에 출력되게끔 만들어 볼거다.
app.get('/', (req, res) => {
pool.getConnection((error, connection) => {
if (error) throw error;
const sql = 'SELECT * FROM board';
connection.query(sql, (error, rows) => {
if (error) throw error;
res.send(rows);
connection.release();
});
});
});
..?
이상하다 정말 간단한 코드를
정말 간단하게 짰는데도 불구하고 이미 코드의 depth가 심상치 않다
왼쪽 어딘가에서 아도겐이라도 날라오는거 같다.
뭘 원했던 건지는 잘 모르겠지만
난 저 콜백 꼴보기 싫다...
그러나 안타깝게도 mysql 은 프로미스 객체를 리턴하지 않는다.
이런 경우에는 직접 프로미스 인스턴스 객체를 리턴하는 걸 만들어서...
https://kong-dev.tistory.com/128?category=998366
[nodejs] todoApp async await 으로 조지기
0. 목차 1. 개요 2. 프로미스 인스턴스 객체를 리턴하는 함수 만들기 3. 적용 4. 후기 1. 개요 https://kong-dev.tistory.com/127 [nodejs] todoApp 만들기 feat. mySQL 0. 목차 1. 개요 2. 기본세팅 3. CRUD 4...
kong-dev.tistory.com
이미 해봤구나.
3. mysql2 async, await 깔끔 ^^
이번엔 다르게 조져보자.
mysql2 ^^ 프로미스 가능 ^^
app.get('/', async (req, res) => {
try {
const connection = await pool.getConnection();
const sql = 'SELECT * FROM board';
const [rows] = await connection.query(sql);
res.send(rows);
connection.release();
} catch (err) {
console.log(err);
}
});
편-안
흠..
app.get('/', async (req, res) => {
try {
const connection = await pool.getConnection();
const sql = 'SELECT * FROM board';
const [rows] = await connection.query(sql);
res.send(rows);
} catch (err) {
console.log(err);
} finally{
connection.release();
}
});
이게 더 맞는거 같기도하고..
4. db.js 파일 분리
이건 예전에 혼자 db연결해서 이것저것 연습해보면서 느낀건데,
어차피 MVC 패턴으로 파일들 쪼갤꺼면,
db파일을 미리 따로 빼주는게 좋다.
그렇게 해주면 server.js 파일도 좀 더 깰끔해지겠지.
require('dotenv').config();
const mysql = require('mysql2/promise');
const host = process.env.DB_HOST;
const user = process.env.DB_USER;
const password = process.env.DB_PW;
const database = process.env.DB_DATABASE;
const pool = mysql.createPool({
host,
user,
password,
database,
connectionLimit: 5,
});
module.exports = pool;
db.js
db.js 경로
const express = require('express');
const pool = require('./model/db/db.js');
const app = express();
app.get('/', async (req, res) => {
try {
const connection = await pool.getConnection();
const sql = 'SELECT * FROM board';
const [rows] = await connection.query(sql);
res.send(rows);
connection.release();
} catch (err) {
console.log(err);
}
});
app.listen(3000);
server.js
뭐 대충 이런식으로 하면 되지 않을까...
아아 매우 중요한 부분이 하나 있다.
const [rows] = await connection.query(sql);
이 부분.
mysql2 query문의 결과물은
rows 와 fileds 가 배열 안에 담겨있는 형태로 되어있다.
[rows, fileds] 이런식으로 돼 있다는 거임
그런데 여기서 우리가 필요한 부분은 rows 뿐이니까.
rows 만 배열 디스트럭처링 으로 뽑아온거다.
저것만 주의하면 딱-히 어려울것 없을듯?