WEB/Electron

[Electron] database 연결하기

S0PH1A 2019. 4. 6. 18:15
반응형

[Electron] database 연결하기


 

Database(Mysql) 에 정상적으로 연결되었는지 Main 프로세스에서 체크한 후 결과를 화면(renderer)에 표시하려고 한다.

 

 

파일 구조는 아래와 같이 구성했다.

- main.js          : 메인 프로세스

- database       

   db_info.js   : database 정보

   db_conn.js  : database 연결 함수 정의 

- app

   main.html

   renderer.js  

 

 

간략히 설명하면

내가 구성한 코드의 작동 순서는 다음과 같다.

1) renderer.js 에서 main으로 database 가 연결되었는지 확인 요청함

2) main.js 에서 database 연결을 db_conn.js 의 open 함수를 통해 체크한 후 

   open 함수에서 결과를 renderer.js 로 전송함.

 

 

먼저, db_info.js 파일에 연결한 데이터베이스 정보를 적는다.

( * 따로 파일을 분리한 이유는 후에 배포할 때, 해당 정보는 중요한 정보이기 때문에 숨기기 위해서 이다. )

// 파일명 : db_info.js
module.exports = (function () {
    return {
        local: {  
            host: 'localhost',
            port: '3306',
            user: 'root',
            password: ''
        }
    }
})();

 

그다음, db_conn.js 파일에 mysql(database) 연결관련 함수모듈을 만들어준다.

    * $ npm install mysql 

    * 각 함수별 기능

       - init : mysql connection 생성

       - open : connection 연결

       - close : connection 닫기(종료)

    * BrowserWindow.getFocusedWindow() : 현재 포커스를 갖고 있는 윈도우를 반환함.

    * connect 가 비동기로 실행되기 때문에 return 으로 연결 결과가 바로 전달되지 않기 때문에,

      webcontents.send() 를 통해 연결 결과를 renderer로 전달하였다.

/*
 * 파일명 : db_conn.js
 * Connect DataBase ( MySQL )
 */
const mysql = require('mysql');
var config = require('./db_info'); // db 정보
const { BrowserWindow } = require('electron');

module.exports = function () {
    return {
        init: function () {
            return mysql.createConnection(config.local);
        },

        open: function (conn) {
            const mainWindow = BrowserWindow.getFocusedWindow();
            conn.connect(function (err, callback) {
                if (err) {
                    console.log("[ERROR] Can not Connected to MySQL!");
                    mainWindow.webContents.send('callFunction', 'connect', false);
                } else {
                    console.log("[INFO] Connected to MySQL!");
                    mainWindow.webContents.send('callFunction', 'connect', true);    
                }
            })
        },

        close: function (conn) {
            conn.end(function (err) {
                if (err) con.destroy(); // 에러가 발생할 경우 즉시 강제 종료.
                console.log("[INFO] Connection closed.")
                mainWindow.webContents.send('callFunction', 'disconnect', true);    
            })
        }
    }
}

 

 

이제, renderer.js 에서 main 프로세스로 메세지를 보내 연결이 되었는지 확인한다.

// 파일명 : renderer.js
ipcRenderer.send('connect', {});

 

메인 프로세스에서 메세지를 받아 database 연결을 확인한다.

    * 연결되었는지에 대한 결과는 이전에 db_conn.js 에서 renderer로 보내도록 정의했기 때문에

      이 곳에서는 db_conn.js 의 연결 함수만 실행하였다.

/*
 * 파일명 : main.js
 * Check Database is Connected
*/
const ipcMain = require('electron').ipcMain;
var db = require('./database/db_conn')();
ipcMain.on('connect', (event, arg) => {
    var conn = db.init();
    db.open(conn);
})

 

마지막으로, main 프로세스에서 보낸 메세지를 renderer에서 받으면 된다.

// 파일명 : renderer.js
// Main 프로세스에서 보낸 메세지 받음.
ipcRenderer.on('callFunction', function (event, functionName, param) {
    switch (functionName) {
        // database
        case "connect":
            check_dbconnect(param);
            break;
        case "disconnect":
            break;
    }
});

// 연결 체크 함수
function check_dbconnect (param) {
    if (param)    // 성공
        console.log("[INFO] Connected to MySQL!");
    else          // 실패
        console.log("[ERROR] Can not Connected to MySQL!");
}

 

 

 

 

반응형