본문 바로가기

컴퓨터/Electron

Electron 로그인 애플리케이션

0. 개요: Electron은 리눅스, 윈도우, 맥에서 모두 사용할 수 있지만 윈도우는 크게 설명이 필요없을 정도로 쉽고 맥은 내가 쓸 일이 없을 것 같아 리눅스 위주로 글을 적을 것이다. 아... 그러고 보니 맥도 쓸 일 있겠는데?;;;

1. 필수조건: Node.js가 설치돼 있어야 한다.

2. 프로젝트 생성

mkdir app && cd app
npm init -y

9. 빌더 설정: package.json

{
  "name": "appname",
  "version": "1.0.0",
  "description": "description",
  "main": "main.js",
  "homepage": "https://yourprojecthomepage.com",
  "author": {
    "name": "yourname",
    "email": "youremail@example.com"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "electron .",
    "build": "electron-builder"
  },
  "build": {
    "appId": "com.example.appname",
    "productName": "appname",
    "directories": {
      "output": "build"
    },
    "files": [
      "**/*"
    ],
    "linux": {
      "target": [
        "AppImage",
        "deb"
      ],
      "maintainer": "yourname <youremail@example.com>"
    },
    "win": {
      "target": "nsis"
    },
    "mac": {
      "target": "dmg"
    }
  },
  "keywords": [
    "keyword"
  ],
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {
    "electron": "^24.1.2",
    "electron-builder": "^23.6.0"
  }
}

3. 디렉토리 구조 구축

my-electron-app/
├─ package.json         # 프로젝트 설정 파일
├─ README.md            # 프로젝트 설명 및 사용법
├─ .env.dev             # 개발환경에서 사용할 환경변수 파일
├─ .env.prod            # 배포환경에서 사용할 환경변수 파일
├─ src/                 # 소스 코드를 저장하는 폴더
│  ├─ main/             # 메인 프로세스 관련 소스 코드
│  │  ├─ main.js        # 메인 프로세스 엔트리 포인트
│  │  ├─ database.js    # 데이터베이스 관련 코드
│  │  └─ ...            # 기타 메인 프로세스 관련 코드
│  ├─ renderer/         # 렌더러 프로세스 관련 소스 코드
│  │  ├─ pages/         # 렌더러 프로세스 HTML 페이지
│  │  │  ├─ index.html  # 첫 번째 페이지
│  │  │  └─ ...         # 기타 페이지
│  │  └─ js/            # 렌더러 프로세스 HTML 페이지
│  │     ├─ renderer.js # 렌더러 프로세스 엔트리 포인트 (JavaScript)
│  │     └─ ...         # 기타 렌더러 프로세스 관련 코드
│  └─ preload/          # 프리로드 스크립트 관련 소스 코드
│     └─ preload.js     # 프리로드 스크립트 엔트리 포인트
│     └─ ...            # 기타 프리로드 스크립트 관련 코드
├─ assets/              # 정적 리소스 (이미지, 폰트 등)
│  ├─ images/           # 이미지 파일
│  └─ fonts/            # 폰트 파일
└─ styles/              # CSS 스타일시트
   └─ main.css          # 메인 CSS 파일

4. 환경 변수 파일 작성: .env

NODE_ENV=development
DB_HOST=
DB_PORT=
DB_USER=
DB_PASSWORD=
DB_DATABASE=
HASH_FUNCTION=
HASH_LENGTH=

  환경 변수를 설정할 때는 문자열이라고 따옴표로 감쌀 필요가 없다.

5. 프로젝트 작성

  1) src/main/db.js

const mariadb = require('mariadb');

const pool = mariadb.createPool({
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  connectionLimit: 5
});

async function checkConnection() {
  let conn;
  try {
    conn = await pool.getConnection();
    return true;
  } catch (err) {
    return false;
  } finally {
    if (conn) conn.release();
  }
}

async function executeSql(sql) {
  let conn;
  try {
    conn = await pool.getConnection();
    const rows = await conn.query(sql);
    return rows;
  } catch (err) {
    console.log(err);
  } finally {
    if (conn) conn.release();
  }
}

module.exports = {
  checkConnection,
  executeSql
};

  2) src/main/createWindow.js

const { BrowserWindow } = require('electron');
const path = require('path');

module.exports = async function createWindow(windowWidth, windowHeight, preloadScript, isMenuVisible, htmlFilename) {
  const isDevelopment = process.env.NODE_ENV === 'development';
  const win = new BrowserWindow({
    width: windowWidth,
    height: windowHeight,
    webPreferences: {
      nodeIntegration: true, // 렌더러 프로세스에서 Node.js 통합을 활성화
      contextIsolation: !isDevelopment, // 개발 환경에서만 컨텍스트 격리를 비활성화
      sandbox: true, // Chromium의 내장 샌드박스 기능을 활성화하여 추가 보안 레이어 적용
      devTools: isDevelopment, // 개발 환경에서만 개발자 도구를 활성화
      preload: path.join(__dirname, `../preload/${preloadScript}`),
    },
  });
  win.setMenuBarVisibility(isMenuVisible);
  win.loadFile(path.join(__dirname, `../renderer/pages/${htmlFilename}`));
  return win;
};

  3) src/main/login.js

 

  4) src/main/main.js

const { app, BrowserWindow } = require('electron');
const electronReload = require('electron-reload');
const path = require('path');
require('dotenv').config();
const createWindow = require('./createWindow');
const login = require('./login');

// 개발 중에만 사용하는 코드
if (process.env.NODE_ENV === 'development') {
  // electron-reload 사용하기
  electronReload(path.join(__dirname, '../../'), {
    forceHardReset: true,
    hardResetMethod: 'exit',
    filter: '*.*',
  });
}

// 앱이 준비되면 새 창을 생성
async function main() {
  await app.whenReady();
  await login();
}
main();

// 모든 창이 닫히면 애플리케이션을 종료 (macOS 제외)
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

// 앱이 활성화될 때 새 창을 생성 (macOS에서만)
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <!-- CSP 설정 추가 -->
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
    />
    <title>Hello Electron!</title>
  </head>
  <body>
    <h1>Hello Electron!</h1>
  </body>
</html>

3. Electron 설치: 패키지를 개발자 의존형으로 설치한다.렇게 하면 프로덕션 빌드에서 Electron이 제외되어 애플리케이션 크기가 줄어든다.

npm install electron electron-builder electron-reload dotenv --save-dev
npm install mariadb
sudo npm install -g nodemon

10. 빌드

  빌드하는 OS 환경에 맞는 결과물만 빌드된다.

npm run build

11. 설치

sudo dpkg -i appname_1.0.0_amd64.deb

  만약, 종속성 문제가 발생하면,

sudo apt install -f

12. 실행

appname

  혹은 GUI 에서도 실행할 수 있다.

13. 삭제

sudo dpkg -r appname

14. 디렉토리 구조

'컴퓨터 > Electron' 카테고리의 다른 글

Electron 모듈화  (0) 2023.04.24
Electron 상단 메뉴 (main menu)  (0) 2023.04.24
Electron MariaDB  (0) 2023.04.23
Electron 아이콘 icon  (0) 2023.04.23
Electron Introduction 소개  (0) 2021.12.01