블로그 프로젝트 - 2-2 : 주요 개발 내용 - MariaDB

HK_Jang·2022년 4월 2일
0

블로그 프로젝트

목록 보기
5/10
post-thumbnail

1. 무엇인가?

MariaDB는 오픈소스 DBMS로서, SQL을 통한 데이터베이스 관리를 지원한다.

2. 왜 사용했는가?

몽고DB, 구글 파이어베이스와 같은 NoSQL DB들과 같은 선택지도 있었지만, 필자는 SQL에 좀 더 익숙하기 때문에 학습으로 인한 개발기간 증가보다는 빠르게 아는 것을 활용하는 것이 좋다고 생각했고, 개인 프로젝트기 때문에 비용이 들지 않는 오픈소스 DBMS인 MariaDB 사용을 결정하게 되었다.

3. 어떻게 적용했는가?

  1. NPM으로 mysql 패키지를 다운로드 받았다.
  2. mysql.createConnection을 통해 db객체를 생성하였다.

db.js

var mysql = require('mysql2');

const db = mysql.createConnection({
  host:'',
  user:'',
  password:'',
  database:'myblog'
});

module.exports = db;
  1. MVC패턴 중 Model을 작성하여 DB 연동을 지원하였다. 예시로 자기소개 DB를 관리하는 indexpost.js파일과 그 모델을 사용하는 apiController.js를 가져왔다.

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);
};
...
  1. DB의 경우 모든 함수를 async, 즉 비동기 처리하였다. Node.js의 경우 따로 비동기 처리를 해 주지 않는 경우 동기처리된다. 즉 DB의 경우, 쿼리가 끝나지 않아 결과값이 받아지지 않았음에도 다음에 실행 될 함수가 결과값을 받은 것으로 치고 (잘못)동작해버리는 경우가 대부분이다. 필자도 처음에 비동기 처리에 대한 지식이 없어, 문제가 생겼고 (DB쿼리 결과값이 받아지지 않아 한참을 고민했다.) 비동기 처리에 대한 내용을 알게 되었다.
    따라서 Promise - resolve / async - await 형태로 작성하였다. 작동되는 방식은 다음과 같다.

  • A - Controller에서 async, 즉 비동기 처리가 되어야 한다고 명시된 함수가 호출된다. (getAboutme함수)
  • B - 함수 내에서 Promise객체를 리턴하는 비동기 함수를 call 하는데, 이 때 앞에 await를 붙여 비동기 함수가 끝날 때까지 기다리게 한다.

호출되는 함수와 await

const getAboutme = async(req, res) => { // async로 비동기 처리 명시
    var result = {};
    result = await indexmodel.aboutmeAll(); // await 명시, 끝날 때까지 기다림.
    res.json(result);
};
  • C - Model의 함수가 Call되었다.(Post.aboutmeAll 함수) Promise 객체를 리턴하는 익명 함수 내에서, 비동기 처리가 성공적으로 끝날 시 result객체를 반드시 반환한다. 이는 resolve로 명시되어 있다. (resolve(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));
}
  • D - Promise객체가 반환되어 await를 통해 resolve된 객체(result)가 결과적으로 반환되면, getAboutme 함수의 나머지 부분이 동작한다.
const getAboutme = async(req, res) => { 
    var result = {};
    result = await indexmodel.aboutmeAll(); // indexmodel.aboutmeAll이 동작하면 promise 객체가 반환, await를 통해 promise객체를 열람, result가 반환됨
    res.json(result); // 나머지 부분 동작
};
  1. 위와 같은 비동기 처리를 하여, DB활용을 할 수 있었다.
profile
살아남는 종은 강한 종이나 똑똑한 종이 아닌, 변화에 적응하는 종이다. - 찰스 다윈

0개의 댓글