러스트(Rust)로 웹어셈블리(Wasm)를 빌드하여 HTML과 자바스크립트 환경에서 직접 호출하는 가장 표준적인 실전 예제입니다 [1.1].
이 실습은 2026년 현재 가장 널리 쓰이는 Wasm 빌드 도구인 wasm-pack을 사용하여 진행됩니다 [1.1].
---
🛠️ 1단계: 러스트 개발 환경 및 빌드 도구 준비
터미널을 열고 러스트 코드를 브라우저용 기계어 파일과 자바스크립트 로더로 자동 변환해 주는 wasm-pack을 설치합니다 [1.1].
```bash
# 1. Wasm 빌드 도구 전역 설치
cargo install wasm-pack
# 2. 새로운 러스트 라이브러리 프로젝트 생성
cargo new --lib my_wasm_app
cd my_wasm_app
```
---
⚙️ 2단계: Cargo.toml 설정 변경러스트 프로젝트의 설정 파일인 Cargo.toml을 열어, 이 프로젝트가 일반 프로그램이 아니라 파이썬이나 웹에 끼워 넣는 C-API 형태의 라이브러리(cdylib)임을 선언하고 관련 의존성을 주입합니다.
```toml
[package]
name = "my_wasm_app"
version = "0.1.0"
edition = "2021"
[lib]
# 웹어셈블리(Wasm) 자산으로 빌드하기 위해 필수적인 선언입니다.
crate-type = ["cdylib"]
[dependencies]
# 자바스크립트와 러스트의 국경(메모리 주소)을 연결해 주는 핵심 라이브러리
wasm-bindgen = "0.2"
```
---
📄 3단계: 러스트 코드 작성 (src/lib.rs)웹 브라우저에서 실행하고 싶은 고속 연산 함수를 작성합니다. 함수 상단에 #[wasm_bindgen] 매크로를 붙여주는 것이 핵심입니다 [1.1].
```rust
use wasm_bindgen::prelude::*;
// 자바스크립트 세계에서 호출할 수 있도록 국경 통역기를 설치합니다.
#[wasm_bindgen]
pub fn fast_add(a: i32, b: i32) -> i32 {
a + b
}
// 텍스트(문자열)를 처리하여 반환하는 함수 예시
#[wasm_bindgen]
pub fn greet_user(name: &str) -> String {
format!("안녕하세요, {}님! 러스트 Wasm의 세계에 오신 것을 환영합니다.", name)
}
```
🚀 4단계: .wasm 파일로 컴파일하기코드를 다 짰다면 터미널에 아래 명령어를 입력합니다 [1.1].
```bash
wasm-pack build --target web
```
---
* 결과: 빌드가 끝나면 프로젝트 루트에 pkg/라는 새로운 폴더가 자동 생성됩니다 [1.1]. 이 폴더 안에 브라우저가 읽을 기계어 파일(my_wasm_app_bg.wasm)과 이를 자바스크립트에서 편하게 다룰 수 있게 도와주는 통역 파일(my_wasm_app.js)이 함께 들어있습니다 [1.1].
---
🌐 5단계: 웹페이지에서 실행하기 (index.html)이제 pkg 폴더가 있는 자리에 index.html 파일을 만들고 아래 코드를 그대로 붙여넣습니다. 자바스크립트의 표준 모듈(import) 방식을 사용하여 Wasm 라이브러리를 가볍게 구독해 실행합니다 [1.1].
```html
Rust Wasm 실전 웹 앱
⚡ 러스트 웹어셈블리 가동 중
계산기 연산 결과 (i32)
계산 중...
텍스트 처리 결과
대기 중...
```
⚠️ 실행 시 주의사항 (로컬 보안 규정)
완성된 index.html 파일을 그냥 마우스로 더블 클릭해서 브라우저로 열면 보안 에러(CORS 정책 위반)가 나며 화면이 뜨지 않습니다. 브라우저 보안관들이 "로컬 파일 주소(file://)를 통해서 엉뚱한 기계어 파일(.wasm)을 함부로 메모리에 로드할 수 없다"며 규약을 작동시키기 때문입니다.
따라서 반드시 아주 가벼운 웹 서버를 띄워서 접속해야 합니다.
```bash
# 가장 간단한 임시 웹 서버 구동 방법 중 하나를 선택하세요:
# 방법 A: 파이썬이 깔려있다면 (추천)
python3 -m http.server 8080
# 방법 B: Node.js 인프라가 있다면
npx serve .
```
서버를 켠 뒤 브라우저 주소창에 http://localhost:8080을 치고 들어가면, 러스트로 짠 고속 엔진 코드가 자바스크립트의 방해 없이 브라우저 가상 감옥 안에서 완벽하게 작동하는 모습을 눈으로 확인할 수 있습니다 [1.1].
---
네, 100% 가능합니다! 질문자님이 설명하신 시나리오(인터넷에서 이미지를 받아 로컬 독립 공간에 보관하고 화면에 출력하는 것)는 현대 Wasm 앱의 가장 표준적인 작동 방식입니다.
특히 지적하신 대로, 독립 공간(IndexedDB 등)에 저장될 때는 PNG나 JPG 같은 파일 형태 그대로 저장될 수도 있고, 용량을 아끼거나 Wasm이 바로 읽을 수 있도록 원시 바이트(Raw Uint8Array 블롭) 형태로 압축되어 보관될 수도 있습니다.
러스트로 이미지 데이터를 다운로드받아 자바스크립트를 통해 화면에 그리는 핵심 흐름과 코드를 보여드릴게요.
---
🛠️ 1. 러스트 코드 작성 (src/lib.rs)
러스트는 이미지를 바이트 단위(Vec)로 넘겨받아, 브라우저가 화면에 이미지를 그릴 수 있도록 자바스크립트 측에 메모리 주소를 연결해 주는 역할을 합니다.
```rust
use wasm_bindgen::prelude::*;
// 자바스크립트의 console.log를 러스트 안에서 쓰기 위한 설정
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = console)]
fn log(s: &str);
}
#[wasm_bindgen]
pub struct ImageProcessor {
pixels: Vec,
}
#[wasm_bindgen]
impl ImageProcessor {
// 1. 자바스크립트가 다운로드받은 이미지 바이트 데이터를 러스트 내부 독립 공간으로 로드
#[wasm_bindgen(constructor)]
pub fn new(raw_bytes: &[u8]) -> ImageProcessor {
log("러스트: 이미지 바이트 데이터를 성공적으로 인계받았습니다!");
ImageProcessor {
pixels: raw_bytes.to_vec(),
}
}
// 2. 만약 Wasm 내부에서 이미지 필터(흑백 전환 등) 처리를 하고 싶다면 여기서 수행
pub fn make_grayscale(&mut self) {
// 픽셀 데이터(RGBA)를 직접 순수 C/Rust 속도로 고속 루프 연산
for chunk in self.pixels.chunks_exact_mut(4) {
let r = chunk[0] as f32;
let g = chunk[1] as f32;
let b = chunk[2] as f32;
// 평균값을 내어 흑백 처리
let gray = (r * 0.299 + g * 0.587 + b * 0.114) as u8;
chunk[0] = gray; // R
chunk[1] = gray; // G
chunk[2] = gray; // B
}
}
// 3. 자바스크립트가 이 메모리 주소를 복사 없이(Zero-copy) 읽어갈 수 있도록 포인터 반환
pub fn get_pixels_ptr(&self) -> *const u8 {
self.pixels.as_ptr()
}
pub fn get_pixels_size(&self) -> usize {
self.pixels.len()
}
}
```
---
🌐 2. 웹페이지 구성 (index.html)
자바스크립트는 인터넷에서 이미지를 fetch로 다운로드받아 가상 독립 공간에 Blob(원시 바이트) 형태로 잠시 보관한 뒤, Wasm 엔진에게 넘겨 처리하고 화면( 본 공간은 인공지능(AI)이 도출한 방대한 지식을 일목요연하게 큐레이션하여 기록하는 블로그입니다. 기술적 한계로 인해 모든 정보의 완벽한 정확성을 보장하기는 어려우므로, 최종적인 판단과 책임은 독자 본인에게 있음을 정중히 안내해 드립니다.
2026년 7월 21일 화요일
러스트(Rust)로 웹어셈블리(Wasm)를 빌드하여 HTML과 자바스크립트 환경에서 직접 호출하는 가장 표준적인 실전 예제입니다 [1.1].
database.py
import os from contextlib import contextmanager # contextmanager 임포트 from typing import Generator from dotenv...
-
bool atob(const char * string) { if (!strcmp(string, "true")) return true; return false; }
-
/// CXXXView.cpp void CXXXView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the ...
-
WxWidgets: http://www.wxwidgets.org/downloads/ MinGW: http://sourceforge.net/projects/mingw/files/ * Microsoft Windows Environment Var...