쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

 안녕하세요. 안드로이드 기반 개인 앱, 프로젝트용 앱부터 그 이상 기능이 추가된 앱까지 제작해 드립니다.  - 앱 개발 툴: 안드로이드...

안녕하세요.신호처리를 전공한 개발자 입니다. 1. 영상신호처리, 생체신호처리 알고리즘 개발2. 안드로이드 앱 개발 3. 윈도우 프로그램...

소개안드로이드 기반 어플리케이션 개발 후 서비스를 하고 있으며 스타트업 경험을 통한 앱 및 서버, 관리자 페이지 개발 경험을 가지고 있습니다....

안녕하세요 안드로이드 개발 7년차에 접어든 프로그래머입니다. 간단한 과제 정도는 1~2일 안에 끝낼 수 있구요 개발의 난이도나 프로젝...

자바스크립트로 만드는 데스크톱 앱: Electron 입문

2024-10-27 14:01:55

재능넷
조회수 685 댓글수 0

자바스크립트로 만드는 데스크톱 앱: Electron 입문 🚀

 

 

안녕하세요, 코딩 열정 가득한 여러분! 오늘은 정말 흥미진진한 주제로 여러분과 함께 할 예정입니다. 바로 자바스크립트를 이용해 데스크톱 애플리케이션을 만드는 방법에 대해 알아볼 거예요. 그것도 아주 특별한 프레임워크인 Electron을 사용해서 말이죠! 😎

여러분, 혹시 웹 개발자로서 "내가 만든 웹 앱을 데스크톱에서도 실행할 수 있다면 얼마나 좋을까?"라고 생각해 본 적 있나요? 또는 "자바스크립트로 크로스 플랫폼 애플리케이션을 만들 수 있다면 얼마나 편할까?"라고 상상해 보셨나요? 그렇다면 여러분은 운이 좋습니다! Electron이 바로 그 꿈을 현실로 만들어주는 마법 같은 도구니까요! 🎩✨

이 글을 통해 우리는 Electron의 세계로 깊숙이 들어가 볼 예정입니다. 기본 개념부터 시작해서 실제 애플리케이션을 만들어보는 과정까지, 모든 것을 아주 상세하고 재미있게 다뤄볼 거예요. 마치 여러분의 친구가 옆에서 설명해주는 것처럼 편안하고 즐겁게 배워봐요!

그리고 잠깐! 여러분, 혹시 재능넷이라는 사이트를 들어보셨나요? 이곳은 다양한 재능을 거래할 수 있는 플랫폼인데요, 우리가 오늘 배울 Electron 기술로 만든 데스크톱 앱 개발 능력도 충분히 재능넷에서 거래될 수 있는 멋진 기술이랍니다. 어쩌면 여러분이 이 글을 통해 배운 기술로 새로운 수익 창출의 기회를 얻을 수도 있겠죠? 😉

자, 그럼 이제 본격적으로 Electron의 세계로 뛰어들어볼까요? 안전벨트 꽉 매세요. 우리의 Electron 여행이 시작됩니다! 🚗💨

1. Electron이란 무엇인가? 🤔

자, 여러분! Electron에 대해 들어보신 적 있나요? 아직 모르신다고요? 걱정 마세요. 지금부터 차근차근 설명해 드릴게요. 😊

Electron은 크로스 플랫폼 데스크톱 애플리케이션을 개발할 수 있게 해주는 오픈 소스 프레임워크입니다. 쉽게 말해, 웹 기술을 사용해서 Windows, macOS, Linux 등 다양한 운영 체제에서 동작하는 데스크톱 프로그램을 만들 수 있게 해주는 도구예요.

Electron은 GitHub에서 개발했으며, 처음에는 Atom 에디터를 위해 만들어졌답니다. 그런데 이 기술이 너무나 유용해서, 지금은 수많은 유명 애플리케이션들이 Electron을 사용하고 있어요. 예를 들면:

  • Visual Studio Code (Microsoft의 인기 코드 에디터)
  • Atom (GitHub의 텍스트 에디터)
  • Slack (팀 커뮤니케이션 도구)
  • Discord (게이머를 위한 음성 및 텍스트 채팅 앱)
  • Postman (API 개발 도구)

와우! 정말 대단하지 않나요? 여러분이 평소에 자주 사용하는 프로그램들 중 일부가 바로 우리가 배우려는 이 기술로 만들어졌다니 말이에요! 🎉

그렇다면 Electron은 어떻게 이런 마법 같은 일을 해낼 수 있을까요? 그 비밀은 바로 ChromiumNode.js의 결합에 있습니다.

🔍 Electron의 핵심 구성 요소:

  • Chromium: Google Chrome의 오픈 소스 버전으로, 웹 페이지를 렌더링합니다.
  • Node.js: 서버 사이드 JavaScript 실행 환경으로, 파일 시스템 접근 등 시스템 레벨의 작업을 수행합니다.

이 두 가지 강력한 기술의 결합으로 Electron은 웹 기술(HTML, CSS, JavaScript)을 사용해 데스크톱 애플리케이션의 UI를 만들 수 있게 해주고, 동시에 Node.js를 통해 운영 체제의 기능들을 활용할 수 있게 해줍니다. 마치 초콜릿과 땅콩버터의 완벽한 조화 같죠? 🍫🥜

Electron을 사용하면 웹 개발자들이 이미 알고 있는 기술을 활용해 데스크톱 애플리케이션을 만들 수 있어요. 이는 곧 학습 곡선을 크게 낮추고, 개발 속도를 높일 수 있다는 뜻이죠. 게다가 한 번의 코딩으로 여러 운영 체제에서 동작하는 애플리케이션을 만들 수 있으니, 정말 효율적이지 않나요?

하지만 모든 기술이 그렇듯, Electron도 장단점이 있습니다. 함께 살펴볼까요?

