* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.
* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.
mysql - MySQL 데이터베이스와 통신하기 위해 처음 개발된, 오래된 패키지.
mysql2 - mysql 패키지를 기반으로 성능 개선 및 새로운 기능을 추가하여 만들어진 라이브러리.
미리 결론을 말하자면, mysql2를 사용하는게 좋다.
비동기 작업을 처리하기 위해 콜백(callback)을 사용.
최신 MySQL 기능이나 고급 옵션(예: Promise 기반 API, prepared statements의 성능 향상 등)을 완벽히 지원하지 못함.
성능이 mysql2보다 낮을 수 있다.
mysql2/promise 모듈을 통해 Promise와 async/await를 사용가능.
내부적으로 더 빠른 쿼리 처리를 위해 개선된 로직을 사용.
최신 MySQL 기능을 더 잘 지원하며, 계속 업데이트 중.
MySQL의 이진 프로토콜을 활용하여 prepared statements의 성능을 최적화.
mysql 패키지의 API를 대부분 지원하므로, 기존 코드를 쉽게 마이그레이션할 수 있다.
mysql2를 사용하지 않을 이유가 없다!
두 메서드 모두 MySQL 데이터베이스와 Node.js 애플리케이션을 연결하기 위해 사용하는 방법.
결론을 미리 말하자면, 테스트 환경에서 간단히 쿼리를 실행해보고 싶은 경우에는 createConnection을,
본격적인 프로젝트를 진행하고 싶다면 createPool을 사용하는 것이 좋다.
특성 | createConnection | createPool |
---|---|---|
연결 방식 | 단일 연결 | 연결 풀 관리 (다수의 연결 재사용) |
성능 | 동시 요청이 많으면 병목 현상 발생 | 고성능 애플리케이션에 적합 |
연결 해제 관리 | 수동으로 관리 (connection.end() ) | 자동으로 반환 |
사용 사례 | 간단한 스크립트, 테스트 환경 | 실무 환경, 요청이 많은 서버 |
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();
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();
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 애플리케이션에서 데이터베이스와의 연결 설정을 관리하는 파일.
데이터베이스 연결 정보를 중앙화하여 관리하고, 보안성과 유지보수성을 높이기 위해 사용한다.
환경 변수.
DB 접속 정보(예: 비밀번호, 호스트 주소 등)를 코드에 직접 포함하지 않고, .env 파일에 저장해 관리하는 방식.
npm i dotenv
DB_HOST=127.0.0.1
DB_USER=root
DB_PASSWORD=mysecretpassword
DB_NAME=mydatabase
DB_PORT=3306
환경변수 파일에 작성한 내용은 process.env 키워드를 통해 다른 파일에서 가져다가 사용할 수 있다.
환경변수 파일은 보안에 민감한 데이터를 저장하는 곳으로, .gitignore를 통해 Github 저장소에 업로드되지 않도록 방지해주어야 한다.
MySQL과 Node.js 애플리케이션 간의 시간 데이터를 주고받을 때, 서버와 데이터베이스 간의 시간대 차이를 조정하기 위해 사용.
MySQL에서 날짜 및 시간 관련 필드(예: DATETIME, TIMESTAMP)를 사용할 때, 데이터가 저장되거나 읽혀지는 시간대에 영향을 줄 수 있으므로 적절한 시간대를 설정해주어야 한다.
- 애플리케이션 서버가 실행되는 지역과 MySQL 서버가 설정된 시간대가 다를 경우, 시간 데이터가 왜곡될 수 있다.
- 애플리케이션이 Asia/Seoul 시간대를 사용하는데 MySQL 서버가 UTC 시간대를 사용하면, 저장된 시간과 조회된 시간이 다를 수 있는 것.
위 예제 코드처럼 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'; -- 한국 표준시