Home mysql 모듈들
Post
X

mysql 모듈들

mysql 관련 모듈들에 대해 알아보자.


테이블 생성

로그인, 로그아웃, 회원가입 기능을 구현하기 위해 users 테이블을 생성합니다.

users-table


mysql2 모듈

mysql2 모듈은 node.js가 mysql의 클라이언트로 작동해 mysql 서버에 접속해서 쿼리 작업을 수행할 수 있게 해주는 모듈입니다.

  • 설치
    1
    
    npm i mysql2
    

createConnection 메서드

모듈을 불러오고 createConnection 메서드의 인자로 전달되는 객체에 데이터베이스의 정보를 입력합니다.

query() 메서드를 사용해 데이터베이스에 원하는 작업을 할 수 있습니다.

query 메서드는 query([SQL문], [SQL문 실행한 결과를 받는 콜백 함수]) 형태로 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import mysql from "mysql2";

import dotenv from "dotenv";
dotenv.config();

let conn = mysql.createConnection({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  port: process.env.DB_PORT,
});

conn.query("SELECT * FROM users", (err, results, fields) => {
  if (err) console.log(err);

  console.log(results);
});

conn.end();

코드를 실행하면 객체로 데이터를 받습니다.

mysql-createconnection


커넥션 풀 (Connection Pool)

Query를 보낼 때마다 Connection을 하는 방식인 createConnection 메서드는 여러 클라이언트에서 동시 요청이 많아져 수용범위를 벗어나면 에러가 발생하는 문제가 발생했습니다.

쿼리문을 보낼 때마다 Connection을 생성하는 것이 비효율적이기 때문에 등장한 방식이 Connection Pool방식입니다.

  • 기존 방식 db-connection-01

  • Connection Pool 방식 db-connection-02

Connection Pool은 하나의 Pool을 생성한 뒤 지정한 수 만큼 Connection을 미리 할당합니다.

Client에서 DB에 데이터를 가져오기위한 Connection을 Pool에서 가져와 사용한 뒤 다시 Pool에 Connection을 반환합니다.

이러한 방식은 동시 요청 수가 많아져도 에러를 발생시키지 않고 Pool에 남아있는 Connection이 없다면 대기상태가 되고 다른 클라이언트에서 Connection이 반환되면 대기상태가 풀리게 됩니다.

다만 연결 갯수에 따라 메모리를 과하게 차지하거나, 사용자의 대기시간이 증가할 수 있으므로 사용자 추이를 잘 파악하여 연결 제한 갯수를 설정하는 것이 중요합니다.


createPool 메서드

기존 방식과 같이 모듈을 불러오고 createPool 메서드의 인자로 전달되는 객체에 데이터베이스의 정보를 입력합니다.

getConnection 메서드로 커넥션을 받아 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import mysql from "mysql2";

import dotenv from "dotenv";
dotenv.config();

let pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  port: process.env.DB_PORT,
  connectionLimit: process.env.DB_CONN_LIMIT,
});

pool.getConnection(function (err, conn) {
  if (err) console.log(err);

  conn.query("SELECT * FROM users", (err, results) => {
    if (err) console.log(err);

    console.log(results);
  });

  conn.release();
});

mysql2/promise 모듈

Node.js에서 Mysql을 연결할 때 기본적으로 mysql, mysql2 가 있습니다.

mysql 모듈은 콜백 함수 기반으로 promise를 사용하지 못합니다.

따라서, promise를 사용하기 위해서 mysql2 모듈을 사용해보겠습니다.

  • async / await 사용 시 장점
    • 간결하고 깔끔한 코드 (콜백 지옥 X)
    • 간편하게 트랜잭션 처리
    • 간편하게 에러 처리
    • SQL문 순차적 처리 보장

createConnection 메서드 (+ Promise)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import mysql from "mysql2/promise";

import dotenv from "dotenv";
dotenv.config();

let conn = await mysql.createConnection({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  port: process.env.DB_PORT,
});

const [rows] = await conn.query("SELECT * FROM users");

console.log(rows);

conn.end();

createPool 메서드 (+ Promise)

간단 트랜잭션 처리와 에러 처리를 추가했습니다.

비동기식으로 작성시 catch문으로 에러 처리가 가능하며 트랜잭션 로직을 쉽게 처리할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import mysql from "mysql2/promise";

import dotenv from "dotenv";
dotenv.config();

let pool = await mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  port: process.env.DB_PORT,
  connectionLimit: process.env.DB_CONN_LIMIT,
});

const conn = await pool.getConnection(async (conn) => conn);

try {
  await conn.beginTransaction();

  const [rows] = await conn.query("SELECT * FROM users");

  await conn.commit();

  console.log(rows);
} catch (err) {
  await conn.rollback();

  console.log(err);
} finally {
  conn.release();
}

참조

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.