👍 Electron의 장점

  • 웹 기술을 사용하여 데스크톱 앱 개발 가능
  • 크로스 플랫폼 지원 (Windows, macOS, Linux)
  • 풍부한 생태계와 커뮤니티 지원
  • 빠른 개발 및 프로토타이핑
  • 자동 업데이트 기능 제공

👎 Electron의 단점

  • 네이티브 앱에 비해 상대적으로 큰 파일 크기
  • 메모리 사용량이 다소 높음
  • 일부 고성능이 요구되는 작업에는 부적합할 수 있음
  • 보안 설정에 주의가 필요함

이렇게 장단점이 있지만, 많은 개발자들과 기업들이 Electron을 선택하는 이유는 그만큼 장점이 매력적이기 때문이에요. 특히 웹 개발 지식을 가진 개발자들이 쉽게 데스크톱 앱 개발에 뛰어들 수 있다는 점은 정말 큰 장점이죠.

여러분도 이제 Electron의 매력에 빠지셨나요? 그렇다면 이제 본격적으로 Electron의 구조와 작동 원리에 대해 더 자세히 알아볼 차례입니다. 다음 섹션에서 계속해서 Electron의 세계를 탐험해 볼까요? Let's go! 🚀

2. Electron의 구조와 작동 원리 🏗️

자, 이제 Electron의 내부로 들어가 볼 시간입니다! 마치 우리가 거대한 기계의 내부를 들여다보는 것처럼 흥미진진할 거예요. 준비되셨나요? 그럼 시작해볼까요! 🕵️‍♂️

2.1 Electron의 기본 구조

Electron 애플리케이션은 크게 두 가지 유형의 프로세스로 구성됩니다:

1. 메인 프로세스 (Main Process)

2. 렌더러 프로세스 (Renderer Process)

이 두 프로세스는 각각 다른 역할을 수행하며, 서로 협력하여 하나의 애플리케이션을 구성합니다. 마치 오케스트라에서 지휘자와 연주자들이 각자의 역할을 수행하면서 하나의 아름다운 음악을 만들어내는 것과 비슷하죠! 🎵

2.1.1 메인 프로세스 (Main Process)

메인 프로세스는 Electron 애플리케이션의 '두뇌' 역할을 합니다. 이 프로세스는:

  • 애플리케이션의 생명주기를 관리합니다 (시작, 종료 등)
  • 네이티브 운영 체제 요소들과 상호작용합니다 (메뉴, 작업 표시줄 등)
  • 렌더러 프로세스를 생성하고 관리합니다
  • Node.js API를 전체적으로 사용할 수 있습니다

메인 프로세스는 보통 main.js (또는 index.js)라는 이름의 파일로 시작되며, 이 파일이 여러분 Electron 앱의 진입점이 됩니다.

2.1.2 렌더러 프로세스 (Renderer Process)

렌더러 프로세스는 애플리케이션의 '얼굴' 역할을 합니다. 이 프로세스는:

  • 웹 페이지를 표시합니다 (HTML, CSS, JavaScript)
  • 사용자 인터페이스(UI)를 렌더링합니다
  • 사용자와의 상호작용을 처리합니다
  • 제한된 Node.js API만 사용할 수 있습니다 (보안상의 이유로)

각 렌더러 프로세스는 독립적으로 실행되며, 하나의 Electron 앱은 여러 개의 렌더러 프로세스를 가질 수 있습니다. 마치 여러 개의 브라우저 탭을 열어놓은 것과 비슷하죠!

💡 재미있는 비유: Electron 앱을 레스토랑이라고 생각해봅시다. 메인 프로세스는 레스토랑의 매니저이고, 렌더러 프로세스는 손님들을 직접 응대하는 웨이터들이에요. 매니저는 전체적인 레스토랑 운영을 담당하고, 웨이터들은 손님들과 직접 상호작용하며 서비스를 제공하죠!

2.2 Electron의 작동 원리

이제 Electron이 어떻게 작동하는지 더 자세히 알아볼까요? 🧐

  1. 애플리케이션 시작: 사용자가 Electron 앱을 실행하면, 메인 프로세스가 가장 먼저 시작됩니다.
  2. 창 생성: 메인 프로세스는 BrowserWindow 객체를 사용하여 새 창을 만듭니다. 각 창은 자체 렌더러 프로세스에서 실행됩니다.
  3. 웹 페이지 로드:BrowserWindow는 지정된 URL을 로드합니다. 이 URL은 로컬 HTML 파일일 수도 있고, 원격 웹 페이지일 수도 있습니다.
  4. 렌더링: 렌더러 프로세스는 로드된 웹 페이지를 렌더링하고 사용자 상호작용을 처리합니다.
  5. 프로세스 간 통신: 메인 프로세스와 렌더러 프로세스는 Electron의 IPC (Inter-Process Communication) 시스템을 통해 서로 통신합니다.
  6. 네이티브 API 접근: 메인 프로세스는 필요에 따라 운영 체제의 네이티브 API에 접근하여 시스템 레벨의 작업을 수행합니다.

이 과정을 시각적으로 표현해보면 어떨까요? 다음 SVG 다이어그램을 통해 Electron의 구조와 작동 원리를 한눈에 살펴볼 수 있습니다:

Electron 구조 및 작동 원리 다이어그램 메인 프로세스 렌더러 프로세스 1 렌더러 프로세스 2 렌더러 프로세스 3 IPC IPC IPC • 앱 생명주기 관리 • 네이티브 API 접근 • 창 관리 • Node.js API 사용 • UI 렌더링 • 사용자 상호작용 처리

와! 이렇게 보니 Electron의 구조가 한눈에 들어오지 않나요? 메인 프로세스가 중심이 되어 여러 렌더러 프로세스들을 관리하고, IPC를 통해 서로 소통하는 모습이 정말 흥미롭죠! 😃

