네이티브 모듈(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. 대안 접근 방법
네이티브 모듈 대체 방안
- 외부 프로세스 실행:
const { exec } = require('child_process') exec('powershell -command "Get-Clipboard"', (err, stdout) => { // 클립보드 내용 처리 }) - 기존 네이티브 모듈 활용:
iohook: 글로벌 키보드/마우스 이벤트 후킹robotjs: 화면 픽셀 읽기 및 입력 제어
- 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 |