Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

자주 묻는 질문(FAQ)

이 페이지에는 코어 WebAssembly, WebAssembly 컴포넌트(즉, 컴포넌트 모델) 및 WebAssembly 생태계 전반과 관련하여 자주 묻는 질문과 함께 혼동하기 쉬운 개념에 대한 설명이 정리되어 있습니다.

Q: WebAssembly에서 모듈과 컴포넌트의 차이점은 무엇입니까?

WebAssembly 모듈(더 정확히는 “WebAssembly 코어 모듈“이라고 합니다)은 WebAssembly 코어 명세를 준수하는 바이너리입니다.

WebAssembly 컴포넌트는 다음과 같습니다:

  • (WebAssembly 코어 바이너리 형식과 달리) 컴포넌트 모델 바이너리 형식을 준수합니다.
  • 타입 정보를 인코딩하기 위해 WebAssembly 인터페이스 타입 명세를 사용합니다.
  • 풍부한 타입과 코어 WebAssembly에 존재하는 타입 사이를 변환하기 위해 컴포넌트 모델 정규 ABI를 준수합니다.

WebAssembly 컴포넌트는 코어 모듈을 포함할 수 있으며 실제로 포함하는 경우가 많지만, 일반적으로 WebAssembly 코어 모듈은 컴포넌트를 포함할 수 없습니다. WebAssembly 컴포넌트와 WebAssembly 코어 모듈은 서로 다른 바이너리 형식을 가집니다.

WebAssembly 컴포넌트는 바이너리 형식과 텍스트 형식(“WAT”, WebAssembly 텍스트 형식) 모두로 표현할 수 있습니다.

Q: WebAssembly 바이너리가 컴포넌트인지 모듈인지 어떻게 구별할 수 있습니까?

WebAssembly 바이너리를 텍스트 형식으로 변환하고 나면(예: wasm-tools print 같은 도구 사용), WebAssembly 코어 모듈과 WebAssembly 컴포넌트를 쉽게 구별할 수 있습니다.

WebAssembly 코어 모듈은 일반적으로 최상위 (module) S-표현식으로 구성됩니다:

(module
  ;; ...
)

WebAssembly 컴포넌트는 일반적으로 (component) S-표현식으로 구성됩니다(중첩된 (core:module)/(component) S-표현식을 포함할 수도 있습니다):

(component
  ;; ...
)

Q: WebAssembly 컴포넌트와 WebAssembly 시스템 인터페이스(WASI)는 서로 어떤 관계입니까?

WebAssembly 코어 모듈은 사용 가능한 기본 요소를 사용하여 상위 수준 타입을 표현할 수 있지만, 모든 바이너리와 플랫폼이 각자 임시방편적인 방식으로 그렇게 할 수 있습니다. 컴포넌트 모델은 대부분의 고수준 언어에서 익숙한 풍부한 타입 집합에 대해 바이너리와 플랫폼 전반에서 일관된 표현을 제공합니다. WebAssembly 컴포넌트가 사용할 수 있는 풍부한 타입 집합을 WebAssembly 인터페이스 타입(WIT)이라고 합니다.

WebAssembly 시스템 인터페이스(WASI)는 WebAssembly 커뮤니티 그룹의 하위 그룹인 WASI 서브그룹이 궁극적인 표준화를 목표로 개발한 (WIT로 명세된) API 집합입니다. WASI는 시스템이나 플랫폼이 WebAssembly 컴포넌트에 노출할 수 있는 인터페이스, 함수, 타입을 정의합니다. 언뜻 보면 WASI의 많은 부분은 stdin, stdout, 파일 쓰기와 같이 프로그램에 대한 전통적인 기대에 부합한다는 점에서 UNIX와 유사합니다.

그러나 wasi:http처럼 일부 WASI 시스템 인터페이스는 명령줄보다 훨씬 높은 수준에서 동작합니다. wasi:http는 인터넷의 보편성과 웹을 플랫폼으로 삼는 WebAssembly 컴포넌트의 일반적인 사용 사례로 인해 표준화된 플랫폼으로 포함되었습니다.

