1. MySQL
- 널리 사용되고 있는 관계형 데이터 베이스 중 하나 (2022년 7월 기준 랭킹 2위 - DB Engines Ranking)
- 오픈소스이며 여러 프로그래밍 언어에 대한 api를 제공
- 무료 버전과 유료 버전이 있으며 무료 버전의 이름은 MySQL Community
- 무료 버전은 GPL 라이선스
2. MySQL 설치
무료 버전인 MySQL Community를 설치
- MySQL Community Server 다운로드 링크에서 설치
- 설치 시 참고: Window10에 MySQL 다운로드 및 설치 하기
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');
});
참고
'Web > Database' 카테고리의 다른 글
[DB] 생활코딩 DATABASE2-MySQL 수업 정리 (0) | 2022.07.15 |
---|