CRDT-RPC-WASM.md

๐Ÿก

๋ ˆํผ๋Ÿฐ์Šค CRDT: https://crdt.tech/
RPC: https://www.techtarget.com/searchapparchitecture/definition/Remote-Procedure-Call-RPC
WASM: https://developer.mozilla.org/en-US/docs/WebAssembly

| ๋ชฉํ‘œ | ์›น๊ฐœ๋ฐœ ๊ฐœ๋…๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž. | | -------- | --------------------------------------- | | ํ•™์Šต๋‚ด์šฉ | CRDT, RPC, WASM | | ๋‚œ์ด๋„ | ๐Ÿฅš๐Ÿฃ |

์žํˆฌ๋ฆฌ ๊ณต๋ถ€ ๐Ÿ‘‰ ๊ถ๊ธˆํ•ด์š”: CRDT, RPC, WASM

1. CRDT, Confilct-free Replicated Data Type

Conflict-free Replicated Data Type๋Š” ์ถฉ๋Œ์ด ์—†๋Š” ๋ณต์ œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

CRDT๋ž€?

๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ๊ณผ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ๋™์‹œ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜๊ณ  ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. CRDT๋Š” ๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๊ณ  ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์ง€์—ฐ, ํŒจํ‚ท ์†์‹ค, ๋…ธ๋“œ ์žฅ์•  ๋“ฑ์˜ ์ด์œ ๋กœ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

| ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์‹œ | ์„ค๋ช… | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | | ๋กœ์ปฌ ๋ฐ์ดํ„ฐ | ๋กœ์ปฌ ์žฅ์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ๋™์ผํ•œ ์‚ฌ์šฉ์ž์˜ ๋‹ค๋ฅธ ์žฅ์น˜์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ex) ์บ˜๋ฆฐ๋”, ๋ฉ”๋ชจ, ์—ฐ๋ฝ์ฒ˜ ๋˜๋Š” ์•Œ๋ฆผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ | | ์˜คํ”„๋ผ์ธ | ์ผ๋ถ€ ๋ณต์ œ๋ณธ์ด ์˜คํ”„๋ผ์ธ์ธ ๊ฒฝ์šฐ์—๋„ ์‹œ์Šคํ…œ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ๋ฐ์ดํ„ฐ์˜ ์—ฌ๋Ÿฌ ๋ณต์ œ๋ณธ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ | | ํ˜‘์—… ํˆด | ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋™์ผํ•œ ํŒŒ์ผ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ˜‘์—… ํˆด์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฌธ์ œ ex) Google Docs, Trello, Figma ๋“ฑ์˜ ํ˜‘์—… ์†Œํ”„ํŠธ์›จ์–ด | | ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ | ๊ธ€๋กœ๋ฒŒ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์—์„œ์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” |

๋ฐ์ดํ„ฐ ์ˆ˜์ •์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ณต์ œ ๋ฐฉ๋ฒ•

CRDT(Conflict-free Replicated Data Types)๋Š” ์ถฉ๋Œ ํ•ด๊ฒฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚™๊ด€์  ๋ณต์ œ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.ย CRDT๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ณต์ œ๋ณธ์—์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด ์ด๋ฃจ์–ด์ง€๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ ์ผ๊ด€๋œ ์ƒํƒœ๋กœ ๋ณ‘ํ•ฉ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.ย ์ด ๋ณ‘ํ•ฉ์€ ํŠน๋ณ„ํ•œ ์ถฉ๋Œ ํ•ด๊ฒฐ ์ฝ”๋“œ๋‚˜ ์‚ฌ์šฉ์ž ๊ฐœ์ž… ์—†์ด CRDT์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ผ๊ด€๋œ ๋ณต์ œ Strongly consistent replication์™€, ๋‚™๊ด€์  ๋ณต์ œ Optimistic replication์˜ ๋น„๊ตํ‘œ์ž…๋‹ˆ๋‹ค.

| | ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ผ๊ด€๋œ ๋ณต์ œ | ๋‚™๊ด€์  ๋ณต์ œ | | ----------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------ | | ์กฐ์ • ๋ฐ ์ˆ˜์ • ์‚ฌํ•ญ | ๋ณต์ œ๋ณธ์ด ์„œ๋กœ ์กฐ์ •ํ•˜์—ฌ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๊ฒฐ์ • | ์‚ฌ์šฉ์ž๊ฐ€ ๋ณต์ œ๋ณธ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ , ์ถฉ๋Œ์€ ํ†ต์‹  ์‹œ์— ํ•ด๊ฒฐ | | ์ผ๊ด€์„ฑ ๋ชจ๋ธ | ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ํŠธ๋žœ์žญ์…˜, ์„ ํ˜•ํ™” ๊ฐ€๋Šฅ์„ฑ ๋“ฑ์˜ ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ ๋ชจ๋ธ ์ง€์› | ์ถฉ๋Œ ํ•ด๊ฒฐ์„ ํ†ตํ•ด ์ผ๊ด€์„ฑ ์œ ์ง€ | | ์„ฑ๋Šฅ ์ €ํ•˜ | ์กฐ์ •์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ | ์„ฑ๋Šฅ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™” | | ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ•ด์ œ ๋™์•ˆ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ | ๋ณต์ œ๋ณธ์€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ•ด์ œ ๋™์•ˆ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ | ๋ณต์ œ๋ณธ์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•จ | | ์ถฉ๋Œ ์ฒ˜๋ฆฌ | - | ๋ณต์ œ๋ณธ ๊ฐ„ ์ถฉ๋Œ์€ ํ†ต์‹  ์‹œ์— ํ•ด๊ฒฐํ•ด์•ผ ํ•จ |

