MariaDB는 오픈소스 DBMS로서, SQL을 통한 데이터베이스 관리를 지원한다.
몽고DB, 구글 파이어베이스와 같은 NoSQL DB들과 같은 선택지도 있었지만, 필자는 SQL에 좀 더 익숙하기 때문에 학습으로 인한 개발기간 증가보다는 빠르게 아는 것을 활용하는 것이 좋다고 생각했고, 개인 프로젝트기 때문에 비용이 들지 않는 오픈소스 DBMS인 MariaDB 사용을 결정하게 되었다.
db.js
var mysql = require('mysql2');
const db = mysql.createConnection({
host:'',
user:'',
password:'',
database:'myblog'
});
module.exports = db;
indexpost.js (Model)
const db = require('../lib/db');
const sanitizeHtml = require('sanitize-html');
const asyncHandler = require('express-async-handler');
let Post = function(post){
this.id = post.id
this.title = post.title;
this.content = post.content;
this.image_src = image_src;
}
// index 설명페이지 데이터 전부 가져옴.
Post.aboutmeAll = function(){
// async 처리위해 Promise 사용
return new Promise((resolve, reject) => {
db.query("SELECT * FROM aboutme", function(err, result, fields){
if (err) throw err;
else {
resolve(result);
}
})
}).catch(error => console.log(error));
}
...
apiController.js (Controller)
const indexmodel = require('../model/indexpost');
////////////////////////////// aboutme API ////////////////////////////////////////////////////////////
// @ get
// /api/aboutme
const getAboutme = async(req, res) => {
var result = {};
result = await indexmodel.aboutmeAll(); // 전체 aboutme table data 소환
res.json(result);
};
...
DB의 경우 모든 함수를 async, 즉 비동기 처리하였다. Node.js의 경우 따로 비동기 처리를 해 주지 않는 경우 동기처리된다. 즉 DB의 경우, 쿼리가 끝나지 않아 결과값이 받아지지 않았음에도 다음에 실행 될 함수가 결과값을 받은 것으로 치고 (잘못)동작해버리는 경우가 대부분이다. 필자도 처음에 비동기 처리에 대한 지식이 없어, 문제가 생겼고 (DB쿼리 결과값이 받아지지 않아 한참을 고민했다.) 비동기 처리에 대한 내용을 알게 되었다.
따라서 Promise - resolve / async - await 형태로 작성하였다. 작동되는 방식은 다음과 같다.
호출되는 함수와 await
const getAboutme = async(req, res) => { // async로 비동기 처리 명시
var result = {};
result = await indexmodel.aboutmeAll(); // await 명시, 끝날 때까지 기다림.
res.json(result);
};
Post.aboutmeAll = function(){
// async 처리위해 Promise 사용
return new Promise((resolve, reject) => { // return은 Promise object이다.
db.query("SELECT * FROM aboutme", function(err, result, fields){
if (err) throw err;
else {
resolve(result); // 반드시 result 객체를 반환한다.
}
})
}).catch(error => console.log(error));
}
const getAboutme = async(req, res) => {
var result = {};
result = await indexmodel.aboutmeAll(); // indexmodel.aboutmeAll이 동작하면 promise 객체가 반환, await를 통해 promise객체를 열람, result가 반환됨
res.json(result); // 나머지 부분 동작
};