본문 바로가기
Web/Database

Node.js에서 MySQL 활용

by 임아톰 2022. 7. 27.

1. MySQL

  • 널리 사용되고 있는 관계형 데이터 베이스 중 하나 (2022년 7월 기준 랭킹 2위 - DB Engines Ranking)
  • 오픈소스이며 여러 프로그래밍 언어에 대한 api를 제공
  • 무료 버전과 유료 버전이 있으며 무료 버전의 이름은 MySQL Community
    • 무료 버전은 GPL 라이선스

 

2. MySQL 설치

무료 버전인 MySQL Community를 설치

 

3. Node.js 웹 서버 만들기

Node.js 설치

node --version
npm --version
  • 터미널에 위의 명렁어를 입력했을 때 버전번호가 나오면 잘 설치 되어 있는 것
  • 설치가 안되어 있으면 다음의 링크에서 설치하자

 

Node.js 프로젝트 만들기

원하는 위치에 작업용 폴더를 만들고 해당 폴더 위치로 이동

mkdir nodejs_mysql_test
cd nodejs_mysql_test

 

프로젝트를 초기화

npm init --yes
  • 프로젝트 폴더에 package.json 파일이 추가된 걸 확인할 수 있다.

 

package.json 파일 내용을 다음과 같이 수정 (”start” 부분 수정)

{
  "name": "nodejs_mysql_test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

 

터미널에 다음 명령어를 입력해서 express와 mysql을 설치하자.

npm install express mysql2

 

4. 테이블 생성 및 데이터 삽입

MySQL에 접속해서 테이블을 생성하고 테스트용 데이터 삽입한다.

터미널에 다음 명령어를 입력해서 MySQL에 접속

mysql -uroot -p
  • 비밀 번호 입력 창이 나아모녀 비밀번호를 입력하고 MySQL에 접속

 

데이터베이스(스키마) 목록을 보고 싶으면 다음 명령어를 입력하여 확인할 수 있음

mysql> show databases;

 

작업할 데이터베이스를 생성하고 생성한 데이터베이스를 사용한다.

CREATE DATABASE [database name];
USE [database name];

 

MySQL에 다음 명령어를 입력해서 테이블 생성한다.

CREATE TABLE topic(	
	id INT(11) NOT NULL AUTO_INCREMENT,
	title VARCHAR(100) NOT NULL,
	description TEXT NULL,
	created DATETIME NOT NULL,
	author VARCHAR(15) NULL,
	profile VARCHAR(200) NULL,
	PRIMARY KEY(id)
);
  • topic 테이블은 게시글(제목, 내용, 작가, ..)을 담는 테이블
    • 생활코딩 데이터베이스 강의에서 사용한 예시를 가져왔다.

 

생성한 테이블에 테스트용 데이터를 삽입한다.

MySQL에 다음과 같이 입력한다.

INSERT INTO topic (title,description,created,author,profile)
VALUES('MySQL','MySQL is ...',NOW(),'egoing','developer');

 

5. Node.js와 MySQL 연결

프로젝트 폴더에 index.js 파일을 생성하고 다음과 같이 작성한다.

const mysql = require('mysql2');
var conn = mysql.createConnection({ 
    host : 'localhost',  
    user : '[MYSQL username]',
    password : '[MYSQL password]',
    database : '[Database name]'
  }); // 실제는 이렇게 비밀번호 적나라하게 적으면 절대 안됨

  conn.connect(); // mysql과 연결

  var sql = 'select * from topic'
  conn.query(sql, function(err, rows, fields)
  {
      if (err) {
          console.error('error connecting: ' + err.stack);
      }
      console.log(rows);
          
  });
  conn.end(); // 연결 해제

 

터미널에 npm start를 입력하여 코드를 실행한다. 콘솔에 다음과 같이 출력되면 잘 실행된 것이다.

[
  {
    id: 1,
    title: 'MySQL',
    description: 'MySQL is ...',
    created: 2022-07-15T04:44:57.000Z,
    author: 'egoing',
    profile: 'developer'
  }
]

 

6. Express 코드 작성

express를 이용하여 클라이언트에서 데이터를 요청하면 DB에 있는 데이터를 제공할 수 있도록 코드를 작성한다.

 

데이터베이스 설정과 관련 파일은 폴더를 분리할 수 있게 config 폴더를 생성한다.

config 폴더에 db_config.js 파일을 생성한다.

 

db_config.js

// config/db_config.js
module.exports = {
    host : 'localhost',  
    user : '[MYSQL username]',
    password : '[MYSQL password]',
    database : '[Database name]'
};
const mysql = require('mysql2');
const express = require('express');
const app = express();
const dbconfig   = require('./config/db_config.js');
const conn = mysql.createConnection(dbconfig);

app.get('/',function(req, res){
	conn.connect(); // mysql과 연결

    var sql = 'select * from topic'
    conn.query(sql, function(err, rows, fields)
    {
        if (err) {
            console.error('error connecting: ' + err.stack);
        }
        res.send(rows);
            
    });
    conn.end(); // 연결 해제
}); 
 
app.listen(5000, function(){
	console.log('Listening at 5000');
});

 

터미널에 npm start를 입력하여 코드를 실행한다. 콘솔에 ‘Listening at 5000’이라 뜨면 잘 실행된 것이다.

브라우저를 실행하여서 주소창에 다음과 같이 입력한다.

<http://localhost:5000/topic>

엔터를 눌러 요청을 보내면 다음과 같이 응답이 온다.

[
  {
    "id": 1,
    "title": "MySQL",
    "description": "MySQL is ...",
    "created": "2022-07-27T05:24:00.000Z",
    "author": "egoing",
    "profile": "developer"
  }
]

 

7. connection pool 사용

 

커넥션 풀(connection pool)?

  • 커넥션 풀은 db와 연결된 connection을 미리 만들어 pool에 보관하였다가 필요할 때 pool에서 connection을 가져다 사용하고 사용 후에는 pool에 다시 반환하는 기법
  • 데이터베이스 연결 작업은 비용이 큰 작업으로 커넥션 풀을 사용하면 그 비용을 줄일 수 있음

 

db_config.json

// config/db_config.json

{
    "host": "localhost",
    "user": "[MYSQL username]",
    "password": "[MYSQL password]",
    "database": "[Database name]",
    "connectionLimit": 30
}

db_config.js

// config/db_config.js

const mysql = require('mysql2');
const config = require('./db_config.json');

let pool = mysql.createPool(config);

function getConnection(callback) {
  pool.getConnection(function (err, conn) {
    if(!err) {
      callback(conn);
    }
  });
}

module.exports = getConnection;
  • mysql.createPoool(_config): 새로운 Pool을 생성
  • pool.getConnection: pool에서 Connection 가져오기
const mysql = require('mysql2');
const express = require('express');
const app = express();
const getConnection = require('./config/db_config')

app.get('/',function(req, res){
    getConnection((conn) => {
        var sql = 'select * from topic'
        conn.query(sql, function(err, rows, fields)
        {
            if (err) {
                console.error('error connecting: ' + err.stack);
            }
            // sql 문에 해당하는 행을 rows가 받음 -> 테이블 전체 행
            res.send(rows);
                
        });
        conn.release();
    });
}); 
 
app.listen(5000, function(){
	console.log('Listening at 5000');
});

 

참고

Window10에 MySQL 다운로드 및 설치 하기

Node.js에서 Mysql Connection Pool 이용하기

반응형

'Web > Database' 카테고리의 다른 글

[DB] 생활코딩 DATABASE2-MySQL 수업 정리  (0) 2022.07.15