본문 바로가기
프로그래머로의 여정

네이티브 모듈(Native Module)

by nunaaa 2025. 5. 10.

 

네이티브 모듈(Native Module) 이해하기

네이티브 모듈은 JavaScript 환경(Node.js, Electron 등)에서 C, C++, Rust 등으로 작성된 시스템 네이티브 코드를 호출할 수 있게 해주는 확장 모듈입니다.

1. 네이티브 모듈의 주요 특징

  • 성능 향상: CPU 집약적인 작업을 네이티브 코드로 처리
  • 시스템 기능 접근: OS 수준의 기능에 직접 접근 가능
  • 하드웨어 제어: 특정 하드웨어 장치 제어 가능
  • 기존 라이브러리 활용: C/C++로 작성된 기존 라이브러리 재사용
참고: HTML/JavaScript만으로는 진정한 네이티브 모듈을 사용할 수 없습니다. 이 문서는 개념 설명을 위한 것입니다.

2. Electron에서의 네이티브 모듈 사용 예시

const { exec } = require('child_process')
const nativeModule = require('my-native-addon') // C++로 작성된 모듈

// JavaScript로는 어려운 Windows 텍스트 선택 감지
nativeModule.getSelectedText((err, text) => {
  if (!err && text) {
    mainWindow.webContents.send('text-selected', text)
  }
})

3. 네이티브 모듈 생성 기본 과정 (Windows 예시)

A. 프로젝트 설정

node-gyp 설치:

npm install -g node-gyp

B. binding.gyp 파일 생성

{
  "targets": [
    {
      "target_name": "textHelper",
      "sources": ["src/textHelper.cc"],
      "include_dirs": ["<!(node -e \"require('node-addon-api').include\")"],
      "dependencies": ["<!(node -e \"require('node-addon-api').gyp\")"]
    }
  ]
}

C. C++ 소스 코드 예시 (src/textHelper.cc)

#include <napi.h>
#include <windows.h>

Napi::String GetSelectedText(const Napi::CallbackInfo& info) {
  Napi::Env env = info.Env();
  
  // Windows API를 이용한 텍스트 선택 감지 구현
  HWND hwnd = GetForegroundWindow();
  DWORD pid;
  GetWindowThreadProcessId(hwnd, &pid);
  
  // 실제 구현은 더 복잡해질 수 있음
  return Napi::String::New(env, "선택된 텍스트");
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
  exports.Set("getSelectedText", Napi::Function::New(env, GetSelectedText));
  return exports;
}

NODE_API_MODULE(textHelper, Init)

D. 빌드 및 사용

모듈 빌드:

node-gyp configure
node-gyp build

Electron에서 사용:

const nativeTextHelper = require('./build/Release/textHelper.node')
   
setInterval(() => {
  const text = nativeTextHelper.getSelectedText()
  // 처리 로직
}, 500)

4. 주의사항

중요 고려사항

  • 플랫폼 호환성:
    • Windows (.node, .dll)
    • macOS (.node, .dylib)
    • Linux (.node, .so)
  • 보안 위험:
    • 잘못 작성된 네이티브 코드는 크래시나 메모리 누수 발생 가능
    • 악성 코드 포함 가능성 있음
  • 빌드 복잡성:
    • 사용자 환경에 맞는 빌드 도구 필요 (Visual Studio, Xcode 등)
    • Electron 버전과 Node.js 버전 호환성 고려

5. 대안 접근 방법

네이티브 모듈 대체 방안

  1. 외부 프로세스 실행:
    const { exec } = require('child_process')
    exec('powershell -command "Get-Clipboard"', (err, stdout) => {
      // 클립보드 내용 처리
    })
  2. 기존 네이티브 모듈 활용:
    • iohook: 글로벌 키보드/마우스 이벤트 후킹
    • robotjs: 화면 픽셀 읽기 및 입력 제어
  3. WebAssembly 사용:성능이 중요한 알고리즘을 WASM으로 구현

결론: 네이티브 모듈은 강력한 기능을 제공하지만, 복잡성과 유지보수 비용이 높으므로 정말 필요한 경우에만 사용하는 것이 좋습니다. 특히 Electron 앱에서는 가능하면 순수 JavaScript/TypeScript 솔루션을 먼저 고려해보시길 권장합니다.

'프로그래머로의 여정' 카테고리의 다른 글

Ollama(올라마)  (0) 2025.05.13
RESTful API 이해하기  (0) 2025.05.13
시맨틱 태그(Semantic Tags)란  (0) 2025.05.05
html 의 meta tag  (0) 2025.04.24
브라우저 확장 프로그램(Browser Extension)  (0) 2025.04.24