블로그 | CTO 사무실

WebAssembly 컴포넌트 모델이란 무엇입니까?

오스카 스펜서 썸네일
오스카 스펜서
2025년 2월 12일 게시

WebAssembly, 줄여서 Wasm은 빠르고 네이티브에 가까운 실행 속도, 다양한 프로그래밍 언어 선택, 강력한 기본 거부 샌드박싱 모델 덕분에 획기적인 기술임을 거듭 입증했습니다. 이미 웹 전반에서 엄청나게 사용되었으며 서버 측에서도 강력한 역할을 했습니다.

새롭게 생겨나는 모든 생태계에는 모든 조각이 어떻게 조화를 이루는지에 대한 비전이 필요하며, 바로 여기서 WebAssembly 구성 요소 모델이 등장합니다. 구성 요소 모델은 WebAssembly 코드의 개별 단위 간 상호작용과 WebAssembly 코드와 호스트 환경 간의 상호작용을 용이하게 하는 시스템입니다. 이 모든 것은 기본적으로 인코딩된 데이터 유형을 포함하는 일반 Wasm 모듈인 WebAssembly 구성 요소의 개념을 중심으로 이루어집니다. 이러한 유형을 사용하면 구성 요소 간의 원활한 통신을 가능하게 하는 백그라운드 접착 코드를 생성할 수 있습니다.

컴포넌트 모델은 현대 소프트웨어 개발의 새로운 시대를 열었습니다. 개발자는 모든 프로그래밍 언어 생태계에서 컴포넌트를 골라서 단일 앱으로 구성할 수 있습니다. Python으로 데이터 처리 앱을 만들었지만 Rust에서 효율적인 파서가 필요하신가요? 괜찮아요. 귀하의 조직에서 한 팀은 Go에 능숙하지만 다른 팀은 JavaScript만 작성합니까? 전혀 문제 없습니다. 각 팀은 번거롭지 않게 WebAssembly 구성 요소를 제작할 수 있습니다.

기술적으로 필요한 이유

WebAssembly는 거의 모든 새로운 코드 실행 플랫폼에서 보았던 문제에 직면합니다. 즉, 완전히 다른 프로그래밍 언어 툴체인에서 생성될 수 있는 별도의 코드 단위 간에 데이터를 안전하고 보안적이며 효율적으로 공유하려면 어떻게 해야 할까요? 일반적으로 두 개의 별도 WebAssembly 모듈은 많은 시스템에서 하는 것과 동일한 작업을 수행할 수 있으며, JSON, Protobuf 또는 기타 대량 데이터 교환 형식으로 두 모듈 간에 데이터를 전달합니다. 이러한 형식을 직렬화하고 역직렬화하는 작업은 비용이 많이 들며, 결국 서로 통신하려는 두 모듈이 네트워크를 통해서가 아니라 동일한 런타임에서 나란히 실행될 가능성이 높기 때문에 이를 구현하는 것이 더 나을 수 있습니다.

문제는 각 프로그래밍 언어가 데이터를 표현하는 방식에 있습니다. 언어 구현에 따라 문자열에 대해 서로 다른 인코딩을 사용할 수 있으며, 한 언어는 순차적 데이터를 배열로 저장하는 것을 선호하는 반면, 다른 언어는 연결 목록을 선호할 수 있습니다. 서로 다른 언어의 코드가 서로 통신할 수 있도록 하려면 모든 유형의 데이터에 대한 공통 형식을 합의해야 합니다. 이것을 Application Binary Interface, 즉 ABI라고 합니다. 실제로는 그 중 어느 것도 동의하지 않습니다. 일반적으로 한 언어로 작성된 코드와 다른 언어로 작성된 코드 간에 통신할 수 있게 하려면, 불쌍한 개발자가 앉아서 조심스럽고 고통스럽게 두 언어 사이에서 번역할 코드를 작성해야 합니다. 두 언어의 작동 방식에 대한 깊은 지식이 필요하며, 매우 오류가 발생하기 쉽습니다. 일부 언어 생태계에서는 이를 자동으로 수행할 수 있는 도구를 만들어냈지만, 그마저도 일부 언어에만 적용됩니다.

다행히도 컴포넌트 모델은 모든 언어에 대한 공통 데이터 형식을 정의하는데, 이를 정식 ABI라고 합니다. 인간이 쉽게 사용할 수 있도록, 컴포넌트 인터페이스를 설명하는 WebAssembly Interface Types 또는 WIT라는 인터페이스 정의 언어도 있습니다.

WIT의 세계

자, 이제 우리는 이 모든 구성요소를 갖추었지만, 그것들을 어디에서 사용할 수 있는지 어떻게 알 수 있을까요? 결국 WebAssembly는 웹 브라우저, 서버, 엣지, 소형 기기 등 다양한 곳에서 실행되며, 모두 서로 다른 기능을 가지고 있습니다. WIT는 우리에게 세계 의 개념을 가져다줍니다. 월드는 구성 요소가 준수하는 인터페이스입니다. 즉, 구성 요소가 가져올 수 있는 함수 집합과 구성 요소가 내보내는 함수 집합입니다. 이를 통해 우리는 구성 요소에 대해 추론하고 구성 요소를 구성하는 방식을 비교적 쉽게 파악할 수 있습니다. 다음은 `wasi:cli/command` 세계에 있는 구성 요소의 정의로, 터미널 명령줄에서 실행되는 구성 요소를 설명합니다.

출처: https://github.com/WebAssembly/wasi-cli , 간결성을 위해 수정됨

이 구성 요소는 입출력을 위한 스트림을 갖는 동시에 파일 시스템과 무작위성과 같은 사항을 고려하지만, 더 중요한 점은 명령이 호출될 때 실행되는 함수를 제공한다는 것입니다.

세상은 누구나 정의할 수 있지만 HTTP 요청을 처리하고, USB 장치에 액세스하고, AI 모델을 사용할 수 있는 구성 요소에 대한 표준 추적 세상이 많이 있으며, 앞으로 더 많은 세상이 생길 것입니다. 호스트 환경은 개발자가 어떤 구성 요소가 작동하는지 쉽게 알 수 있도록 자신이 구현한 세계를 광고할 수 있습니다. 구성 요소는 구성 가능하므로 일부 세계를 다른 세계의 관점에서 구현하고 두 구성 요소를 구성하는 것도 가능합니다. 예를 들어, 소켓 세계를 구현하는 호스트 환경이 있지만 HTTP 세계에서 HTTP 요청을 만들고자 하는 구성 요소가 있는 경우 소켓을 사용하여 HTTP 세계를 구현하는 어댑터 구성 요소를 작성할 수 있습니다. 

간단한 구성으로 이제 귀하의 구성 요소는 아무런 수정 없이 소켓 환경에서 실행될 수 있습니다! 가능성은 무한합니다.

앞으로의 미래

컴포넌트 모델은 WebAssembly뿐만 아니라 모든 개발자에게 매우 중요한 의미를 갖습니다. 이는 개발자가 소프트웨어를 추론하고 개발하는 방식을 근본적으로 바꿀 것입니다. 이미 수많은 유틸리티가 있고 아직 초기 단계이기는 합니다. WebAssembly 생태계에서 일어나는 개발에 계속 주목하세요. 채택이 계속 증가함에 따라 점점 더 매력적인 사용 사례가 생겨날 것이 확실합니다.