본문 바로가기
경일/nodejs

[node.js] mysql2, connection pool, async, await 으로 사용

by dev_kong 2022. 2. 18.
728x90
728x90

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 만 배열 디스트럭처링 으로 뽑아온거다.

 

저것만 주의하면 딱-히 어려울것 없을듯? 

728x90
728x90

댓글