WIT를 사용하면 플랫폼 구축자는 WebAssembly 컴포넌트가 접근하기를 기대하는 어떤 인터페이스든 정의할 수 있으며, WASI는 공유된 표준 추상화 집합 위에 인터페이스를 구축할 수 있게 해 줍니다.

Q: Preview 1, Preview 2, Preview 3이라는 용어를 자주 봅니다. 이 용어들은 무엇을 가리킵니까?

Preview 1은 WITX를 기반으로 했으며 현재는 더 이상 사용되지 않는 컴포넌트 모델의 첫 번째 버전을 가리킵니다. Preview 2는 WebAssembly 인터페이스 타입(WIT)을 사용하는 컴포넌트 모델의 더 새로운 버전을 가리킵니다. Preview 3(WASI 0.3, 2026년 6월 11일 릴리스)은 컴포넌트 모델에 네이티브 비동기를 추가합니다. 이제 async func, stream<T>, future<T>는 정규 ABI 프리미티브이며, wasi:io 패키지는 제거되었습니다. 개념적 기반은 비동기, 스트림, 퓨처를 참조하고, 기존 컴포넌트에서 무엇이 바뀌는지는 WASI 0.2에서 WASI 0.3으로 마이그레이션하기를 참조하십시오.

많은 프로그래밍 언어 툴체인이 Preview 1 컴포넌트만 네이티브로 지원할 수 있지만, Preview 1 컴포넌트는 Preview 2 컴포넌트로 자동으로 어댑트될 수 있으므로 실제로는 문제가 되지 않습니다.

다소 혼란스러울 수 있지만, WASI Preview 1 “컴포넌트“는 사실 WebAssembly 코어 모듈입니다. 더 정확히 말하면, Preview 1 “컴포넌트“는 명확하게 정의된 임포트 및 익스포트 집합을 갖춘 WebAssembly 코어 모듈입니다(레거시 명세).

Q: WASI 0.3이란 무엇입니까?

WASI 0.3은 2026년 6월 11일에 발표된 WASI의 최신 마일스톤 릴리스입니다. 이 릴리스는 컴포넌트 모델이 이번 릴리스를 위해 추가한 세 가지 새로운 정규 ABI 프리미티브인 async func, stream<T>, future<T> 위에 WASI의 인터페이스를 재구성합니다. wasi:io 패키지는 제거되었으며, 그 기능은 이제 컴포넌트 모델이 직접 제공합니다.

그 실질적인 효과로 WASI 인터페이스는 더 작아지고 합성하기가 더 쉬워졌습니다. wasi:http 핸들러는 응답을 반환하는 async func이고, stdin, stdout, stderr는 stream<u8>를 사용하며, 비동기 작업은 각 컴포넌트가 자체 이벤트 루프를 실행하지 않고도 컴포넌트 경계를 넘어 준비 상태를 전파합니다.

인터페이스별 변경 사항 개요는 WASI.dev의 WASI 0.3을 참조하십시오.

Q: WASI 0.2에서 WASI 0.3으로 마이그레이션해야 합니까?

당장은 아닙니다. WASI 0.3 런타임은 호스트 경계에서 0.2 임포트를 네이티브 0.3 프리미티브에 매핑하여 0.2를 폴리필할 수 있으며, Wasmtime의 wasmtime serve는 이미 동일한 바이너리에서 0.3 컴포넌트와 0.2 컴포넌트를 모두 실행하고 컴포넌트별로 디스패치합니다.

컴포넌트 경계를 넘는 합성 가능한 비동기 처리나 더 새로운 인터페이스 형태, 특히 wasi:http에서 아홉 개의 리소스를 두 개로 축소한 구조를 원한다면 마이그레이션하는 것이 적절합니다.

개념 매핑과 인터페이스별 주요 내용은 WASI 0.2에서 WASI 0.3으로 마이그레이션하기를 참조하십시오.

