Day 22 - MySQL 모듈, 연결 메서드, DB 설정

이유승·2024년 12월 2일
0

* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.

* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.

1. MySQL 모듈

mysql? mysql2?

  • mysql - MySQL 데이터베이스와 통신하기 위해 처음 개발된, 오래된 패키지.

  • mysql2 - mysql 패키지를 기반으로 성능 개선 및 새로운 기능을 추가하여 만들어진 라이브러리.

  • 미리 결론을 말하자면, mysql2를 사용하는게 좋다.



mysql 모듈의 특징

  • 비동기 작업을 처리하기 위해 콜백(callback)을 사용.

  • 최신 MySQL 기능이나 고급 옵션(예: Promise 기반 API, prepared statements의 성능 향상 등)을 완벽히 지원하지 못함.

  • 성능이 mysql2보다 낮을 수 있다.



mysql2 모듈의 특징

  • mysql2/promise 모듈을 통해 Promise와 async/await를 사용가능.

  • 내부적으로 더 빠른 쿼리 처리를 위해 개선된 로직을 사용.

  • 최신 MySQL 기능을 더 잘 지원하며, 계속 업데이트 중.

  • MySQL의 이진 프로토콜을 활용하여 prepared statements의 성능을 최적화.

  • mysql 패키지의 API를 대부분 지원하므로, 기존 코드를 쉽게 마이그레이션할 수 있다.



mysql2를 사용하지 않을 이유가 없다!



createPool? createConnection?

  • 두 메서드 모두 MySQL 데이터베이스와 Node.js 애플리케이션을 연결하기 위해 사용하는 방법.

  • 결론을 미리 말하자면, 테스트 환경에서 간단히 쿼리를 실행해보고 싶은 경우에는 createConnection을,

  • 본격적인 프로젝트를 진행하고 싶다면 createPool을 사용하는 것이 좋다.



📝 비교

특성createConnectioncreatePool
연결 방식단일 연결연결 풀 관리 (다수의 연결 재사용)
성능동시 요청이 많으면 병목 현상 발생고성능 애플리케이션에 적합
연결 해제 관리수동으로 관리 (connection.end())자동으로 반환
사용 사례간단한 스크립트, 테스트 환경실무 환경, 요청이 많은 서버



createPool

  • 데이터베이스 연결 풀(connection pool)을 생성합니다.

특징

  • 연결 풀이란, 여러 클라이언트 요청을 처리하기 위해 다수의 연결을 미리 생성해 관리하는 기법.
  • 풀(pool) 내의 연결은 자동으로 관리되며, 요청이 끝난 후 자동으로 반환.
  • 서버가 실행되는 동안 여러 요청이 동시에 들어오더라도 성능이 유지.

장점

  • 요청이 많아도 안정적으로 처리 가능(재사용 가능한 연결).
  • 연결 생성 및 해제를 자동으로 관리.
  • 고성능 애플리케이션에 적합.

단점

  • 설정이 약간 복잡하고 단일 작업에는 불필요한 오버헤드가 있을 수 있음.

사용 예

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

const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0,
});

// 쿼리 실행
async function getUsers() {
    const [rows] = await pool.execute('SELECT * FROM users');
    console.log(rows);
}

getUsers();



createConnection

설명:

  • 데이터베이스와 단일 연결(single connection)을 생성.

특징:

  • 한 번 연결을 생성하면 그 연결은 명시적으로 종료(connection.end() 호출)하거나 서버가 다운되기 전까지 유지.
  • 연결이 끊기면(예: 서버 종료, 네트워크 문제) 재연결을 수동으로 처리해야한다.
  • 간단한 애플리케이션에서 적합.

장점:

  • 설정이 간단하고, 단일 작업이나 테스트용으로 적합.

단점:

  • 다수의 클라이언트 요청이 있는 경우 병목 현상이 발생할 수 있다(연결을 공유하지 않음).
  • 연결 해제를 수동으로 처리해야 함.

사용 예:

const mysql = require('mysql2');

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test',
});

connection.connect(err => {
    if (err) {
        console.error('Error connecting: ' + err.stack);
        return;
    }
    console.log('Connected as id ' + connection.threadId);
});

