Node.js에서 MySql연결하는 과정을 기록합니다.

참고자료

MySql 설치 및 실행

1.1 설치

https://dev.mysql.com/downloads/installer/

위 링크에 들어가서 두번째 파일을 다운로드 합니다. 설치할 때는 비밀번호 입력을 제외하고 나머지는 다 next 눌러도 상관없습니다. 설치가 완료되면 자동으로 MySql이 실행됩니다.

이 글은 MySQL server를 기준으로 작성되었습니다.

1.2 비밀번호 입력

일단 설치가 완료되면 MySQL 8.0 Command Line Client와 같은 이름의 프로그램이 생깁니다. 이 프로그램을 실행하여 MySQL을 제어할 수 있습니다. 프로그램을 실행시켜서 아까 만들었던 비밀번호를 입력합니다.

1.3 데이터베이스 조회

데이터베이스는 SHOW DATABASES 명령어로 조회합니다. 처음에는 information_schema, mysql, performance_schema, sys가 기본으로 생성되어 있습니다.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

1.4 데이터베이스 생성

데이터베이스는 CREATE DATABASE 명령어로 생성합니다.

CREATE DATABASE 데이터베이스_이름;

다시 SHOW DATABASES를 입력하면 새로 만든 데이터베이스가 보입니다.

Node.js mysql2 설치 및 연결

npm에는 mysql과 mysql2가 있습니다. 보통 다음과 같은 이유로 mysql2를 더 추천합니다.

2.1 mysql2 설치

npm install --save mysql2
# --save는 npm5부터 디폴트로 생략가능합니다.

2.2 MySQL에 연결

지금까지 잘 따라왔다면 아래 코드가 성공적으로 실행됩니다.

const mysql = require('mysql2/promise');

const connectionConfig = {
  host: 'localhost', // 
  user: 'your_username', // MySQL 사용자 이름(그냥 root 하면됨)
  password: 'your_password', // MySQL 비밀번호
  database: 'your_database', // 아까 만든 데이터베이스 이름
  port: 3306, // MySQL 포트(기본으로 3306)
};

(async () => {
  try {
    const connection = await mysql.createConnection(connectionConfig);
    console.log('MySQL에 성공적으로 연결되었습니다!');
    await connection.end();
  } catch (err) {
    console.error('MySQL 연결 실패:', err);
  }
})();

2.3 테이블 생성

이제 데이터베이스에 테이블들을 생성합니다.

const mysql = require('mysql2/promise');

(async () => {
  const connection = await mysql.createConnection({
    host: 'localhost', // 
    user: 'your_username', // MySQL 사용자 이름(그냥 root 하면됨)
    password: 'your_password', // MySQL 비밀번호
    database: 'your_database', // 아까 만든 데이터베이스 이름
    port: 3306, // MySQL 포트(기본으로 3306)
  });

  // 테이블 생성
  const [results, fields] = await connection.query(`
    CREATE TABLE IF NOT EXISTS users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(255) NOT NULL,
      password VARCHAR(255) NOT NULL
    );
  `);
  console.log(results, fields);

  // 테이블들 조회
  const [results2, fields2] = await connection.query(`SHOW TABLES`);
  console.log(results2, fields2);

  // 작업 끝나면 연결 끊기   
  connection.end();
})();

커넥션 풀 사용하기

데이터베이스 작업을 할 때마다 커넥션을 만드는 것은 비효율적입니다. 커넥션 풀을 만들면 미리 일정 개수의 커넥션을 만들어 놓고 필요할 때 가져다가 쓸 수 있습니다.

const mysql = require('mysql2/promise');

const pool = mysql.createPool({
    host: 'localhost',          // 호스트 주소
    user: 'root',      // MySQL 사용자 이름
    password: 'your_password',  // MySQL 비밀번호
    database: 'your_database',  // 데이터베이스 이름
    port: 3306,                 // MySQL 포트(기본으로 3306)
    connectionLimit: 10         // 최대 커넥션 수

    //그외 다른 옵션: 기본값
    //waitForConnections: true, // 풀의 모든 커넥션을 사용중일 때 요청을 대기열에 넣을지
    //maxIdle: 10,              // idle 상태인 최대 커넥션 수
    //idleTimeout: 60000,       // 이 시간 동안 idle인 커넥션은 해제됨(기본 60초)
    //queueLimit: 0,            // 대기열 길이(0은 제한이 없음을 의미)
    //enableKeepAlive: true,    // TCP Keep-Alive 활성화 여부
    //keepAliveInitialDelay: 0, // TCP Keep-Alive 패킷을 보내기 전까지 초기 지연 시간
});

// 풀 사용하기
// 풀을 사용하고 연결을 끊지 않아도 됩니다.
pool.query(`SELECT * FROM users;`);

query vs execute

connection 또는 pool은 queryexecute를 실행할 수 있습니다.

이 둘의 차이점은 execute는 prepared statement를 사용한다는 점입니다.