2.3 IPC (Inter-Process Communication)

앞서 언급했듯이, IPC는 메인 프로세스와 렌더러 프로세스 간의 통신을 가능하게 하는 중요한 메커니즘입니다. 이를 통해 두 프로세스는 서로 메시지를 주고받을 수 있죠. 마치 레스토랑에서 웨이터(렌더러 프로세스)가 주방(메인 프로세스)에 주문을 전달하고, 주방에서 완성된 요리를 다시 웨이터에게 전달하는 것과 비슷합니다! 🍽️

IPC 통신은 주로 다음과 같은 상황에서 사용됩니다:

  • 렌더러 프로세스에서 파일 시스템 접근이 필요할 때
  • 메인 프로세스에서 UI 업데이트가 필요할 때
  • 여러 창(렌더러 프로세스) 간에 데이터를 공유해야 할 때

Electron에서는 ipcMainipcRenderer 모듈을 사용하여 IPC 통신을 구현합니다. 간단한 예제를 통해 살펴볼까요?

메인 프로세스 (main.js):


const { ipcMain } = require('electron');

ipcMain.on('asynchronous-message', (event, arg) => {
  console.log(arg); // "ping" 출력
  event.reply('asynchronous-reply', 'pong');
});
    

렌더러 프로세스 (renderer.js):


const { ipcRenderer } = require('electron');

ipcRenderer.send('asynchronous-message', 'ping');
ipcRenderer.on('asynchronous-reply', (event, arg) => {
  console.log(arg); // "pong" 출력
});
    

이 예제에서 렌더러 프로세스는 'ping'이라는 메시지를 메인 프로세스에 보내고, 메인 프로세스는 이를 받아 'pong'이라고 응답합니다. 마치 탁구 경기 같죠? 🏓

이러한 IPC 통신을 통해 Electron 앱의 다양한 부분들이 서로 정보를 주고받으며 하나의 통합된 애플리케이션으로 동작할 수 있게 됩니다.

2.4 Electron의 보안 모델

Electron은 웹 기술을 기반으로 하기 때문에, 웹 애플리케이션과 유사한 보안 위험에 노출될 수 있습니다. 하지만 Electron은 이러한 위험을 최소화하기 위한 여러 보안 기능을 제공합니다.

🛡️ Electron의 주요 보안 기능:

  • 컨텍스트 격리 (Context Isolation): 렌더러 프로세스의 JavaScript 컨텍스트를 Electron의 내부 JavaScript와 분리합니다.
  • 샌드박싱 (Sandboxing): 렌더러 프로세스를 제한된 환경에서 실행하여 시스템 리소스에 대한 접근을 제한합니다.
  • CSP (Content Security Policy): 웹 보안 정책을 설정하여 XSS 공격 등을 방지합니다.

이러한 보안 기능들을 적절히 활용하면, 안전하고 신뢰할 수 있는 Electron 애플리케이션을 개발할 수 있습니다. 보안은 항상 중요하니까요! 🔒

자, 여기까지 Electron의 구조와 작동 원리에 대해 자세히 알아보았습니다. 어떠신가요? Electron이 어떻게 동작하는지 조금은 이해가 되셨나요? 😊

다음 섹션에서는 실제로 Electron을 설치하고 첫 번째 애플리케이션을 만들어보는 실습을 진행해볼 거예요. 기대되지 않나요? 여러분의 첫 Electron 앱이 탄생하는 순간을 함께 맞이해봐요! 🎉

그리고 잠깐! 여러분, 재능넷에서는 이런 Electron 앱 개발 skills을 가진 분들의 재능이 큰 가치를 발휘할 수 있답니다. 여러분이 배운 이 기술로 멋진 데스크톱 앱을 만들어 재능넷에서 공유하면 어떨까요? 🌟

3. Electron 설치 및 첫 번째 앱 만들기 🚀

드디어 우리가 기다리던 순간이 왔습니다! 이제 실제로 Electron을 설치하고 우리의 첫 번째 앱을 만들어볼 거예요. 정말 신나지 않나요? 마치 처음으로 자전거를 타는 것처럼 설레고 흥분되는 순간이죠! 😄 자, 그럼 시작해볼까요?

3.1 개발 환경 설정

먼저, Electron 개발을 위한 환경을 설정해야 합니다. 다음 도구들이 필요해요:

  • Node.js: Electron은 Node.js 기반이므로 반드시 설치해야 합니다.
  • npm (Node Package Manager): Node.js와 함께 자동으로 설치됩니다.
  • 코드 에디터: Visual Studio Code를 추천합니다. Electron 개발에 유용한 확장 프로그램들이 많거든요!

💡 Pro Tip: Node.js를 설치할 때는 LTS (Long Term Support) 버전을 선택하는 것이 좋아요. 안정성이 보장되거든요!

3.2 프로젝트 생성 및 Electron 설치

자, 이제 본격적으로 시작해볼까요? 다음 단계를 따라해보세요:

  1. 새로운 디렉토리를 만들고 그 안으로 이동합니다:
    mkdir my-electron-app
    cd my-electron-app
  2. npm을 초기화하여 package.json 파일을 생성합니다:
    npm init -y
  3. Electron을 개발 의존성으로 설치합니다:
    npm install electron --save-dev

와우! 이제 우리 프로젝트에 Electron이 설치되었어요. 느낌이 어떤가요? 마치 새로운 모험을 위한 장비를 갖추는 것 같지 않나요? 🎒

3.3 첫 번째 Electron 앱 만들기

이제 정말 흥미진진한 부분이에요! 우리의 첫 Electron 앱을 만들어볼 거예요. 다음 파일들을 생성해주세요:

1. main.js

이 파일은 우리 앱의 메인 프로세스가 될 거예요. 다음 코드를 입력해주세요:


const { app, BrowserWindow } = require('electron')
const path = require('path')

function createWindow () {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  win.loadFile('index.html')
}

app.whenReady().then(() => {
  createWindow()

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
  

2. preload.js

이 파일은 렌더러 프로세스에서 실행되기 전에 로드됩니다:


window.addEventListener('DOMContentLoaded', () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  }

  for (const dependency of ['chrome', 'node', 'electron']) {
    replaceText(`${dependency}-version`, process.versions[dependency])
  }
})
  

3. index.html

이것은 우리 앱의 UI가 될 거예요:


<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.
  </body>
</html>
  

4. package.json 수정

package.json 파일을 열고 "scripts" 부분을 다음과 같이 수정해주세요:


"scripts": {
  "start": "electron ."
}
  

3.4 앱 실행하기

모든 준비가 끝났습니다! 이제 우리의 첫 Electron 앱을 실행해볼 차례예요. 터미널에서 다음 명령어를 입력해주세요:

npm start

짜잔! 🎉 우리의 첫 번째 Electron 앱이 실행되었습니다! 어떤가요? 정말 놀랍지 않나요?

🎈 축하합니다! 여러분은 방금 첫 번째 Electron 앱을 만들고 실행했어요. 이것은 여러분의 Electron 여정의 시작일 뿐입니다. 앞으로 더 많은 흥미로운 기능들을 추가하고 멋진 앱을 만들 수 있을 거예요!

3.5 코드 설명

방금 작성한 코드가 어떤 역할을 하는지 간단히 설명해드릴게요:

  • main.js: 앱의 생명주기를 관리하고 네이티브 브라우저 창을 생성합니다.
  • preload.js: 렌더러 프로세스가 로드되기 전에 실행되며, 여기서는 Node.js, Chromium, Electron의 버전 정보를 HTML에 삽입합니다.
  • index.html: 앱의 사용자 인터페이스를 정의합니다.

이 간단한 앱은 Electron의 기본 구조를 보여줍니다. 메인 프로세스(main.js)가 앱을 제어하고, 렌더러 프로세스(index.html)가 UI를 표시하죠.

3.6 다음 단계

축하드려요! 여러분은 이제 Electron 개발의 첫 걸음을 내디뎠습니다. 하지만 이건 시작일 뿐이에요. 다음과 같은 것들을 시도해보는 건 어떨까요?

  • UI를 더 멋지게 꾸며보기 (CSS 사용)
  • 버튼 추가하고 클릭 이벤트 처리하기
  • 메뉴 만들기
  • 파일 시스템 접근하기
  • 다이얼로그 창 띄우기

그리고 잊지 마세요! 여러분이 만든 멋진 Electron 앱은 재능넷에서 큰 가치를 발휘할 수 있어요. 여러분의 창의적인 아이디어를 Electron으로 구현하고, 그 재능을 재능넷에서 공유해보는 건 어떨까요? 🌟

다음 섹션에서는 Electron의 주요 기능들을 더 자세히 살펴보고, 실제 애플리케이션에 어떻게 적용할 수 있는지 알아볼 거예요. 준비되셨나요? 더 깊이 있는 Electron의 세계로 함께 떠나봐요! 🚀

4. Electron의 주요 기능 살펴보기 🔍

자, 이제 우리는 Electron의 기본을 알았으니 더 깊이 들어가볼 차례예요! Electron은 정말 다양하고 강력한 기능들을 제공합니다. 마치 보물상자를 열어보는 것처럼 하나씩 살펴볼까요? 😃

4.1 네이티브 메뉴 만들기

Electron을 사용하면 운영 체제의 네이티브 메뉴를 쉽게 만들 수 있어요. 다음 코드를 main.js에 추가해보세요:


const { Menu } = require('electron')

const template = [
  {
    label: 'File',
    submenu: [
      { label: 'New', click: () => { console.log('New file') } },
      { label: 'Open', click: () => { console.log('Open file') } },
      { type: 'separator' },
      { label: 'Exit', role: 'quit' }
    ]
  },
  {
    label: 'Edit',
    submenu: [
      { role: 'undo' },
      { role: 'redo' },
      { type: 'separator' },
      { role: 'cut' },
      { role: 'copy' },
      { role: 'paste' }
    ]
  }
]

const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
  

이렇게 하면 'File'과 'Edit' 메뉴가 있는 네이티브 메뉴바가 생성됩니다. 멋지지 않나요? 🍔

4.2 시스템 트레이 아이콘 추가하기

데스크톱 앱에서 시스템 트레이 아이콘은 정말 유용해요. 다음 코드로 간단히 만들 수 있답니다:


const { Tray, Menu } = require('electron')
const path = require('path')

let tray = null
app.whenReady().then(() => {
  tray = new Tray(path.join(__dirname, 'icon.png'))
  const contextMenu = Menu.buildFromTemplate([
    { label: 'Item1', type: 'radio' },
    { label: 'Item2', type: 'radio' }
  ])
  tray.setToolTip('This is my application.')
  tray.setContextMenu(contextMenu)
})
  

이제 여러분의 앱은 시스템 트레이에 아이콘을 가지게 되었어요! 😎

4.3 파일 시스템 접근하기

Electron은 Node.js의 fs 모듈을 사용해 파일 시스템에 접근할 수 있어요. 예를 들어, 파일을 읽고 쓰는 기능을 추가해볼까요?


const fs = require('fs')

// 파일 읽기
fs.readFile('example.txt', 'utf-8', (err, data) => {
  if (err) throw err
  console.log(data)
})

// 파일 쓰기
fs.writeFile('example.txt', 'Hello, Electron!', (err) => {
  if (err) throw err
  console.log('The file has been saved!')
})
  

이렇게 하면 여러분의 앱에서 파일을 읽고 쓸 수 있어요. 메모장 앱을 만들어볼까요? 📝