// 쿼리 실행
connection.query('SELECT * FROM users', (error, results) => {
    if (error) throw error;
    console.log(results);
});

// 연결 해제
connection.end();

2. DB 설정

const mysql = require('mysql2/promise'); // mysql2 모듈 (Promise 기반)
require('dotenv').config(); // .env 파일에서 환경 변수를 로드

// 데이터베이스 연결 풀(pool) 생성
const db = mysql.createPool({
    host: process.env.DB_HOST, // 데이터베이스 호스트 (예: localhost)
    user: process.env.DB_USER, // 데이터베이스 사용자명
    password: process.env.DB_PASSWORD, // 데이터베이스 비밀번호
    database: process.env.DB_NAME, // 데이터베이스 이름
    port: process.env.DB_PORT || 3306, // 데이터베이스 포트 (기본값: 3306)
    waitForConnections: true, // 연결 대기 여부 (연결 풀이 가득 찬 경우)
    connectionLimit: 10, // 최대 연결 수
    queueLimit: 0, // 대기열 제한 (0이면 제한 없음)
    timezone: 'Z' // 시간대 (UTC)
});

// 모듈 내보내기
module.exports = db;
  • Node.js 애플리케이션에서 데이터베이스와의 연결 설정을 관리하는 파일.

  • 데이터베이스 연결 정보를 중앙화하여 관리하고, 보안성과 유지보수성을 높이기 위해 사용한다.



process.env?

  • 환경 변수.

  • DB 접속 정보(예: 비밀번호, 호스트 주소 등)를 코드에 직접 포함하지 않고, .env 파일에 저장해 관리하는 방식.

npm i dotenv

  • env 형식의 환경변수 파일을 사용할 수 있도록 해주는 모듈.
DB_HOST=127.0.0.1
DB_USER=root
DB_PASSWORD=mysecretpassword
DB_NAME=mydatabase
DB_PORT=3306
  • 환경변수 파일에 작성한 내용은 process.env 키워드를 통해 다른 파일에서 가져다가 사용할 수 있다.

  • 환경변수 파일은 보안에 민감한 데이터를 저장하는 곳으로, .gitignore를 통해 Github 저장소에 업로드되지 않도록 방지해주어야 한다.



timezone?

  • MySQL과 Node.js 애플리케이션 간의 시간 데이터를 주고받을 때, 서버와 데이터베이스 간의 시간대 차이를 조정하기 위해 사용.

  • MySQL에서 날짜 및 시간 관련 필드(예: DATETIME, TIMESTAMP)를 사용할 때, 데이터가 저장되거나 읽혀지는 시간대에 영향을 줄 수 있으므로 적절한 시간대를 설정해주어야 한다.
    - 애플리케이션 서버가 실행되는 지역과 MySQL 서버가 설정된 시간대가 다를 경우, 시간 데이터가 왜곡될 수 있다.
    - 애플리케이션이 Asia/Seoul 시간대를 사용하는데 MySQL 서버가 UTC 시간대를 사용하면, 저장된 시간과 조회된 시간이 다를 수 있는 것.

TIMESTAMP vs DATETIME

  • TIMESTAMP: 자동으로 UTC로 저장, 클라이언트의 시간대로 변환.
  • DATETIME: MySQL에 저장된 그대로 표시, 시간대 변환이 이루어지지 않음.

timezone 설정 방법

  • 위 예제 코드처럼 createPool이나 createConnection에서 timezone 옵션을 설정.
    - 'Z': UTC 시간 (기본값).
    - '+HH:MM': 특정 시간대를 설정 (예: '+09:00'은 한국 표준시 KST).
    - 'local': 서버의 로컬 시간대 사용.

  • 혹은 MySQL 서버의 시간대 설정

    - MySQL 서버의 기본 시간대를 확인하려면 다음 쿼리를 실행

    SELECT @@global.time_zone, @@session.time_zone

    - 시간대 설정이 필요하다면 아래처럼 설정

    SET GLOBAL time_zone = '+09:00'; -- 한국 표준시

profile
프론트엔드 개발자를 준비하고 있습니다.

0개의 댓글