์ ‘๊ทผ ๋ฐฉ์‹๋ณ„ CRDT

| | ์ƒํƒœ ๊ธฐ๋ฐ˜ CRDT | ์—ฐ์‚ฐ ๊ธฐ๋ฐ˜ CRDT | | ----------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | ์ ‘๊ทผ ๋ฐฉ์‹ | ๊ฐ ๋ณต์ œ๋ณธ์€ ์ž์ฒด ์ƒํƒœ๋ฅผ ์œ ์ง€ / ์ƒํƒœ๋Š” ๋ณต์ œ๋ณธ ๊ฐ„์— ์ „ํŒŒ | ๊ฐ ๋ณต์ œ๋ณธ์€ ์กฐ์ž‘์— ๋Œ€ํ•œ ์—ฐ์‚ฐ ๋กœ๊ทธ๋ฅผ ์œ ์ง€ / ์—ฐ์‚ฐ ๋กœ๊ทธ๋Š” ๋ณต์ œ๋ณธ ๊ฐ„์— ๊ณต์œ  | | ๋กœ์ปฌ ์กฐ์ž‘ | ๋กœ์ปฌ ์กฐ์ž‘์€ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‹ค๋ฅธ ๋ณต์ œ๋ณธ์— ์ƒํƒœ๋ฅผ ์ „ํŒŒ | ๋กœ์ปฌ ์กฐ์ž‘์€ ์—ฐ์‚ฐ ๋กœ๊ทธ๋กœ ํ‘œํ˜„๋˜๋ฉฐ ์ด ๋กœ๊ทธ๋Š” ๋‹ค๋ฅธ ๋ณต์ œ๋ณธ๊ณผ ๊ณต์œ , ๋ณ‘ํ•ฉ | | ๋ฐ์ดํ„ฐ ์ „ํŒŒ | ๋ณ‘ํ•ฉ ์‹œ ์ถฉ๋Œํ•˜๋Š” ์ƒํƒœ๋Š” CRDT์˜ ์ถฉ๋Œ ํ•ด๊ฒฐ ๊ทœ์น™์— ๋”ฐ๋ผ ํ•ด๊ฒฐ | ๋ณ‘ํ•ฉ์—๋Š” ๋กœ๊ทธ์—์„œ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๊ณ  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ด ํฌํ•จ | | ๋™๊ธฐํ™” | ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ „ํŒŒ | ์—ฐ์‚ฐ ๋กœ๊ทธ ๋™๊ธฐํ™” | | ์žฅ์  | ํ˜„์žฌ ์ƒํƒœ๋งŒ ๊ณต์œ  / ๊ตฌํ˜„ ๊ฐ„๋‹จ, ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด ์ค„์–ด๋“ฆ | ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅ / ์‹คํ–‰ ์ทจ์†Œ, ๋‹ค์‹œ ์‹คํ–‰ ์ž‘์—…์„ ์ง€์› ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ตฌํ˜„์ด ๋” ์‰ฌ์›€ | | ๋‹จ์  | ๋ณ‘ํ•ฉ ๊ณผ์ •์—์„œ ์ค‘๊ฐ„ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š” | ์—ฐ์‚ฐ ๋กœ๊ทธ ๊ณต์œ ๋กœ ์ธํ•ด ๋” ๋งŽ์€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒ, ๋ณต์žกํ•œ ์ถฉ๋Œ ํ•ด๊ฒฐ ์ „๋žต์ด ํ•„์š” |


2. RPC, Remote Procedure Call

RPC๋ž€?

์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ Remote Procedure Call์€ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (์š”์ฒญ ํ”„๋กœ๊ทธ๋žจ์€ ํด๋ผ์ด์–ธํŠธ์ด๊ณ  ์„œ๋น„์Šค ์ œ๊ณต ํ”„๋กœ๊ทธ๋žจ์€ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.)