4.4 IPC를 이용한 프로세스 간 통신

앞서 배운 IPC를 실제로 사용해볼까요? 메인 프로세스와 렌더러 프로세스 간에 메시지를 주고받아봐요:

메인 프로세스 (main.js):


const { ipcMain } = require('electron')

ipcMain.on('asynchronous-message', (event, arg) => {
  console.log(arg) // "ping" 출력
  event.reply('asynchronous-reply', 'pong')
})

ipcMain.on('synchronous-message', (event, arg) => {
  console.log(arg) // "ping" 출력
  event.returnValue = 'pong'
})
  

렌더러 프로세스 (renderer.js):


const { ipcRenderer } = require('electron')

// 비동기
ipcRenderer.send('asynchronous-message', 'ping')
ipcRenderer.on('asynchronous-reply', (event, arg) => {
  console.log(arg) // "pong" 출력
})

// 동기
const syncMsg = ipcRenderer.sendSync('synchronous-message', 'ping')
console.log(syncMsg) // "pong" 출력
  

이렇게 하면 두 프로세스 간에 자유롭게 통신할 수 있어요. 마치 텔레파시처럼요! 🧠✨

4.5 네이티브 대화 상자 사용하기

파일을 열거나 저장할 때, 또는 사용자에게 경고나 확인을 받을 때 네이티브 대화 상자를 사용하면 좋죠. Electron에서는 이런 대화 상자를 쉽게 만들 수 있어요:


const { dialog } = require('electron')

dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }).then(result => {
  console.log(result.filePaths)
})

dialog.showMessageBox({
  type: 'info',
  title: 'Information',
  message: 'This is an information dialog.',
  buttons: ['OK']
}).then(result => {
  console.log(`Button clicked: ${result.response}`)
})
  

이렇게 하면 사용자와 상호작용하는 멋진 대화 상자를 만들 수 있어요! 👨‍💻👩‍💻

4.6 자동 업데이트

Electron은 자동 업데이트 기능도 제공해요. autoUpdater 모듈을 사용하면 됩니다:


const { autoUpdater } = require('electron-updater')

autoUpdater.checkForUpdatesAndNotify()

autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
  const dialogOpts = {
    type: 'info',
    buttons: ['Restart', 'Later'],
    title: 'Application Update',
    message: process.platform === 'win32' ? releaseNotes : releaseName,
    detail: 'A new version has been downloaded. Restart the application to apply the updates.'
  }

  dialog.showMessageBox(dialogOpts).then((returnValue) => {
    if (returnValue.response === 0) autoUpdater.quitAndInstall()
  })
})
  

이렇게 하면 여러분의 앱이 자동으로 업데이트를 확인하고 설치할 수 있어요. 사용자들이 항상 최신 버전을 사용할 수 있겠죠! 🆕

4.7 네이티브 알림 보내기

운영 체제의 네이티브 알림을 보내는 것도 Electron에서는 아주 쉬워요:


const { Notification } = require('electron')

function showNotification () {
  const notification = {
    title: 'Basic Notification',
    body: 'Notification from the Main process'
  }
  new Notification(notification).show()
}

app.whenReady().then(showNotification)
  

이제 여러분의 앱에서 멋진 알림을 보낼 수 있어요! 📢

4.8 글로벌 단축키 등록하기

전체 시스템에서 작동하는 단축키를 등록할 수도 있어요:


const { globalShortcut } = require('electron')

app.whenReady().then(() => {
  globalShortcut.register('CommandOrControl+X', () => {
    console.log('CommandOrControl+X is pressed')
  })
})
  

이렇게 하면 앱이 백그라운드에 있어도 단축키가 작동해요. 생산성 도구를 만들 때 유용하겠죠? ⌨️

마무리

와! 정말 많은 기능들을 살펴봤네요. 이것들은 Electron이 제공하는 강력한 기능들의 일부일 뿐이에요. 여러분의 상상력을 마음껏 펼쳐보세요. 이 기능들을 조합하면 정말 멋진 데스크톱 앱을 만들 수 있을 거예요! 🚀

그리고 기억하세요, 여러분이 Electron으로 만든 멋진 앱들은 재능넷에서 큰 가치를 발휘할 수 있어요. 여러분만의 독특한 아이디어를 Electron으로 구현하고, 그 재능을 재능넷에서 공유해보는 건 어떨까요? 누군가에게는 정말 필요한 앱일 수 있고, 여러분에게는 새로운 기회가 될 수 있답니다! 💡💼

다음 섹션에서는 실제 프로젝트를 통해 이러한 기능들을 어떻게 조합하고 활용하는지 살펴볼 거예요. 기대되지 않나요? 함께 Electron 마스터가 되어봐요! 🏆

5. 실전 프로젝트: 간단한 메모장 앱 만들기 📝

자, 이제 우리가 배운 모든 것을 활용해서 실제 프로젝트를 만들어볼 시간이에요! 간단하지만 유용한 메모장 앱을 만들어볼 거예요. 이 앱은 다음과 같은 기능을 가질 거예요:

  • 텍스트 입력 및 편집
  • 파일 저장 및 열기
  • 메뉴를 통한 기능 접근
  • 단축키 지원

정말 흥미진진하지 않나요? 그럼 시작해볼까요? 🚀

5.1 프로젝트 설정

먼저, 새로운 디렉토리를 만들고 Electron을 설치해주세요:


mkdir electron-notepad
cd electron-notepad
npm init -y
npm install electron --save-dev
  

5.2 기본 파일 구조 만들기

다음과 같은 파일 구조를 만들어주세요:


electron-notepad/
  ├── main.js
  ├── index.html
  ├── styles.css
  └── renderer.js
  

5.3 main.js 작성하기

main.js 파일에 다음 코드를 작성해주세요:


const { app, BrowserWindow, Menu, dialog, ipcMain } = require('electron')
const fs = require('fs')
const path = require('path')

let mainWindow

function createWindow () {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  })

  mainWindow.loadFile('index.html')

  const menu = Menu.buildFromTemplate([
    {
      label: 'File',
      submenu: [
        {
          label: 'New',
          accelerator: 'CmdOrCtrl+N',
          click() { mainWindow.webContents.send('file-new') }
        },
        {
          label: 'Open',
          accelerator: 'CmdOrCtrl+O',
          click() { openFile() }
        },
        {
          label: 'Save',
          accelerator: 'CmdOrCtrl+S',
          click() { mainWindow.webContents.send('file-save') }
        },
        { type: 'separator' },
        { role: 'quit' }
      ]
    },
    {
      label: 'Edit',
      submenu: [
        { role: 'undo' },
        { role: 'redo' },
        { type: 'separator' },
        { role: 'cut' },
        { role: 'copy' },
        { role: 'paste' }
      ]
    }
  ])

  Menu.setApplicationMenu(menu)
}

app.whenReady().then(createWindow)

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})

function openFile() {
  dialog.showOpenDialog(mainWindow, {
    properties: ['openFile'],
    filters: [{ name: 'Text Files', extensions: ['txt'] }]
  }).then(result => {
    if (!result.canceled) {
      fs.readFile(result.filePaths[0], 'utf8', (err, data) => {
        if (err) {
          console.error(err)
          return
        }
        mainWindow.webContents.send('file-opened', data)
      })
    }
  })
}

ipcMain.on('save-file', (event, content) => {
  dialog.showSaveDialog(mainWindow, {
    filters: [{ name: 'Text Files', extensions: ['txt'] }]
  }).then(result => {
    if (!result.canceled) {
      fs.writeFile(result.filePath, content, (err) => {
        if (err) {
          console.error(err)
          return
        }
        console.log('File saved successfully')
      })
    }
  })
})
  

5.4 index.html 작성하기

index.html 파일에 다음 코드를 작성해주세요:


<!DOCTYPE html>
<html>
<head>
  <title>Electron Notepad</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <textarea id="notepad"></textarea>
  <script src="renderer.js"></script>
</body>
</html>
  

5.5 styles.css 작성하기

styles.css 파일에 다음 코드를 작성해주세요:


body, html {
  margin: 0;
  padding: 0;
  height: 100%;
}

#notepad {
  width: 100%;
  height: 100%;
  border: none;
  resize: none;
  padding: 10px;
  font-size: 16px;
  font-family: Arial, sans-serif;
}
  

5.6 renderer.js 작성하기

renderer.js 파일에 다음 코드를 작성해주세요:


const { ipcRenderer } = require('electron')

const notepad = document.getElementById('notepad')

ipcRenderer.on('file-new', () => {
  notepad.value = ''
})

ipcRenderer.on('file-opened', (event, content) => {
  notepad.value = content
})

ipcRenderer.on('file-save', () => {
  ipcRenderer.send('save-file', notepad.value)
})
  

5.7 앱 실행하기

package.json 파일의 "scripts" 부분을 다음과 같이 수정해주세요:


"scripts": {
  "start": "electron ."
}
  

이제 다음 명령어로 앱을 실행할 수 있어요:

npm start

와우! 🎉 여러분의 첫 번째 Electron 메모장 앱이 실행되었어요! 어떤가요? 정말 멋지지 않나요?

5.8 기능 설명

우리가 만든 메모장 앱은 다음과 같은 기능을 가지고 있어요:

  • 새 파일 만들기: 'File' 메뉴의 'New'를 클릭하거나 Ctrl+N (Mac에서는 Cmd+N) 단축키를 사용하면 텍스트 영역이 비워집니다.
  • 파일 열기: 'File' 메뉴의 'Open'을 클릭하거나 Ctrl+O (Mac에서는 Cmd+O) 단축키를 사용하면 파일 선택 대화상자가 열립니다. 선택한 파일의 내용이 텍스트 영역에 로드됩니다.
  • 파일 저장: 'File' 메뉴의 'Save'를 클릭하거나 Ctrl+S (Mac에서는 Cmd+S) 단축키를 사용하면 파일 저장 대화상자가 열립니다. 선택한 위치에 현재 텍스트 내용이 저장됩니다.
  • 편집 기능: 'Edit' 메뉴를 통해 실행 취소, 다시 실행, 잘라내기, 복사, 붙여넣기 등의 기본적인 편집 기능을 사용할 수 있습니다.

5.9 코드 설명

이 프로젝트에서 우리는 Electron의 여러 핵심 기능들을 사용했어요:

  • BrowserWindow: 애플리케이션의 창을 생성합니다.
  • Menu: 애플리케이션의 메뉴를 생성합니다.
  • dialog: 파일 열기/저장 대화상자를 표시합니다.
  • ipcMain과 ipcRenderer: 메인 프로세스와 렌더러 프로세스 간의 통신을 담당합니다.
  • fs 모듈: 파일 시스템에 접근하여 파일을 읽고 씁니다.

이 모든 요소들이 조화롭게 작동하여 하나의 완전한 애플리케이션을 만들어냈죠!

5.10 개선 아이디어

이 기본적인 메모장 앱을 더욱 발전시킬 수 있는 아이디어들을 제안해볼게요:

  • 자동 저장 기능: 일정 시간마다 또는 내용이 변경될 때마다 자동으로 저장하는 기능을 추가해보세요.
  • 다중 탭 지원: 여러 개의 문서를 동시에 열 수 있도록 탭 기능을 추가해보세요.
  • 텍스트 서식: 글꼴 변경, 굵게, 기울임꼴 등의 서식 기능을 추가해보세요.
  • 검색 및 바꾸기: 텍스트 내에서 특정 단어를 검색하고 바꿀 수 있는 기능을 추가해보세요.
  • 다크 모드: 사용자가 다크 모드와 라이트 모드를 선택할 수 있게 해보세요.
  • 단어 수 세기: 현재 문서의 단어 수, 문자 수 등을 표시하는 기능을 추가해보세요.