Q: wasi:io는 어떻게 되었습니까?

WASI 0.3은 wasi:io 패키지를 완전히 제거합니다. 이 패키지가 제공하던 리소스(pollable, input-stream, output-stream)는 각각 컴포넌트 모델의 네이티브 정규 ABI 프리미티브인 future<T>, stream<u8>, stream<u8>(함수 매개변수로 사용)로 대체됩니다.

그 동기는 이른바 샌드위치 문제였습니다. 비동기 준비 상태가 단일 컴포넌트 범위의 리소스로 표현되면, 그 준비 상태 신호가 컴포넌트 경계를 넘어 깔끔하게 전파될 수 없었습니다. 정규 ABI에 네이티브 비동기가 도입되면서 런타임이 스케줄링과 웨이크업 전파를 담당합니다.

기반 개념은 비동기, 스트림, 퓨처를 참조하십시오.

Q: 컴포넌트 임포트란 무엇입니까?

WebAssembly 컴포넌트는 자기 기술적(self-describing)입니다. 필요한 외부 기능(플랫폼이나 다른 컴포넌트가 제공해야 하는 기능)에 대한 정보가 바이너리에 포함되어 있습니다. 예를 들어, 외부 환경 변수가 필요할 수 있는 WebAssembly 컴포넌트는 wasi:cli/environment와 같은 WASI 인터페이스를 임포트할 수 있습니다.

Note

wasi:cli/environment 인터페이스가 제공하는 값이 호스트 머신의 환경 변수라는 보장은 없습니다. 이는 플랫폼이 노출하는 wasi:cli/environment 구현에서 플랫폼에 맡겨진 선택입니다.

예를 들어, 실제로 플랫폼은 민감한 환경 변수를 생략하거나 아예 아무것도 제공하지 않도록 선택할 수 있습니다.

임포트는 WIT로 가장 쉽게 설명할 수 있습니다.

package example-namespace:example-package;

world example-world {
    import wasi:cli/environment@0.2.4;
}

wasi:cli의 environment 인터페이스는 환경 변수와 상호 작용하기 위한 다양한 타입과 함수를 제공합니다.

이 컴포넌트는 wasi:cli/environment 인터페이스를 “임포트“한다고 하며, 그 안에서 사용 가능한 함수와 타입을 사용합니다.

Q: 컴포넌트 익스포트란 무엇입니까?

WebAssembly 컴포넌트는 자기 기술적입니다. 임포트와 함께, WebAssembly 컴포넌트는 자신이 익스포트하는 기능도 기술할 수 있으며, 컴포넌트의 호출자(예: 다른 컴포넌트나 WebAssembly 호스트)는 이를 참조할 수 있습니다.

익스포트는 WIT로 가장 쉽게 설명할 수 있습니다.

package example-namespace:example-package;

interface example-interface {
    say-hello: func(name: string) -> string;
}

world example-world {
    export example-interface;
}

위에서 정의한 example-world를 구현하는 컴포넌트의 경우, 호출자는 WebAssembly 바이너리에 example-namespace:example-package/example-interface 인터페이스를 통해 호출할 수 있는 say-hello 함수가 있을 것으로 기대할 수 있습니다.

이 컴포넌트는 example-interface 인터페이스를 “익스포트“한다고 하며, 이를 통해 그 안의 함수와 타입을 사용할 수 있게 합니다.

아직 궁금한 점이 있으십니까?

여러분의 질문(또는 여기에서 다루어야 한다고 생각하는 질문)을 GitHub 이슈로 등록하여 컴포넌트 북(Component Book)에 기여해 주십시오.


원문 © 2023 The Bytecode Alliance Contributors · WebAssembly Components Documentation · CC BY 4.0
Yeokja 한국어 번역·편집 · Anthropic 사의 claude-sonnet-5 모델을 활용하여 번역되었으며 학습을 모두 비허용한 상태로 작업하였습니다 · 이 번역은 원문을 수정한 문서이며 CC BY 4.0으로 제공합니다.