๋ถ„์‚ฐ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ๋กœ์ปฌ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์›๊ฒฉ ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœย function call **๋˜๋Š”ย **์„œ๋ธŒ๋ฃจํ‹ด ํ˜ธ์ถœ**ย subroutine call์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ RPC๋Š”ย ์›๊ฒฉ ํ”„๋กœ์‹œ์ €์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ์š”์ฒญ ํ”„๋กœ๊ทธ๋žจ์„ ์ผ์‹œ ์ค‘๋‹จํ•ด์•ผ ํ•˜๋Š”ย ๋™๊ธฐ ์ž‘์—…์ž…๋‹ˆ๋‹ค.ย ย ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ํ”„๋กœ์„ธ์Šค ๋˜๋Š”ย ์Šค๋ ˆ๋“œ๋ฅผย ์‚ฌ์šฉํ•˜๋ฉดย  ์—ฌ๋Ÿฌ RPC๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

| ์‚ฌ์šฉ ์˜ˆ์‹œ | ์„ค๋ช… | | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹  | RPC๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ. ํด๋ผ์ด์–ธํŠธ๋Š” ์›๊ฒฉ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋„๋ก ์š”์ฒญ | | ex) ๋กœ๊ทธ์ธ ์ธ์ฆ ๊ฒฐ๊ณผ ์š”์ฒญ | | ์›๊ฒฉ ์„œ๋ฒ„ ํ˜ธ์ถœ | ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›๊ฒฉ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒ„ โ‡’ ์„œ๋ฒ„์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ | | ex) ํŠน์ • ์ƒํ’ˆ์˜ ์ •๋ณด์š”์ฒญ | | ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ | ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉ, ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” RPC๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์„œ๋น„์Šค์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ณ  ์ž‘์—…์„ ์กฐ์ • | | ex) ๊ฒฐ์ œ ์‹œ์Šคํ…œ |


3. WASM, WebAssembly

WASM์ด๋ž€?

WASM์€ "WebAssembly"์˜ ์•ฝ์ž๋กœ, ์›น์—์„œ ์‹คํ–‰๋˜๋Š” ์ด์ง„ ํ˜•์‹์˜ ํฌํ„ฐ๋ธ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” JavaScript ์™ธ์˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. WASM์€ ์›น ํ”Œ๋žซํผ์—์„œ ๋†’์€ ์„ฑ๋Šฅ๊ณผ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

WASM์˜ ์žฅ์ 

| ์žฅ์  | ์„ค๋ช… | | -------------- | ------------------------------------------------------------------------------------------------------------ | | ์ด์‹์„ฑ | ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ WASM์œผ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰. | | ์„ฑ๋Šฅ | WASM์€ ํšจ์œจ์ ์ธ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๋ฏ€๋กœ ์›น์—์„œ ๋†’์€ ์„ฑ๋Šฅ์„ ์ œ๊ณต | | ๋ณด์•ˆ | ๊ฒฉ๋ฆฌ๋œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜์—ฌ ์›น ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์•…์„ฑ ์ฝ”๋“œ์˜ ์นจํˆฌ๋ฅผ ๋ฐฉ์ง€ | | ์›น ํ”Œ๋žซํผ ํ†ตํ•ฉ | WASM์€ ์›น ํ”Œ๋žซํผ์˜ ์ผ๋ถ€๋กœ ์ฑ„ํƒ๋˜์–ด ๋ชจ๋“  ์ฃผ์š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜๋ฉฐ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์˜ ์‹คํ–‰๊ณผ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅ |

WASM์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋†’์€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์›น์—์„œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

  1. WASM ๋ชจ๋“ˆ ์ปดํŒŒ์ผ

    • C, C++, Rust ๋“ฑ์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ WASM ํ˜•์‹์œผ๋กœ ์ปดํŒŒ์ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์–ธ์–ด์˜ ๋„๊ตฌ ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WASM ๋ชจ๋“ˆ ํŒŒ์ผ(.wasm)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. JavaScript์—์„œ WASM ๋ชจ๋“ˆ ๋กœ๋“œ

    • WebAssembly.instantiate() ๋˜๋Š” WebAssembly.instantiateStreaming() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WASM ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋“ค์€ WASM ๋ชจ๋“ˆ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๊ณ , JavaScript์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    // WASM ๋ชจ๋“ˆ ๋กœ๋“œ
    fetch("example.wasm") // WASM ๋ชจ๋“ˆ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ด
      .then((response) => response.arrayBuffer()) // ๋ฐฐ์—ด ๋ฒ„ํผ๋กœ ๋ณ€ํ™˜
      .then((buffer) => WebAssembly.instantiate(buffer)) // WASM ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
      .then((module) => {
        // WASM ๋ชจ๋“ˆ ์‹คํ–‰
        const result = module.instance.exports.myFunction(); // WASM ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
    
        console.log(result); // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
      })
      .catch((error) => {
        console.error("Error:", error);
      });
    
    • ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” fetch() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WASM ๋ชจ๋“ˆ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ, arrayBuffer()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด ๋ฒ„ํผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„, WebAssembly.instantiate() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ WASM ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ , ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.