이러한 기능들을 추가하면 여러분의 메모장 앱은 더욱 강력하고 유용해질 거예요!

5.11 마무리

축하합니다! 🎊 여러분은 방금 완전히 동작하는 Electron 애플리케이션을 만들었어요. 이 과정에서 우리는 Electron의 핵심 개념들을 실제로 적용해보았죠. 메인 프로세스와 렌더러 프로세스의 역할, IPC를 통한 통신, 네이티브 API의 사용 등을 직접 경험해보았습니다.

이 프로젝트는 시작에 불과해요. 여러분의 창의력을 발휘하여 이 앱을 더욱 발전시켜보세요. 새로운 기능을 추가하고, UI를 개선하고, 사용자 경험을 향상시켜보세요. 여러분만의 독특한 아이디어를 반영한 애플리케이션으로 만들어보는 건 어떨까요?

그리고 잊지 마세요, 여러분이 만든 이 멋진 Electron 앱은 재능넷에서 큰 가치를 발휘할 수 있어요. 여러분만의 특별한 기능을 가진 메모장 앱을 개발하고, 그 재능을 재능넷에서 공유해보는 건 어떨까요? 누군가에게는 정말 필요한 도구가 될 수 있고, 여러분에게는 새로운 기회가 될 수 있답니다! 💡💼

Electron의 세계는 정말 넓고 깊어요. 이제 여러분은 그 세계를 탐험할 준비가 되었습니다. 계속해서 학습하고, 실험하고, 창조하세요. 여러분의 상상력이 Electron과 만나면 어떤 놀라운 애플리케이션이 탄생할지 정말 기대되지 않나요? 🚀✨

6. Electron 앱 배포하기 📦

여러분의 멋진 Electron 앱이 완성되었다면, 이제 그것을 세상과 공유할 차례입니다! 앱을 배포하는 과정을 함께 알아볼까요? 😃

6.1 앱 패키징

앱을 배포하기 위해서는 먼저 패키징 과정이 필요해요. 이를 위해 우리는 electron-builder라는 도구를 사용할 거예요. 다음 명령어로 설치해주세요:

npm install electron-builder --save-dev

그리고 package.json 파일에 다음 내용을 추가해주세요:


"scripts": {
  "start": "electron .",
  "build": "electron-builder"
},
"build": {
  "appId": "com.yourcompany.yourappname",
  "productName": "Your App Name",
  "mac": {
    "category": "public.app-category.productivity"
  },
  "win": {
    "target": [
      "nsis"
    ]
  },
  "linux": {
    "target": [
      "AppImage"
    ]
  }
}
  

6.2 앱 빌드하기

이제 다음 명령어로 앱을 빌드할 수 있어요:

npm run build

이 명령어를 실행하면 electron-builder가 여러분의 앱을 패키징하고, 실행 파일을 생성합니다. 생성된 파일은 dist 폴더에서 찾을 수 있어요.

6.3 자동 업데이트 설정

사용자들이 항상 최신 버전의 앱을 사용할 수 있도록 자동 업데이트 기능을 추가해봐요. electron-updater 모듈을 사용할 거예요:

npm install electron-updater

main.js 파일에 다음 코드를 추가해주세요:


const { autoUpdater } = require("electron-updater")

autoUpdater.checkForUpdatesAndNotify()
  

6.4 코드 서명

앱의 신뢰성을 높이기 위해 코드 서명을 하는 것이 좋아요. 각 운영 체제별로 코드 서명 방법이 다르니 주의해주세요:

  • Windows: Authenticode 인증서가 필요해요.
  • macOS: Apple Developer ID가 필요해요.
  • Linux: 대부분의 경우 코드 서명이 필요 없어요.

6.5 앱 배포

앱을 배포하는 방법은 여러 가지가 있어요:

  • 자체 웹사이트: 여러분의 웹사이트에서 직접 다운로드 링크를 제공할 수 있어요.
  • GitHub Releases: GitHub를 사용중이라면, Releases 기능을 통해 앱을 배포할 수 있어요.
  • 앱 스토어: Mac App Store, Microsoft Store 등에 등록할 수 있어요. 단, 각 스토어의 가이드라인을 잘 확인해야 해요.

6.6 마무리

축하합니다! 🎉 이제 여러분은 Electron 앱을 개발하고 배포하는 전체 과정을 알게 되었어요. 이는 정말 큰 성과입니다!

앱 배포는 개발 과정만큼이나 중요해요. 잘 만든 앱이 사용자들에게 전달되어야 그 가치를 인정받을 수 있으니까요. 여러분의 앱이 많은 사람들에게 사용되고 사랑받기를 바랄게요!

그리고 잊지 마세요, 여러분이 만든 이 멋진 Electron 앱과 배포 경험은 재능넷에서 아주 귀중한 자산이 될 수 있어요. 앱 개발부터 배포까지의 전체 과정을 경험한 여러분의 노하우는 많은 사람들에게 도움이 될 거예요. 여러분의 경험을 재능넷에서 공유해보는 건 어떨까요? 다른 개발자들에게 도움을 주면서, 동시에 새로운 기회를 만날 수 있을 거예요! 💡💼

Electron의 세계는 여기서 끝이 아니에요. 계속해서 새로운 기술을 배우고, 더 나은 앱을 만들어가세요. 여러분의 창의력과 열정이 세상을 변화시킬 수 있답니다. 화이팅! 🚀✨

7. 결론 및 다음 단계 🏁

