Node.js · 2025-12-19

Node.js에서 MySQL 연결과 쿼리 최적화 방법

Node.js 환경에서 mysql2를 사용해 안정적인 MySQL 연결과 쿼리 성능 개선을 위한 실무형 코드 예제와 전략 모음

작성일 : 2025-12-19 ㆍ 작성자 : 관리자
post
목차

소개

웹 서버에서 데이터베이스 성능은 사용자 경험과 비용에 직결된다. 이 글은 mysql2 기반의 Node.js MySQL 연결 예제와 함께 노드 MySQL 성능 최적화 관점에서 실무에 바로 적용 가능한 기법을 정리한다. 처음 접하는 개발자도 이해하기 쉽도록 단계별로 설명하고 코드 예제를 제공한다.

사전 준비

필수 도구

  • Node.js 최신 LTS
  • MySQL 서버(버전 5.7 이상 권장)
  • 라이브러리: mysql2

기본 연결

간단한 연결 방법부터 시작한다. 테스트나 단순 작업에는 단일 커넥션이 빠르다.

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

async function main(){
  const conn = await mysql.createConnection({
    host: 'localhost',
    user: 'dbuser',
    password: 'password',
    database: 'testdb'
  });

  const [rows] = await conn.query('SELECT NOW() as now');
  console.log(rows);
  await conn.end();
}

main().catch(console.error);

커넥션 풀 사용

실 서비스에서는 커넥션 풀을 사용해 재사용성과 동시성 처리량을 높인다. 풀은 커넥션 생성 비용을 줄이고 안정성을 높인다.

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

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

async function getUsers(){
  const [rows] = await pool.query('SELECT id, name FROM users LIMIT 100');
  return rows;
}

쿼리 최적화 핵심

성능 개선은 DB 설계, 쿼리 작성, 서버 설정을 함께 고려해야 한다. 아래 항목을 우선 점검한다.

1. 인덱스 적절히 사용

WHERE, JOIN, ORDER BY에 사용되는 컬럼에 인덱스를 추가한다. 다만 너무 많은 인덱스는 쓰기 성능을 저하시킨다.

2. 준비된문(Prepared Statements) 사용

준비된문은 쿼리 파싱 비용을 줄이고 SQL 인젝션 공격에 안전하다.

const sql = 'SELECT * FROM products WHERE category = ? AND price < ?';
const [rows] = await pool.execute(sql, ['electronics', 1000]);

3. 페이징과 LIMIT

큰 OFFSET은 성능 저하를 유발한다. 가능한 경우 키 기반 페이징을 사용한다.

4. 배치 처리와 트랜잭션

대량 삽입은 단일 INSERT 다중값 또는 트랜잭션으로 묶어 네트워크 왕복과 내부 오버헤드를 줄인다.

async function insertBatch(items){
  const conn = await pool.getConnection();
  try{
    await conn.beginTransaction();
    const sql = 'INSERT INTO logs (msg, created_at) VALUES ?';
    const values = items.map(i => [i.msg, i.created_at]);
    await conn.query(sql, [values]);
    await conn.commit();
  }catch(e){
    await conn.rollback();
    throw e;
  }finally{
    conn.release();
  }
}

모니터링과 프로파일링

실제 성능 문제를 해결하려면 쿼리 플랜과 실행 시간을 측정해야 한다.

  • EXPLAIN로 쿼리 플랜 확인
  • slow_query_log 활성화로 병목 쿼리 식별
  • 애플리케이션 레벨 타이밍 로깅

실전 예제: 읽기 집중 API 최적화

읽기 작업이 많을 때는 캐싱 계층을 도입하거나 읽기 복제를 활용한다. 캐시 미스 시에만 DB를 조회하면 응답 속도를 크게 개선할 수 있다.

// 간단한 메모리 캐시 예시
const cache = new Map();

async function getProduct(id){
  if(cache.has(id)) return cache.get(id);
  const [rows] = await pool.execute('SELECT * FROM products WHERE id = ?', [id]);
  const item = rows[0] || null;
  if(item) cache.set(id, item);
  return item;
}

요약

Node.js MySQL 연결 예제는 mysql2 기반으로 구성하는 것이 일반적이다. 커넥션 풀, 준비된문, 적절한 인덱스, 배치 처리, 모니터링을 조합하면 노드 MySQL 성능 최적화에 큰 효과가 있다. 단계적으로 적용하면서 지표로 개선 여부를 검증하면 안정적인 성능 확보에 도움이 된다.

Node.js MySQL 연결 예제 mysql2 Node.js 사용법 노드 MySQL 성능 최적화 MySQL 인덱스 커넥션 풀 prepared statements 쿼리 프로파일링 배치 처리