여러분, 정말 대단해요! 👏 Electron의 기본 개념부터 시작해서 실제 앱을 만들고 배포하는 과정까지 모두 완료했습니다. 이제 여러분은 Electron 개발자라고 당당히 말할 수 있어요!

7.1 배운 내용 정리

지금까지 우리가 함께 배운 내용을 간단히 정리해볼까요?

  • Electron의 기본 구조와 작동 원리
  • 메인 프로세스와 렌더러 프로세스의 역할
  • IPC를 통한 프로세스 간 통신
  • 네이티브 API 활용 (메뉴, 대화 상자 등)
  • 간단한 메모장 앱 개발
  • Electron 앱 패키징과 배포

이 모든 과정이 쉽지만은 않았겠지만, 여러분은 훌륭히 해냈어요! 👍

7.2 다음 단계

하지만 이건 시작에 불과해요. Electron의 세계는 정말 넓고 깊답니다. 계속해서 성장하고 싶다면 다음과 같은 주제들을 더 공부해보는 것은 어떨까요?

  • 고급 UI 프레임워크 활용: React, Vue, Angular 등의 프레임워크를 Electron과 함께 사용해보세요.
  • 데이터베이스 연동: SQLite, MongoDB 등의 데이터베이스를 Electron 앱에 통합해보세요.
  • 테스트 자동화: Jest, Mocha 등의 테스트 프레임워크를 사용해 앱의 품질을 높여보세요.
  • 성능 최적화: 앱의 시작 시간을 줄이고, 메모리 사용을 최적화하는 방법을 학습해보세요.
  • 보안 강화: Electron 앱의 보안을 더욱 강화하는 방법을 알아보세요.
  • 다국어 지원: 여러분의 앱을 세계 각국의 사용자들이 사용할 수 있도록 다국어 지원을 추가해보세요.

7.3 커뮤니티 참여

Electron 개발자 커뮤니티에 참여하는 것도 좋은 방법이에요. 다음과 같은 활동을 해보세요:

  • Electron 공식 포럼에서 질문하고 답변하기
  • GitHub에서 Electron 프로젝트에 기여하기
  • 지역 개발자 모임이나 컨퍼런스 참여하기
  • 블로그나 유튜브 채널을 통해 여러분의 지식 공유하기

7.4 재능넷에서의 기회

여러분이 습득한 Electron 개발 능력은 재능넷에서 큰 가치를 발휘할 수 있어요. 다음과 같은 방법으로 여러분의 재능을 공유하고 새로운 기회를 만들어보세요:

  • Electron 앱 개발 서비스 제공: 클라이언트의 요구에 맞는 맞춤형 데스크톱 앱을 개발해주는 서비스를 제공해보세요.
  • Electron 튜토리얼 제작: 여러분이 Electron을 배우면서 얻은 인사이트를 다른 사람들과 공유해보세요.
  • 기존 웹 앱의 데스크톱 버전 제작: 웹 앱을 데스크톱 앱으로 전환하는 서비스를 제공해보세요.
  • Electron 앱 최적화 및 문제 해결: 다른 개발자들의 Electron 앱 성능을 개선하거나 버그를 수정해주는 서비스를 제공해보세요.
  • Electron 관련 컨설팅: Electron 프로젝트를 시작하려는 기업이나 개인에게 조언을 제공해보세요.

여러분의 Electron 개발 능력은 재능넷에서 다양한 형태로 가치를 창출할 수 있어요. 여러분만의 독특한 서비스를 개발하고 제공해보세요!

7.5 마무리 메시지

여러분, 정말 대단해요! 🌟 Electron의 세계를 탐험하는 긴 여정을 완주하셨습니다. 이제 여러분은 강력한 데스크톱 앱을 만들 수 있는 능력을 갖추게 되었어요. 이 능력으로 여러분은 세상을 조금씩 변화시킬 수 있답니다.

앞으로도 계속해서 배우고, 성장하고, 창조하세요. 여러분의 상상력과 Electron의 힘이 만나면 정말 놀라운 일들이 일어날 거예요. 그리고 그 과정에서 재능넷이 여러분의 든든한 파트너가 되어줄 거예요.

마지막으로, 코딩은 즐거워야 해요. 항상 호기심을 가지고, 새로운 것을 시도하는 것을 두려워하지 마세요. 여러분의 Electron 여정이 즐겁고 보람찼기를 바랍니다. 화이팅! 🚀✨

추천 자료 및 리소스 📚

Electron에 대해 더 깊이 있게 학습하고 싶으신가요? 다음의 자료들을 참고해보세요:

이 자료들을 통해 여러분의 Electron 실력을 한층 더 높일 수 있을 거예요. 화이팅! 💪

관련 키워드

  • Electron
  • 데스크톱 앱
  • 자바스크립트
  • 크로스 플랫폼
  • Node.js
  • Chromium
  • IPC
  • 메인 프로세스
  • 렌더러 프로세스
  • 앱 배포

지적 재산권 보호

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

# 최초 의뢰시 개발하고 싶으신 앱의 기능 및 화면구성(UI)에 대한 설명을 같이 보내주세요.# 앱스토어 URL 보내고 단순 카피 해달라고 쪽지 보내...

 안녕하세요 현재 안드로이드 기반 어플리케이션 제작 및 서비스를 하고 있으며,스타트업회사에 재직중입니다.- 개인앱, 프로젝트용 앱 등부...

 주문전 꼭 쪽지로 문의메세지 주시면 감사하겠습니다.* Skills (order by experience desc)Platform : Android, Web, Hybrid(Cordova), Wind...

 운영하는 사이트 주소가 있다면 사이트를 안드로이드 앱으로 만들어 드립니다.기본 5000원은 아무런 기능이 없고 단순히 html 페이지를 로딩...

📚 생성된 총 지식 10,267 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창