SharedArrayBuffer์ Atomics๋ฅผ ํ์ฉํ์ฌ ๊ธ๋ก๋ฒ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณ ์ฑ๋ฅ์ ์ค๋ ๋ ์์ JavaScript ๋์์ฑ ํธ๋ผ์ด๋ฅผ ๊ตฌ์ถํ๋ ์ฌ์ธต ๊ฐ์ด๋์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๋์์ฑ ๋ฌธ์ ๊ทน๋ณต ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
๋์์ฑ ๋ง์คํฐํ๊ธฐ: ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ JavaScript ์ค๋ ๋ ์์ ํธ๋ผ์ด ๊ตฌ์ถ
์ค๋๋ ๊ณผ ๊ฐ์ด ์ํธ ์ฐ๊ฒฐ๋ ์ธ์์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋๋ฟ๋ง ์๋๋ผ ์๋ต์ฑ๊ณผ ๋๊ท๋ชจ ๋์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฅ๋ ฅ์ ์๊ตฌํฉ๋๋ค. ์ ํต์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ์ผ๋ก ์๋ ค์ง JavaScript๋ ํฌ๊ฒ ๋ฐ์ ํ์ฌ ์ง์ ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ณธ ์์๋ค์ ์ ๊ณตํฉ๋๋ค. ํนํ ๋ค์ค ์ค๋ ๋ ์ปจํ ์คํธ์์ ํฌ๊ณ ๋์ ์ธ ๋ฐ์ดํฐ์ ์ ๋ค๋ฃฐ ๋ ๋์์ฑ ๋ฌธ์ ์ ์ง๋ฉดํ๋ ์ผ๋ฐ์ ์ธ ์๋ฃ ๊ตฌ์กฐ ์ค ํ๋๊ฐ ๋ฐ๋ก ํธ๋ผ์ด(Trie), ๋๋ ํ๋ฆฌํฝ์ค ํธ๋ฆฌ(Prefix Tree)๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ๊ฒ์ ๋๋ค.
์๋ฐฑ๋ง ๋ช
์ ์ฌ์ฉ์๋ ์ฅ์น๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๊ณ ์
๋ฐ์ดํธํ๋ ๊ธ๋ก๋ฒ ์๋ ์์ฑ ์๋น์ค, ์ค์๊ฐ ์ฌ์ ๋๋ ๋์ IP ๋ผ์ฐํ
ํ
์ด๋ธ์ ๊ตฌ์ถํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ํ์ค ํธ๋ผ์ด๋ ์ ๋์ฌ ๊ธฐ๋ฐ ๊ฒ์์๋ ๋งค์ฐ ํจ์จ์ ์ด์ง๋ง, ๋์์ฑ ํ๊ฒฝ์์๋ ๋น ๋ฅด๊ฒ ๋ณ๋ชฉ ํ์์ ์ผ์ผํค๋ฉฐ ๊ฒฝ์ ์กฐ๊ฑด๊ณผ ๋ฐ์ดํฐ ์์์ ์ทจ์ฝํด์ง๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ JavaScript ๋์์ฑ ํธ๋ผ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ๋ฉฐ, SharedArrayBuffer์ Atomics์ ํ๋ช
ํ ์ฌ์ฉ์ ํตํด ์ค๋ ๋ ์์ ์ฑ์ ํ๋ณดํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฃจ์
์ ๊ตฌํํ ์ ์๋๋ก ํฉ๋๋ค.
ํธ๋ผ์ด ์ดํดํ๊ธฐ: ์ ๋์ฌ ๊ธฐ๋ฐ ๋ฐ์ดํฐ์ ๊ธฐ์ด
๋์์ฑ์ ๋ณต์ก์ฑ์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ํธ๋ผ์ด๊ฐ ๋ฌด์์ด๋ฉฐ ์ ๊ทธ๋ ๊ฒ ๊ฐ์น ์๋์ง์ ๋ํ ํ์คํ ์ดํด๋ฅผ ๋ค์ ธ๋ด ์๋ค.
ํธ๋ผ์ด๋ ๋ฌด์์ธ๊ฐ?
ํธ๋ผ์ด(Trie)๋ 'retrieval'์ด๋ผ๋ ๋จ์ด์์ ํ์๋์์ผ๋ฉฐ("ํธ๋ฆฌ" ๋๋ "ํธ๋ผ์ด"๋ก ๋ฐ์), ์ฃผ๋ก ํค๊ฐ ๋ฌธ์์ด์ธ ๋์ ์งํฉ์ด๋ ์ฐ๊ด ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ๋ ฌ๋ ํธ๋ฆฌ ์๋ฃ ๊ตฌ์กฐ์ ๋๋ค. ๋ ธ๋๊ฐ ์ค์ ํค๋ฅผ ์ ์ฅํ๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ ๋ฌ๋ฆฌ, ํธ๋ผ์ด์ ๋ ธ๋๋ ํค์ ์ผ๋ถ๋ฅผ ์ ์ฅํ๋ฉฐ, ํธ๋ฆฌ์์ ๋ ธ๋์ ์์น๊ฐ ๊ทธ ๋ ธ๋์ ์ฐ๊ด๋ ํค๋ฅผ ์ ์ํฉ๋๋ค.
- ๋ ธ๋์ ์ฃ์ง: ๊ฐ ๋ ธ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ฃจํธ์์ ํน์ ๋ ธ๋๊น์ง์ ๊ฒฝ๋ก๋ ์ ๋์ฌ๋ฅผ ํ์ฑํฉ๋๋ค.
- ์์ ๋ ธ๋: ๊ฐ ๋ ธ๋๋ ์์ ๋ ธ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด๋ ๋ณดํต ๋ฐฐ์ด์ด๋ ๋งต ํํ์ ๋๋ค. ์ฌ๊ธฐ์ ์ธ๋ฑ์ค/ํค๋ ์ํ์ค์ ๋ค์ ๋ฌธ์์ ํด๋นํฉ๋๋ค.
- ์ข ๋จ ํ๋๊ทธ: ๋ ธ๋๋ ํด๋น ๋ ธ๋๊น์ง์ ๊ฒฝ๋ก๊ฐ ์์ ํ ๋จ์ด๋ฅผ ๋ํ๋์ ํ์ํ๊ธฐ ์ํด 'terminal' ๋๋ 'isWord' ํ๋๊ทธ๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
์ด ๊ตฌ์กฐ๋ ๋งค์ฐ ํจ์จ์ ์ธ ์ ๋์ฌ ๊ธฐ๋ฐ ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ํน์ ์ฌ์ฉ ์ฌ๋ก์์๋ ํด์ ํ ์ด๋ธ์ด๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ณด๋ค ์ฐ์ํฉ๋๋ค.
ํธ๋ผ์ด์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก
๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ํธ๋ผ์ด์ ํจ์จ์ฑ์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์์ ์ ๋๋ค:
-
์๋ ์์ฑ ๋ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ ์: ์๋ง๋ ๊ฐ์ฅ ์ ๋ช
ํ ์์ฉ ๋ถ์ผ์ผ ๊ฒ์
๋๋ค. ๊ตฌ๊ธ๊ณผ ๊ฐ์ ๊ฒ์ ์์ง, ์ฝ๋ ์๋ํฐ(IDE), ๋๋ ์
๋ ฅ ์ ์ ์์ ์ ๊ณตํ๋ ๋ฉ์์ง ์ฑ์ ์๊ฐํด ๋ณด์ธ์. ํธ๋ผ์ด๋ ์ฃผ์ด์ง ์ ๋์ฌ๋ก ์์ํ๋ ๋ชจ๋ ๋จ์ด๋ฅผ ์ ์ํ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
- ๊ธ๋ก๋ฒ ์์: ๊ตญ์ ์ ์ธ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์ํด ์์ญ ๊ฐ์ ์ธ์ด์ ๊ฑธ์ณ ์ค์๊ฐ์ผ๋ก ํ์งํ๋ ์๋ ์์ฑ ์ ์์ ์ ๊ณตํฉ๋๋ค.
-
๋ง์ถค๋ฒ ๊ฒ์ฌ๊ธฐ: ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ ์๋ ๋จ์ด ์ฌ์ ์ ์ ์ฅํจ์ผ๋ก์จ, ํธ๋ผ์ด๋ ๋จ์ด๊ฐ ์กด์ฌํ๋์ง ํจ์จ์ ์ผ๋ก ํ์ธํ๊ฑฐ๋ ์ ๋์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์์ ์ ์ํ ์ ์์ต๋๋ค.
- ๊ธ๋ก๋ฒ ์์: ๊ธ๋ก๋ฒ ์ฝํ ์ธ ์ ์ ๋๊ตฌ์์ ๋ค์ํ ์ธ์ด ์ ๋ ฅ์ ๋ํ ์ ํํ ๋ง์ถค๋ฒ์ ๋ณด์ฅํฉ๋๋ค.
-
IP ๋ผ์ฐํ
ํ
์ด๋ธ: ํธ๋ผ์ด๋ ์ต์ฅ ์ ๋์ฌ ์ผ์น(longest-prefix matching)์ ํ์ํ๋ฉฐ, ์ด๋ ๋คํธ์ํฌ ๋ผ์ฐํ
์์ IP ์ฃผ์์ ๋ํ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ๊ธฐ๋ณธ์ด ๋ฉ๋๋ค.
- ๊ธ๋ก๋ฒ ์์: ๋ฐฉ๋ํ ๊ตญ์ ๋คํธ์ํฌ ์ ๋ฐ์ ๊ฑธ์ณ ๋ฐ์ดํฐ ํจํท ๋ผ์ฐํ ์ ์ต์ ํํฉ๋๋ค.
-
์ฌ์ ๊ฒ์: ๋จ์ด์ ๊ทธ ์ ์๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํฉ๋๋ค.
- ๊ธ๋ก๋ฒ ์์: ์์ญ๋ง ๊ฐ์ ๋จ์ด์ ๊ฑธ์ณ ์ ์ํ ๊ฒ์์ ์ง์ํ๋ ๋ค๊ตญ์ด ์ฌ์ ์ ๊ตฌ์ถํฉ๋๋ค.
-
์๋ฌผ์ ๋ณดํ: ๊ธด ๋ฌธ์์ด์ด ํํ DNA ๋ฐ RNA ์์ด์์ ํจํด ๋งค์นญ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ธ๋ก๋ฒ ์์: ์ ์ธ๊ณ ์ฐ๊ตฌ ๊ธฐ๊ด์์ ์ ๊ณตํ๋ ๊ฒ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํฉ๋๋ค.
JavaScript์ ๋์์ฑ ๋ฌธ์
JavaScript๊ฐ ๋จ์ผ ์ค๋ ๋๋ผ๋ ํํ์ ์ฃผ๋ก ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ์ฃผ์ ์คํ ํ๊ฒฝ์์ ์ฌ์ค์ ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ JavaScript๋ ๋ณ๋ ฌ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ฉฐ, ์ด์ ํจ๊ป ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๊ณ ์ ์ ์ธ ๋ฌธ์ ๋ค์ ๋์ ํฉ๋๋ค.
JavaScript์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ (๊ทธ๋ฆฌ๊ณ ๊ทธ ํ๊ณ)
๋ฉ์ธ ์ค๋ ๋์ JavaScript ์์ง์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด ๋ชจ๋ธ์ ๊ต์ฐฉ ์ํ(deadlock)์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ์ฌ ์น ๊ฐ๋ฐ์ ๋ง์ ์ธก๋ฉด์ ๋จ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๊ฒฝ์ฐ UI ์๋ต์ฑ ์ ํ์ ์ข์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์น ์์ปค์ ๋ถ์: ๋ธ๋ผ์ฐ์ ์์์ ์ง์ ํ ๋์์ฑ
์น ์์ปค(Web Worker)๋ ์น ํ์ด์ง์ ๋ฉ์ธ ์คํ ์ค๋ ๋์ ๋ถ๋ฆฌ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ค๋ ์คํ๋๋ CPU ๋ฐ์ด๋ ์์
์ ์คํ๋ก๋ํ์ฌ UI์ ์๋ต์ฑ์ ์ ์งํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์ธ ์ค๋ ๋์ ์์ปค, ๋๋ ์์ปค๋ค ์ฌ์ด์์ ๋ฉ์์ง ์ ๋ฌ ๋ชจ๋ธ(postMessage())์ ์ฌ์ฉํ์ฌ ๊ณต์ ๋ฉ๋๋ค.
-
๋ฉ์์ง ์ ๋ฌ: ๋ฐ์ดํฐ๋ ์ค๋ ๋ ๊ฐ์ ์ ์ก๋ ๋ '๊ตฌ์กฐํ๋ ๋ณต์ '(structured clone, ๋ณต์ฌ)๋ฉ๋๋ค. ์์ ๋ฉ์์ง์ ๊ฒฝ์ฐ ์ด๋ ํจ์จ์ ์
๋๋ค. ๊ทธ๋ฌ๋ ์๋ฐฑ๋ง ๊ฐ์ ๋
ธ๋๋ฅผ ํฌํจํ ์ ์๋ ํธ๋ผ์ด์ ๊ฐ์ ๋๊ท๋ชจ ์๋ฃ ๊ตฌ์กฐ์ ๊ฒฝ์ฐ, ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ณต์ฌํ๋ ๊ฒ์ ์์ฒญ๋ ๋น์ฉ์ด ๋ค์ด ๋์์ฑ์ ์ด์ ์ ์์์ํต๋๋ค.
- ๊ณ ๋ ค ์ฌํญ: ํธ๋ผ์ด๊ฐ ์ฃผ์ ์ธ์ด์ ์ฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ค๋ฉด, ๋ชจ๋ ์์ปค ์ํธ ์์ฉ๋ง๋ค ์ด๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ ๋นํจ์จ์ ์ ๋๋ค.
๋ฌธ์ ์ : ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ณต์ ์ํ์ ๊ฒฝ์ ์กฐ๊ฑด
์ฌ๋ฌ ์ค๋ ๋(์น ์์ปค)๊ฐ ๋์ผํ ์๋ฃ ๊ตฌ์กฐ์ ์ ๊ทผํ๊ณ ์์ ํด์ผ ํ๊ณ , ๊ทธ ์๋ฃ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค๋ฉด ๊ฒฝ์ ์กฐ๊ฑด(race condition)์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ํธ๋ผ์ด๋ ๋ณธ์ง์ ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค: ๋จ์ด๊ฐ ์ฝ์ ๋๊ณ , ๊ฒ์๋๋ฉฐ, ๋๋ก๋ ์ญ์ ๋ฉ๋๋ค. ์ ์ ํ ๋๊ธฐํ ์์ด๋ ๋์ ์์ ์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค:
- ๋ฐ์ดํฐ ์์: ๋ ์์ปค๊ฐ ๋์์ ๊ฐ์ ๋ฌธ์์ ๋ํ ์ ๋ ธ๋๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํ๋ฉด ์๋ก์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฎ์ด์จ์ ๋ถ์์ ํ๊ฑฐ๋ ์๋ชป๋ ํธ๋ผ์ด๊ฐ ๋ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ ์๋ ์ฝ๊ธฐ: ์์ปค๊ฐ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ ํธ๋ผ์ด๋ฅผ ์ฝ์ด ์๋ชป๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ์ ๋ฐ์ดํธ ์์ค: ํ ์์ปค์ ์์ ์ฌํญ์ด ๋ค๋ฅธ ์์ปค๊ฐ ์ฒซ ๋ฒ์งธ ๋ณ๊ฒฝ์ ์ธ์งํ์ง ์๊ณ ๋ฎ์ด์ฐ๋ฉด ์์ ํ ์์ค๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ํ์ค ๊ฐ์ฒด ๊ธฐ๋ฐ JavaScript ํธ๋ผ์ด๊ฐ ๋จ์ผ ์ค๋ ๋ ์ปจํ ์คํธ์์๋ ๊ธฐ๋ฅํ์ง๋ง, ์น ์์ปค ๊ฐ์ ์ง์ ๊ณต์ ํ๊ณ ์์ ํ๊ธฐ์๋ ์ ๋์ ์ผ๋ก ๋ถ์ ํฉํ ์ด์ ์ ๋๋ค. ํด๊ฒฐ์ฑ ์ ๋ช ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์์์ ์ฐ์ฐ์ ์์ต๋๋ค.
์ค๋ ๋ ์์ ์ฑ ํ๋ณด: JavaScript์ ๋์์ฑ ํ๋ฆฌ๋ฏธํฐ๋ธ
๋ฉ์์ง ์ ๋ฌ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ์ง์ ํ ์ค๋ ๋ ์์ ๊ณต์ ์ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด JavaScript๋ ๊ฐ๋ ฅํ ์ ์์ค ํ๋ฆฌ๋ฏธํฐ๋ธ์ธ SharedArrayBuffer์ Atomics๋ฅผ ๋์
ํ์ต๋๋ค.
SharedArrayBuffer ์๊ฐ
SharedArrayBuffer๋ ArrayBuffer์ ์ ์ฌํ ๊ณ ์ ๊ธธ์ด์ ์์ ์ด์ง ๋ฐ์ดํฐ ๋ฒํผ์ด์ง๋ง, ๊ฒฐ์ ์ ์ธ ์ฐจ์ด์ ์ด ์์ต๋๋ค: ๊ทธ ๋ด์ฉ์ ์ฌ๋ฌ ์น ์์ปค ๊ฐ์ ๊ณต์ ๋ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋์ , ์์ปค๋ค์ ๋์ผํ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ํฌ๊ณ ๋ณต์กํ ์๋ฃ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ ์ ์ก ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ:
SharedArrayBuffer๋ ์ง์ ๋ ๋ชจ๋ ์น ์์ปค๊ฐ ์ฝ๊ณ ์ธ ์ ์๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋ค. - ๋ณต์ ์์:
SharedArrayBuffer๋ฅผ ์น ์์ปค์ ์ ๋ฌํ๋ฉด, ์ฌ๋ณธ์ด ์๋ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋ฉ๋๋ค. - ๋ณด์ ๊ณ ๋ ค ์ฌํญ: ์ ์ฌ์ ์ธ ์คํํฐ(Spectre) ์คํ์ผ ๊ณต๊ฒฉ์ผ๋ก ์ธํด
SharedArrayBuffer์๋ ํน์ ๋ณด์ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค. ์น ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก Cross-Origin-Opener-Policy (COOP) ๋ฐ Cross-Origin-Embedder-Policy (COEP) HTTP ํค๋๋ฅผsame-origin๋๋credentialless๋ก ์ค์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์๋ฒ ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํด์ผ ํ๋ฏ๋ก ์ด๋ ๊ธ๋ก๋ฒ ๋ฐฐํฌ์ ์์ด ์ค์ํ ์ ์ ๋๋ค. Node.js ํ๊ฒฝ(worker_threads์ฌ์ฉ)์๋ ์ด๋ฌํ ๋ธ๋ผ์ฐ์ ํน์ ์ ํ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ SharedArrayBuffer๋ง์ผ๋ก๋ ๊ฒฝ์ ์กฐ๊ฑด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ์ ๊ณตํ์ง๋ง ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
Atomics์ ํ
Atomics๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์์์ ์ฐ์ฐ์ ์ ๊ณตํ๋ ์ ์ญ ๊ฐ์ฒด์
๋๋ค. '์์์ (Atomic)'์ด๋ ํด๋น ์ฐ์ฐ์ด ๋ค๋ฅธ ์ด๋ค ์ค๋ ๋์ ์ํด ์ค๋จ๋์ง ์๊ณ ์์ ํ ์๋ฃ๋๋ ๊ฒ์ด ๋ณด์ฅ๋๋ค๋ ์๋ฏธ์
๋๋ค. ์ด๋ ์ฌ๋ฌ ์์ปค๊ฐ SharedArrayBuffer ๋ด์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ๊ทผํ ๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋์์ฑ ํธ๋ผ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ ์ฃผ์ Atomics ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
Atomics.load(typedArray, index):SharedArrayBuffer๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋TypedArray์ ์ง์ ๋ ์ธ๋ฑ์ค์์ ๊ฐ์ ์์์ ์ผ๋ก ๋ก๋ํฉ๋๋ค.- ์ฌ์ฉ๋ฒ: ๋ ธ๋ ์์ฑ(์: ์์ ํฌ์ธํฐ, ๋ฌธ์ ์ฝ๋, ์ข ๋จ ํ๋๊ทธ)์ ๊ฐ์ญ ์์ด ์ฝ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
-
Atomics.store(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์ ์์์ ์ผ๋ก ์ ์ฅํฉ๋๋ค.- ์ฌ์ฉ๋ฒ: ์๋ก์ด ๋ ธ๋ ์์ฑ์ ์ฐ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
-
Atomics.add(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ธฐ์กด ๊ฐ์ ๊ฐ์ ์์์ ์ผ๋ก ๋ํ๊ณ ์ด์ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์นด์ดํฐ(์: ์ฐธ์กฐ ์นด์ดํธ ๋๋ '๋ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์' ํฌ์ธํฐ ์ฆ๊ฐ)์ ์ ์ฉํฉ๋๋ค. -
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue): ์ด๊ฒ์ ์๋ง๋ ๋์์ฑ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ํ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์์์ ์ฐ์ฐ์ผ ๊ฒ์ ๋๋ค.index์ ๊ฐ์ดexpectedValue์ ์ผ์นํ๋์ง ์์์ ์ผ๋ก ํ์ธํฉ๋๋ค. ์ผ์นํ๋ฉด ๊ฐ์replacementValue๋ก ๊ต์ฒดํ๊ณ ์ด์ ๊ฐ(์ฆ,expectedValue)์ ๋ฐํํฉ๋๋ค. ์ผ์นํ์ง ์์ผ๋ฉด ๋ณ๊ฒฝ์ด ์ผ์ด๋์ง ์๊ณindex์ ์ค์ ๊ฐ์ ๋ฐํํฉ๋๋ค.- ์ฌ์ฉ๋ฒ: ๋ฝ(์คํ๋ฝ ๋๋ ๋ฎคํ ์ค) ๊ตฌํ, ๋๊ด์ ๋์์ฑ, ๋๋ ์์ ์ด ์์๋ ์ํ์์๋ง ๋ฐ์ํ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ์ ๋ ธ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ํฌ์ธํฐ๋ฅผ ์์ ํ๊ฒ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
-
Atomics.wait(typedArray, index, value, [timeout])์Atomics.notify(typedArray, index, [count]): ์ด๋ ๋ ๊ณ ๊ธ ๋๊ธฐํ ํจํด์ ์ฌ์ฉ๋๋ฉฐ, ์์ปค๊ฐ ํน์ ์กฐ๊ฑด์ ์ฐจ๋จํ๊ณ ๊ธฐ๋ค๋ฆฐ ๋ค์, ๋ณ๊ฒฝ๋ ๋ ์๋ฆผ์ ๋ฐ์ ์ ์๊ฒ ํฉ๋๋ค. ์์ฐ์-์๋น์ ํจํด์ด๋ ๋ณต์กํ ๋ฝํน ๋ฉ์ปค๋์ฆ์ ์ ์ฉํฉ๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ํ SharedArrayBuffer์ ๋๊ธฐํ๋ฅผ ์ํ Atomics์ ์๋์ง๋ JavaScript์์ ์ฐ๋ฆฌ์ ๋์์ฑ ํธ๋ผ์ด์ ๊ฐ์ ๋ณต์กํ๊ณ ์ค๋ ๋ ์์ ํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค.
SharedArrayBuffer์ Atomics๋ฅผ ์ด์ฉํ ๋์์ฑ ํธ๋ผ์ด ์ค๊ณ
๋์์ฑ ํธ๋ผ์ด๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋จ์ํ ๊ฐ์ฒด ์งํฅ ํธ๋ผ์ด๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ณํํ๋ ๊ฒ์ด ์๋๋๋ค. ์ด๋ ๋ ธ๋๊ฐ ํํ๋๋ ๋ฐฉ์๊ณผ ์์ ์ด ๋๊ธฐํ๋๋ ๋ฐฉ์์ ๋ํ ๊ทผ๋ณธ์ ์ธ ๋ณํ๋ฅผ ์๊ตฌํฉ๋๋ค.
์ํคํ ์ฒ ๊ณ ๋ ค ์ฌํญ
SharedArrayBuffer์์ ํธ๋ผ์ด ๊ตฌ์กฐ ํํํ๊ธฐ
์ง์ ์ ์ธ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง JavaScript ๊ฐ์ฒด ๋์ , ์ฐ๋ฆฌ ํธ๋ผ์ด ๋
ธ๋๋ SharedArrayBuffer ๋ด์ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ผ๋ก ํํ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค:
- ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น: ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ผ
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๊ณ ์ ํฌ๊ธฐ์ '์ฌ๋กฏ' ๋๋ 'ํ์ด์ง'์ ํฐ ๋ฐฐ์ด๋ก ๊ฐ์ฃผํฉ๋๋ค. ๊ฐ ์ฌ๋กฏ์ ํธ๋ผ์ด ๋ ธ๋๋ฅผ ๋ํ๋ ๋๋ค. - ์ธ๋ฑ์ค๋ก์์ ๋
ธ๋ ํฌ์ธํฐ: ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ๋์ , ์์ ํฌ์ธํฐ๋ ๋์ผํ
SharedArrayBuffer๋ด์ ๋ค๋ฅธ ๋ ธ๋์ ์์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ์ซ์ ์ธ๋ฑ์ค๊ฐ ๋ฉ๋๋ค. - ๊ณ ์ ํฌ๊ธฐ ๋ ธ๋: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ๊ฐ ํธ๋ผ์ด ๋ ธ๋๋ ๋ฏธ๋ฆฌ ์ ์๋ ๋ฐ์ดํธ ์๋ฅผ ์ฐจ์งํฉ๋๋ค. ์ด ๊ณ ์ ํฌ๊ธฐ๋ ๋ฌธ์, ์์ ํฌ์ธํฐ ๋ฐ ์ข ๋จ ํ๋๊ทธ๋ฅผ ์์ฉํฉ๋๋ค.
SharedArrayBuffer ๋ด์ ๋จ์ํ๋ ๋
ธ๋ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํด ๋ด
์๋ค. ๊ฐ ๋
ธ๋๋ ์ ์ ๋ฐฐ์ด(์: SharedArrayBuffer์ ๋ํ Int32Array ๋๋ Uint32Array ๋ทฐ)์ผ ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์:
- ์ธ๋ฑ์ค 0: `characterCode` (์ด ๋ ธ๋๊ฐ ๋ํ๋ด๋ ๋ฌธ์์ ASCII/์ ๋์ฝ๋ ๊ฐ, ๋๋ ๋ฃจํธ์ ๊ฒฝ์ฐ 0).
- ์ธ๋ฑ์ค 1: `isTerminal` (false๋ 0, true๋ 1).
- ์ธ๋ฑ์ค 2์์ N๊น์ง: `children[0...25]` (๋๋ ๋ ๋์ ๋ฌธ์ ์งํฉ์ ์ํด ๋ ๋ง์ด), ๊ฐ ๊ฐ์
SharedArrayBuffer๋ด์ ์์ ๋ ธ๋์ ๋ํ ์ธ๋ฑ์ค์ด๋ฉฐ, ํด๋น ๋ฌธ์์ ๋ํ ์์์ด ์์ผ๋ฉด 0์ ๋๋ค. - ๋ฒํผ ์ด๋๊ฐ์ (๋๋ ์ธ๋ถ์์ ๊ด๋ฆฌ๋๋) ์ ๋ ธ๋๋ฅผ ํ ๋นํ๊ธฐ ์ํ `nextFreeNodeIndex` ํฌ์ธํฐ.
์: ๋
ธ๋๊ฐ 30๊ฐ์ `Int32` ์ฌ๋กฏ์ ์ฐจ์งํ๊ณ ์ฐ๋ฆฌ SharedArrayBuffer๊ฐ `Int32Array`๋ก ๋ณด์ฌ์ง๋ค๋ฉด, ์ธ๋ฑ์ค `i`์ ๋
ธ๋๋ `i * 30`์์ ์์ํฉ๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ๊ด๋ฆฌ
์ ๋
ธ๋๊ฐ ์ฝ์
๋ ๋ ๊ณต๊ฐ์ ํ ๋นํด์ผ ํฉ๋๋ค. ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ SharedArrayBuffer์์ ๋ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋น ์ฌ๋กฏ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์งํ๋ ๊ฒ์
๋๋ค. ์ด ํฌ์ธํฐ ์์ฒด๋ ์์์ ์ผ๋ก ์
๋ฐ์ดํธ๋์ด์ผ ํฉ๋๋ค.
์ค๋ ๋ ์์ ์ฝ์ ๊ตฌํ (`insert` ์ฐ์ฐ)
์ฝ์
์ ํธ๋ผ์ด ๊ตฌ์กฐ๋ฅผ ์์ ํ๊ณ , ์ ์ฌ์ ์ผ๋ก ์ ๋
ธ๋๋ฅผ ์์ฑํ๋ฉฐ, ํฌ์ธํฐ๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋ณต์กํ ์ฐ์ฐ์
๋๋ค. ์ฌ๊ธฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด Atomics.compareExchange()๊ฐ ์ค์ํด์ง๋๋ค.
"apple"๊ณผ ๊ฐ์ ๋จ์ด๋ฅผ ์ฝ์ ํ๋ ๋จ๊ณ๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค:
์ค๋ ๋ ์์ ์ฝ์ ์ ์ํ ๊ฐ๋ ์ ๋จ๊ณ:
- ๋ฃจํธ์์ ์์: ๋ฃจํธ ๋ ธ๋(์ธ๋ฑ์ค 0)์์ ์ํ๋ฅผ ์์ํฉ๋๋ค. ๋ฃจํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฒด์ ์ผ๋ก ๋ฌธ์๋ฅผ ๋ํ๋ด์ง ์์ต๋๋ค.
-
๋ฌธ์๋ณ ์ํ: ๋จ์ด์ ๊ฐ ๋ฌธ์(์: 'a', 'p', 'p', 'l', 'e')์ ๋ํด:
- ์์ ์ธ๋ฑ์ค ๊ฒฐ์ : ํ์ฌ ๋ ธ๋์ ์์ ํฌ์ธํฐ ๋ด์์ ํ์ฌ ๋ฌธ์์ ํด๋นํ๋ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํฉ๋๋ค. (์: `children[char.charCodeAt(0) - 'a'.charCodeAt(0)]`).
-
์์ ํฌ์ธํฐ ์์์ ์ผ๋ก ๋ก๋:
Atomics.load(typedArray, current_node_child_pointer_index)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ธ ์์ ๋ ธ๋์ ์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค. -
์์ ์กด์ฌ ์ฌ๋ถ ํ์ธ:
-
๋ก๋๋ ์์ ํฌ์ธํฐ๊ฐ 0์ด๋ฉด(์์์ด ์กด์ฌํ์ง ์์): ์ฌ๊ธฐ์ ์ ๋
ธ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
- ์ ๋ ธ๋ ์ธ๋ฑ์ค ํ ๋น: ์ ๋ ธ๋์ ๋ํ ๊ณ ์ ํ ์ ์ธ๋ฑ์ค๋ฅผ ์์์ ์ผ๋ก ์ป์ต๋๋ค. ์ด๋ ๋ณดํต '๋ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ ธ๋' ์นด์ดํฐ์ ์์์ ์ฆ๊ฐ๋ฅผ ํฌํจํฉ๋๋ค(์: `newNodeIndex = Atomics.add(typedArray, NEXT_FREE_NODE_INDEX_OFFSET, NODE_SIZE)`). ๋ฐํ๋ ๊ฐ์ ์ฆ๊ฐํ๊ธฐ ์ ์ *์ด์ * ๊ฐ์ด๋ฉฐ, ์ด๊ฒ์ด ์ฐ๋ฆฌ ์ ๋ ธ๋์ ์์ ์ฃผ์์ ๋๋ค.
- ์ ๋ ธ๋ ์ด๊ธฐํ: ์๋ก ํ ๋น๋ ๋ ธ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ `Atomics.store()`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ์ฝ๋์ `isTerminal = 0`์ ์๋๋ค.
- ์ ๋
ธ๋ ์ฐ๊ฒฐ ์๋: ์ด๊ฒ์ด ์ค๋ ๋ ์์ ์ ์ํ ์ค์ํ ๋จ๊ณ์
๋๋ค.
Atomics.compareExchange(typedArray, current_node_child_pointer_index, 0, newNodeIndex)๋ฅผ ์ฌ์ฉํฉ๋๋ค.compareExchange๊ฐ 0์ ๋ฐํํ๋ฉด(์ฆ, ์ฐ๋ฆฌ๊ฐ ์ฐ๊ฒฐ์ ์๋ํ์ ๋ ์์ ํฌ์ธํฐ๊ฐ ์ ๋ง 0์ด์์), ์ฐ๋ฆฌ ์ ๋ ธ๋๋ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ ๋ ธ๋๋ฅผ `current_node`๋ก ํ์ฌ ์งํํฉ๋๋ค.compareExchange๊ฐ 0์ด ์๋ ๊ฐ์ ๋ฐํํ๋ฉด(์ฆ, ๋ค๋ฅธ ์์ปค๊ฐ ๊ทธ ์ฌ์ด์ ์ด ๋ฌธ์์ ๋ํ ๋ ธ๋๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐํ์), ์ถฉ๋์ด ๋ฐ์ํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์๋ก ์์ฑํ ๋ ธ๋๋ฅผ *ํ๊ธฐ*ํ๊ณ (๋๋ ํ์ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ํ๋ฆฌ ๋ฆฌ์คํธ์ ๋ค์ ์ถ๊ฐํ๊ณ ) ๋์compareExchange๊ฐ ๋ฐํํ ์ธ๋ฑ์ค๋ฅผ `current_node`๋ก ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํจ๊ณผ์ ์ผ๋ก ๊ฒฝ์์์ '์ง๊ณ ' ์น์๊ฐ ๋ง๋ ๋ ธ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ก๋๋ ์์ ํฌ์ธํฐ๊ฐ 0์ด ์๋๋ฉด(์์์ด ์ด๋ฏธ ์กด์ฌํจ): `current_node`๋ฅผ ๋ก๋๋ ์์ ์ธ๋ฑ์ค๋ก ์ค์ ํ๊ณ ๋ค์ ๋ฌธ์๋ก ๊ณ์ ์งํํฉ๋๋ค.
-
๋ก๋๋ ์์ ํฌ์ธํฐ๊ฐ 0์ด๋ฉด(์์์ด ์กด์ฌํ์ง ์์): ์ฌ๊ธฐ์ ์ ๋
ธ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
-
์ข
๋จ์ผ๋ก ํ์: ๋ชจ๋ ๋ฌธ์๊ฐ ์ฒ๋ฆฌ๋๋ฉด, ์ต์ข
๋
ธ๋์ `isTerminal` ํ๋๊ทธ๋ฅผ
Atomics.store()๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ผ๋ก 1๋ก ์ค์ ํฉ๋๋ค.
Atomics.compareExchange()๋ฅผ ์ฌ์ฉํ ์ด ๋๊ด์ ๋ฝํน ์ ๋ต์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ช
์์ ์ธ ๋ฎคํ
์ค(Atomics.wait/notify๋ก ๊ตฌ์ถ ๊ฐ๋ฅ)๋ฅผ ์ฌ์ฉํ๋ ๋์ , ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ณ๊ฒฝ์ ์๋ํ๊ณ ์ถฉ๋์ด ๊ฐ์ง๋ ๊ฒฝ์ฐ์๋ง ๋กค๋ฐฑํ๊ฑฐ๋ ์ ์ํ๋ฏ๋ก ๋ง์ ๋์์ฑ ์๋๋ฆฌ์ค์์ ํจ์จ์ ์
๋๋ค.
์ฝ์ ์ ์ํ ์์(๋จ์ํ๋) ์์ฌ ์ฝ๋:
const NODE_SIZE = 30; // ์: ๋ฉํ๋ฐ์ดํฐ 2 + ์์ 28
const CHARACTER_CODE_OFFSET = 0;
const IS_TERMINAL_OFFSET = 1;
const CHILDREN_OFFSET = 2;
const NEXT_FREE_NODE_INDEX_OFFSET = 0; // ๋ฒํผ ๋งจ ์ฒ์์ ์ ์ฅ๋จ
// 'sharedBuffer'๊ฐ SharedArrayBuffer์ ๋ํ Int32Array ๋ทฐ๋ผ๊ณ ๊ฐ์
function insertWord(word, sharedBuffer) {
let currentNodeIndex = NODE_SIZE; // ๋ฃจํธ ๋
ธ๋๋ ํ๋ฆฌ ํฌ์ธํฐ ๋ค์์ ์์
for (let i = 0; i < word.length; i++) {
const charCode = word.charCodeAt(i);
const childIndexInNode = charCode - 'a'.charCodeAt(0) + CHILDREN_OFFSET;
const childPointerOffset = currentNodeIndex + childIndexInNode;
let nextNodeIndex = Atomics.load(sharedBuffer, childPointerOffset);
if (nextNodeIndex === 0) {
// ์์์ด ์์ผ๋ฏ๋ก ์์ฑ ์๋
const allocatedNodeIndex = Atomics.add(sharedBuffer, NEXT_FREE_NODE_INDEX_OFFSET, NODE_SIZE);
// ์ ๋
ธ๋ ์ด๊ธฐํ
Atomics.store(sharedBuffer, allocatedNodeIndex + CHARACTER_CODE_OFFSET, charCode);
Atomics.store(sharedBuffer, allocatedNodeIndex + IS_TERMINAL_OFFSET, 0);
// ๋ชจ๋ ์์ ํฌ์ธํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 0
for (let k = 0; k < NODE_SIZE - CHILDREN_OFFSET; k++) {
Atomics.store(sharedBuffer, allocatedNodeIndex + CHILDREN_OFFSET + k, 0);
}
// ์ ๋
ธ๋๋ฅผ ์์์ ์ผ๋ก ์ฐ๊ฒฐ ์๋
const actualOldValue = Atomics.compareExchange(sharedBuffer, childPointerOffset, 0, allocatedNodeIndex);
if (actualOldValue === 0) {
// ๋
ธ๋ ์ฐ๊ฒฐ ์ฑ๊ณต, ์งํ
nextNodeIndex = allocatedNodeIndex;
} else {
// ๋ค๋ฅธ ์์ปค๊ฐ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ์ผ๋ฏ๋ก ๊ทธ๋ค์ ๊ฒ์ ์ฌ์ฉ. ์ฐ๋ฆฌ ํ ๋น ๋
ธ๋๋ ์ด์ ์ฌ์ฉ๋์ง ์์.
// ์ค์ ์์คํ
์์๋ ์ฌ๊ธฐ์ ํ๋ฆฌ ๋ฆฌ์คํธ๋ฅผ ๋ ๊ฒฌ๊ณ ํ๊ฒ ๊ด๋ฆฌํด์ผ ํจ.
// ๋จ์ํ๋ฅผ ์ํด ์น์์ ๋
ธ๋๋ฅผ ์ฌ์ฉ.
nextNodeIndex = actualOldValue;
}
}
currentNodeIndex = nextNodeIndex;
}
// ์ต์ข
๋
ธ๋๋ฅผ ์ข
๋จ์ผ๋ก ํ์
Atomics.store(sharedBuffer, currentNodeIndex + IS_TERMINAL_OFFSET, 1);
}
์ค๋ ๋ ์์ ๊ฒ์ ๊ตฌํ (`search` ๋ฐ `startsWith` ์ฐ์ฐ)
๋จ์ด๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ์ฃผ์ด์ง ์ ๋์ฌ๋ฅผ ๊ฐ์ง ๋ชจ๋ ๋จ์ด๋ฅผ ์ฐพ๋ ๊ฒ๊ณผ ๊ฐ์ ์ฝ๊ธฐ ์ฐ์ฐ์ ๊ตฌ์กฐ๋ฅผ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ ์ฐ๊ธฐ๋ก๋ถํฐ ๋ถ๋ถ์ ์ธ ์ฝ๊ธฐ๋ฅผ ํผํ๊ธฐ ์ํด ์ผ๊ด๋๊ณ ์ต์ ๊ฐ์ ์ฝ๋๋ก ์์์ ๋ก๋๋ฅผ ๊ณ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ค๋ ๋ ์์ ๊ฒ์์ ์ํ ๊ฐ๋ ์ ๋จ๊ณ:
- ๋ฃจํธ์์ ์์: ๋ฃจํธ ๋ ธ๋์์ ์์ํฉ๋๋ค.
-
๋ฌธ์๋ณ ์ํ: ๊ฒ์ ์ ๋์ฌ์ ๊ฐ ๋ฌธ์์ ๋ํด:
- ์์ ์ธ๋ฑ์ค ๊ฒฐ์ : ๋ฌธ์์ ๋ํ ์์ ํฌ์ธํฐ ์คํ์ ์ ๊ณ์ฐํฉ๋๋ค.
- ์์ ํฌ์ธํฐ ์์์ ์ผ๋ก ๋ก๋:
Atomics.load(typedArray, current_node_child_pointer_index)๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ์์ ์กด์ฌ ์ฌ๋ถ ํ์ธ: ๋ก๋๋ ํฌ์ธํฐ๊ฐ 0์ด๋ฉด ๋จ์ด/์ ๋์ฌ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ์ข ๋ฃํฉ๋๋ค.
- ์์์ผ๋ก ์ด๋: ์กด์ฌํ๋ฉด `current_node`๋ฅผ ๋ก๋๋ ์์ ์ธ๋ฑ์ค๋ก ์ ๋ฐ์ดํธํ๊ณ ๊ณ์ํฉ๋๋ค.
- ์ต์ข ํ์ธ (`search`์ ๊ฒฝ์ฐ): ์ ์ฒด ๋จ์ด๋ฅผ ์ํํ ํ, ์ต์ข ๋ ธ๋์ `isTerminal` ํ๋๊ทธ๋ฅผ ์์์ ์ผ๋ก ๋ก๋ํฉ๋๋ค. 1์ด๋ฉด ๋จ์ด๊ฐ ์กด์ฌํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ฅ ์ ๋์ฌ์ ๋๋ค.
- `startsWith`์ ๊ฒฝ์ฐ: ๋๋ฌํ ์ต์ข ๋ ธ๋๋ ์ ๋์ฌ์ ๋์ ๋ํ๋ ๋๋ค. ์ด ๋ ธ๋์์ ๊น์ด ์ฐ์ ํ์(DFS) ๋๋ ๋๋น ์ฐ์ ํ์(BFS)์ ์์ํ์ฌ(์์์ ๋ก๋ ์ฌ์ฉ) ํ์ ํธ๋ฆฌ์ ๋ชจ๋ ์ข ๋จ ๋ ธ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์ฝ๊ธฐ ์์ ์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ์ ์์์ ์ผ๋ก ์ ๊ทผํ๋ ํ ๋ณธ์ง์ ์ผ๋ก ์์ ํฉ๋๋ค. ์ฐ๊ธฐ ์ค `compareExchange` ๋ก์ง์ ์ ํจํ์ง ์์ ํฌ์ธํฐ๊ฐ ์ค์ ๋์ง ์๋๋ก ๋ณด์ฅํ๋ฉฐ, ์ฐ๊ธฐ ์ค ๋ฐ์ํ๋ ๋ชจ๋ ๊ฒฝ์์ ์ผ๊ด๋ (ํ ์์ปค์๊ฒ๋ ์ฝ๊ฐ ์ง์ฐ๋ ์ ์์ง๋ง) ์ํ๋ก ์ด์ด์ง๋๋ค.
๊ฒ์์ ์ํ ์์(๋จ์ํ๋) ์์ฌ ์ฝ๋:
function searchWord(word, sharedBuffer) {
let currentNodeIndex = NODE_SIZE;
for (let i = 0; i < word.length; i++) {
const charCode = word.charCodeAt(i);
const childIndexInNode = charCode - 'a'.charCodeAt(0) + CHILDREN_OFFSET;
const childPointerOffset = currentNodeIndex + childIndexInNode;
const nextNodeIndex = Atomics.load(sharedBuffer, childPointerOffset);
if (nextNodeIndex === 0) {
return false; // ๋ฌธ์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์
}
currentNodeIndex = nextNodeIndex;
}
// ์ต์ข
๋
ธ๋๊ฐ ์ข
๋จ ๋จ์ด์ธ์ง ํ์ธ
return Atomics.load(sharedBuffer, currentNodeIndex + IS_TERMINAL_OFFSET) === 1;
}
์ค๋ ๋ ์์ ์ญ์ ๊ตฌํ (๊ณ ๊ธ)
์ญ์ ๋ ๋์์ฑ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ๊ฒฝ์์ ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค. ์์งํ ์ญ์ ๋ ๋ค์์ ์ด๋ํ ์ ์์ต๋๋ค:
- ๋๊ธ๋ง ํฌ์ธํฐ: ํ ์์ปค๊ฐ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ ๋์ ๋ค๋ฅธ ์์ปค๊ฐ ๊ทธ ๋ ธ๋๋ก ์ํ ์ค์ด๋ผ๋ฉด, ์ํ ์ค์ธ ์์ปค๋ ์ ํจํ์ง ์์ ํฌ์ธํฐ๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ ์๋ ์ํ: ๋ถ๋ถ์ ์ธ ์ญ์ ๋ ํธ๋ผ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํ๋ก ๋จ๊ธธ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋จํธํ: ์ญ์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ํ์ํ๋ ๊ฒ์ ๋ณต์กํฉ๋๋ค.
์ญ์ ๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ์ผ๋ฐ์ ์ธ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ ผ๋ฆฌ์ ์ญ์ (ํ์): ๋ ธ๋๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ๊ฑฐํ๋ ๋์ , `isDeleted` ํ๋๊ทธ๋ฅผ ์์์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋์์ฑ์ ๋จ์ํํ์ง๋ง ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ฐธ์กฐ ์นด์ดํ / ๊ฐ๋น์ง ์ปฌ๋ ์ : ๊ฐ ๋ ธ๋๋ ์์์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ๋ ธ๋์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ผ๋ก ๋จ์ด์ง๋ฉด, ์ค์ ๋ก ์ ๊ฑฐ ๋์์ด ๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค(์: ํ๋ฆฌ ๋ฆฌ์คํธ์ ์ถ๊ฐ). ์ด ๋ํ ์ฐธ์กฐ ์นด์ดํธ์ ๋ํ ์์์ ์ ๋ฐ์ดํธ๊ฐ ํ์ํฉ๋๋ค.
- Read-Copy-Update (RCU): ์ฝ๊ธฐ ๋น๋๊ฐ ๋งค์ฐ ๋๊ณ ์ฐ๊ธฐ ๋น๋๊ฐ ๋ฎ์ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ, ์ฐ๊ธฐ ์์ ์๋ ํธ๋ผ์ด์ ์์ ๋ ๋ถ๋ถ์ ๋ํ ์ ๋ฒ์ ์ ์์ฑํ๊ณ , ์๋ฃ๋๋ฉด ์ ๋ฒ์ ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์์์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ต๋๋ค. ์ฝ๊ธฐ ์์ ์ ๊ต์ฒด๊ฐ ์๋ฃ๋ ๋๊น์ง ์ด์ ๋ฒ์ ์์ ๊ณ์๋ฉ๋๋ค. ์ด๋ ํธ๋ผ์ด์ ๊ฐ์ ์ธ๋ถํ๋ ์๋ฃ ๊ตฌ์กฐ์ ๊ตฌํํ๊ธฐ ๋ณต์กํ์ง๋ง ๊ฐ๋ ฅํ ์ผ๊ด์ฑ ๋ณด์ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ง์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ , ํนํ ๋์ ์ฒ๋ฆฌ๋์ด ์๊ตฌ๋๋ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ํธ๋ผ์ด๋ฅผ ์ถ๊ฐ ์ ์ฉ(append-only)์ผ๋ก ๋ง๋ค๊ฑฐ๋ ๋ ผ๋ฆฌ์ ์ญ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ฉ๋ชจ๋ฆฌ ํ์๋ฅผ ๋ ์ค์ํ ์๊ฐ์ผ๋ก ๋ฏธ๋ฃจ๊ฑฐ๋ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ง์ ์ผ๋ก ํจ์จ์ ์ด๊ณ ์์์ ์ธ ๋ฌผ๋ฆฌ์ ์ญ์ ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋์์ฑ ์๋ฃ ๊ตฌ์กฐ ๋ถ์ผ์์ ์ฐ๊ตฌ ์์ค์ ๋ฌธ์ ์ ๋๋ค.
์ค์ฉ์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ์ฑ๋ฅ
๋์์ฑ ํธ๋ผ์ด๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ ํ์ฑ๋ฟ๋ง ์๋๋ผ ์ค์ฉ์ ์ธ ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ดํ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐ ์ค๋ฒํค๋
-
`SharedArrayBuffer` ์ด๊ธฐํ: ๋ฒํผ๋ ์ถฉ๋ถํ ํฌ๊ธฐ๋ก ๋ฏธ๋ฆฌ ํ ๋น๋์ด์ผ ํฉ๋๋ค. ์ต๋ ๋
ธ๋ ์์ ๊ณ ์ ํฌ๊ธฐ๋ฅผ ์ถ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
SharedArrayBuffer์ ๋์ ํฌ๊ธฐ ์กฐ์ ์ ๊ฐ๋จํ์ง ์์ผ๋ฉฐ ์ข ์ข ๋ ํฐ ์ ๋ฒํผ๋ฅผ ๋ง๋ค๊ณ ๋ด์ฉ์ ๋ณต์ฌํด์ผ ํ๋ฏ๋ก, ์ฐ์์ ์ธ ์์ ์ ์ํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ชฉ์ ์ ๋ฌด์ํ๊ฒ ํฉ๋๋ค. - ๊ณต๊ฐ ํจ์จ์ฑ: ๊ณ ์ ํฌ๊ธฐ ๋ ธ๋๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํฌ์ธํฐ ์ฐ์ฐ์ ๋จ์ํํ์ง๋ง, ๋ง์ ๋ ธ๋๊ฐ ํฌ์ํ ์์ ์งํฉ์ ๊ฐ์ง ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ์ด๋ ๋จ์ํ๋ ๋์์ฑ ๊ด๋ฆฌ๋ฅผ ์ํ ์ ์ถฉ์์ ๋๋ค.
-
์๋ ๊ฐ๋น์ง ์ปฌ๋ ์
:
SharedArrayBuffer๋ด์๋ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์์ต๋๋ค. ์ญ์ ๋ ๋ ธ๋์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋จํธํ๋ฅผ ํผํ๊ธฐ ์ํด ์ข ์ข ํ๋ฆฌ ๋ฆฌ์คํธ๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ์๋นํ ๋ณต์ก์ฑ์ ๋ํฉ๋๋ค.
์ฑ๋ฅ ๋ฒค์น๋งํน
์ธ์ ๋์์ฑ ํธ๋ผ์ด๋ฅผ ์ ํํด์ผ ํ ๊น์? ๋ชจ๋ ์ํฉ์ ๋ํ ๋ง๋ฅ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค.
- ๋จ์ผ ์ค๋ ๋ vs. ๋ค์ค ์ค๋ ๋: ์์ ๋ฐ์ดํฐ์ ์ด๋ ๋ฎ์ ๋์์ฑ ํ๊ฒฝ์์๋ ์น ์์ปค ํต์ ์ค์ ๋ฐ ์์์ ์ฐ์ฐ์ ์ค๋ฒํค๋ ๋๋ฌธ์ ๋ฉ์ธ ์ค๋ ๋์ ํ์ค ๊ฐ์ฒด ๊ธฐ๋ฐ ํธ๋ผ์ด๊ฐ ์ฌ์ ํ ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค.
- ๋์ ๋์ ์ฐ๊ธฐ/์ฝ๊ธฐ ์์ : ๋์์ฑ ํธ๋ผ์ด๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ , ๋์ ์์ ๋์ ์ฐ๊ธฐ ์์ (์ฝ์ , ์ญ์ ) ๋ฐ ๋ง์ ๋์ ์ฝ๊ธฐ ์์ (๊ฒ์, ์ ๋์ฌ ์กฐํ)์ด ์์ ๋ ๋น์ ๋ฐํฉ๋๋ค. ์ด๋ ๋ฉ์ธ ์ค๋ ๋์์ ๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ ์คํ๋ก๋ํฉ๋๋ค.
- `Atomics` ์ค๋ฒํค๋: ์์์ ์ฐ์ฐ์ ์ ํ์ฑ์ ์ํด ํ์์ ์ด์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋น์์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ณด๋ค ๋๋ฆฝ๋๋ค. ์ด์ ์ ๊ฐ๋ณ ์์ ์ ์๋๊ฐ ์๋๋ผ ์ฌ๋ฌ ์ฝ์ด์์์ ๋ณ๋ ฌ ์คํ์์ ๋์ต๋๋ค. ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ฒค์น๋งํน์ ๋ณ๋ ฌ ์๋ ํฅ์์ด ์์์ ์ค๋ฒํค๋๋ฅผ ๋ฅ๊ฐํ๋์ง ํ๋จํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๊ฒฌ๊ณ ์ฑ
๋์์ฑ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ ๋ช ์ด ๋์ต๋๋ค. ๊ฒฝ์ ์กฐ๊ฑด์ ํ์ ํ๊ธฐ ์ด๋ ต๊ณ ๋น๊ฒฐ์ ์ ์ผ ์ ์์ต๋๋ค. ๋ง์ ๋์ ์์ปค๋ฅผ ์ฌ์ฉํ ์คํธ๋ ์ค ํ ์คํธ๋ฅผ ํฌํจํ ํฌ๊ด์ ์ธ ํ ์คํธ๊ฐ ํ์์ ์ ๋๋ค.
- ์ฌ์๋: `compareExchange`์ ๊ฐ์ ์์ ์ด ์คํจํ๋ ๊ฒ์ ๋ค๋ฅธ ์์ปค๊ฐ ๋จผ์ ๋์ฐฉํ์์ ์๋ฏธํฉ๋๋ค. ๋ก์ง์ ์ฝ์ ์์ฌ ์ฝ๋์์ ๋ณด์ฌ์ค ๊ฒ์ฒ๋ผ ์ฌ์๋ํ๊ฑฐ๋ ์ ์ํ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํฉ๋๋ค.
- ํ์์์: ๋ ๋ณต์กํ ๋๊ธฐํ์์ `Atomics.wait`๋ `notify`๊ฐ ๋์ฐฉํ์ง ์์ ๊ฒฝ์ฐ ๊ต์ฐฉ ์ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์์์์ ๊ฐ์ง ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฐ ํ๊ฒฝ ์ง์
-
์น ์์ปค: ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js(
worker_threads)์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค. -
`SharedArrayBuffer` & `Atomics`: ๋ชจ๋ ์ฃผ์ ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js์์ ์ง์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ๊ธํ๋ฏ์ด, ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ๋ณด์ ๋ฌธ์ ๋ก ์ธํด
SharedArrayBuffer๋ฅผ ํ์ฑํํ๋ ค๋ฉด ํน์ HTTP ํค๋(COOP/COEP)๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ์ ์ธ๊ณ๋ฅผ ๋์์ผ๋ก ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํ ๋ฐฐํฌ ์ธ๋ถ ์ฌํญ์ ๋๋ค.- ๊ธ๋ก๋ฒ ์ํฅ: ์ ์ธ๊ณ์ ์๋ฒ ์ธํ๋ผ๊ฐ ์ด๋ฌํ ํค๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์กํ๋๋ก ๊ตฌ์ฑ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ธ๋ก๋ฒ ์ํฅ
JavaScript์์ ์ค๋ ๋ ์์ ํ๊ณ ๋์์ฑ ์๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ ์ ์๋ ๋ฅ๋ ฅ์ ํนํ ์ ์ธ๊ณ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ๋ฐฉ๋ํ ์์ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๊ฐ๋ฅ์ฑ์ ์ธ๊ณ๋ฅผ ์ด์ด์ค๋๋ค.
- ๊ธ๋ก๋ฒ ๊ฒ์ ๋ฐ ์๋ ์์ฑ ํ๋ซํผ: ๊ตญ์ ๊ฒ์ ์์ง์ด๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ด ๋ค์ํ ์ธ์ด์ ๋ฌธ์ ์งํฉ์ ๊ฑธ์ณ ์ ํ ์ด๋ฆ, ์์น ๋ฐ ์ฌ์ฉ์ ์ฟผ๋ฆฌ์ ๋ํ ์ด๊ณ ์ ์ค์๊ฐ ์๋ ์์ฑ ์ ์์ ์ ๊ณตํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์น ์์ปค์ ๋์์ฑ ํธ๋ผ์ด๋ ๋ฉ์ธ UI ์ค๋ ๋๋ฅผ ์ง์ฐ์ํค์ง ์๊ณ ๋๊ท๋ชจ ๋์ ์ฟผ๋ฆฌ ๋ฐ ๋์ ์ ๋ฐ์ดํธ(์: ์ ์ ํ, ์ธ๊ธฐ ๊ฒ์์ด)๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ถ์ฐ ์์ค๋ก๋ถํฐ์ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ๋ค๋ฅธ ๋๋ฅ์ ์ผ์์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ IoT ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ค์ํ ๊ฑฐ๋์์์ ์์ฅ ๋ฐ์ดํฐ ํผ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธ์ต ์์คํ ์ ๊ฒฝ์ฐ, ๋์์ฑ ํธ๋ผ์ด๋ ๋ฌธ์์ด ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ(์: ์ฅ์น ID, ์ฃผ์ ํฐ์ปค)์ ์ฆ์ ํจ์จ์ ์ผ๋ก ์ธ๋ฑ์ฑํ๊ณ ์ฟผ๋ฆฌํ ์ ์์ด ์ฌ๋ฌ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ด ๊ณต์ ๋ฐ์ดํฐ์์ ๋ณ๋ ฌ๋ก ์์ ํ ์ ์์ต๋๋ค.
- ํ์ ํธ์ง ๋ฐ IDE: ์จ๋ผ์ธ ํ์ ๋ฌธ์ ํธ์ง๊ธฐ๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ IDE์์ ๊ณต์ ํธ๋ผ์ด๋ ์ค์๊ฐ ๊ตฌ๋ฌธ ๊ฒ์ฌ, ์ฝ๋ ์์ฑ ๋๋ ๋ง์ถค๋ฒ ๊ฒ์ฌ๋ฅผ ์ง์ํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์๊ฐ๋์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ง๋ค ๋ ์ฆ์ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๊ณต์ ํธ๋ผ์ด๋ ๋ชจ๋ ํ์ฑ ํธ์ง ์ธ์ ์ ์ผ๊ด๋ ๋ทฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๊ฒ์ ๋ฐ ์๋ฎฌ๋ ์ด์ : ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์ ๊ฒฝ์ฐ, ๋์์ฑ ํธ๋ผ์ด๋ ๊ฒ์ ๋ด ์ฌ์ ์กฐํ(๋จ์ด ๊ฒ์์ฉ), ํ๋ ์ด์ด ์ด๋ฆ ์ธ๋ฑ์ค ๋๋ ๊ณต์ ์ธ๊ณ ์ํ์ AI ๊ฒฝ๋ก ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ์ฌ ๋ชจ๋ ๊ฒ์ ์ค๋ ๋๊ฐ ์๋ต์ฑ ์๋ ๊ฒ์ ํ๋ ์ด๋ฅผ ์ํด ์ผ๊ด๋ ์ ๋ณด๋ก ์๋ํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ๊ณ ์ฑ๋ฅ ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ : ์ข ์ข ์ ๋ฌธ ํ๋์จ์ด๋ ์ ์์ค ์ธ์ด๋ก ์ฒ๋ฆฌ๋์ง๋ง, JavaScript ๊ธฐ๋ฐ ์๋ฒ(Node.js)๋ ๋์์ฑ ํธ๋ผ์ด๋ฅผ ํ์ฉํ์ฌ ๋์ ๋ผ์ฐํ ํ ์ด๋ธ์ด๋ ํ๋กํ ์ฝ ๊ตฌ๋ฌธ ๋ถ์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ํนํ ์ ์ฐ์ฑ๊ณผ ์ ์ํ ๋ฐฐํฌ๊ฐ ์ฐ์ ์๋๋ ํ๊ฒฝ์์ ๊ทธ๋ ์ต๋๋ค.
์ด๋ฌํ ์๋ค์ ๊ณ์ฐ ์ง์ฝ์ ์ธ ๋ฌธ์์ด ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํ๋ฉด์ ๋์์ฑ ํธ๋ผ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๊ฒ์ด ๊ธ๋ก๋ฒ ์๊ตฌ์ ์ง๋ฉดํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ๊ณผ ํ์ฅ์ฑ์ ์ด๋ป๊ฒ ๊ทน์ ์ผ๋ก ํฅ์์ํฌ ์ ์๋์ง๋ฅผ ๊ฐ์กฐํฉ๋๋ค.
JavaScript ๋์์ฑ์ ๋ฏธ๋
JavaScript ๋์์ฑ์ ํ๊ฒฝ์ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค:
-
WebAssembly์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ: WebAssembly ๋ชจ๋๋
SharedArrayBuffer์์ ์๋ํ ์ ์์ผ๋ฉฐ, ์ข ์ข CPU ๋ฐ์ด๋ ์์ ์ ๋ํด ํจ์ฌ ๋ ์ธ๋ถํ๋ ์ ์ด์ ์ ์ฌ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฉด์๋ JavaScript ์น ์์ปค์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค. - JavaScript ํ๋ฆฌ๋ฏธํฐ๋ธ์ ์ถ๊ฐ ๋ฐ์ : ECMAScript ํ์ค์ ๋์์ฑ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๊ณ์ ํ์ํ๊ณ ๊ฐ์ ํ์ฌ ์ผ๋ฐ์ ์ธ ๋์์ฑ ํจํด์ ๋จ์ํํ๋ ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ ์ฌ์ ์ผ๋ก ์ ๊ณตํ ๊ฒ์ ๋๋ค.
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ: ์ด๋ฌํ ์ ์์ค ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์ฑ์ํจ์ ๋ฐ๋ผ
SharedArrayBuffer์Atomics์ ๋ณต์ก์ฑ์ ์ถ์ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ ๊ฒ์ผ๋ก ์์๋๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ๊น์ ์ง์ ์์ด๋ ๋์์ฑ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋ฐ์ ์ ์์ฉํจ์ผ๋ก์จ JavaScript ๊ฐ๋ฐ์๋ค์ ๊ฐ๋ฅํ ๊ฒ์ ๊ฒฝ๊ณ๋ฅผ ๋ํ๊ณ , ์ ์ธ๊ณ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ์ธ์์ ์๊ตฌ์ ๋ถ์ํ ์ ์๋ ๊ณ ์ฑ๋ฅ์ ์๋ต์ฑ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๊ธฐ๋ณธ ํธ๋ผ์ด์์ ์์ ํ ์ค๋ ๋ ์์ ๋์์ฑ ํธ๋ผ์ด๋ก์ ์ฌ์ ์ JavaScript์ ๋๋ผ์ด ๋ฐ์ ๊ณผ ์ด์ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํ๋ ํ์ ์ฆ๋ช
ํฉ๋๋ค. SharedArrayBuffer์ Atomics๋ฅผ ํ์ฉํ์ฌ ์ฐ๋ฆฌ๋ ๋จ์ผ ์ค๋ ๋ ๋ชจ๋ธ์ ํ๊ณ๋ฅผ ๋์ด ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ณ ์ฑ๋ฅ์ผ๋ก ๋ณต์กํ ๋์ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์๋ ์ด๋ ค์์ด ๋ฐ๋ฆ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์, ์์์ ์ฐ์ฐ ์์, ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ์ ์คํ ๊ณ ๋ ค๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฌ๊ณ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฌธ์์ด ๋ฐ์ดํฐ์ ์ ๋ค๋ฃจ๊ณ ๊ธ๋ก๋ฒ ๊ท๋ชจ์ ์๋ต์ฑ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ๋์์ฑ ํธ๋ผ์ด๋ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๋ค์ด ์ฐจ์ธ๋ ๊ณ ๋๋ก ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ํธ์์ฉ์ ์ด๋ฉฐ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ํ์ ์ค์ด์ฃผ๋ฉฐ, ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์๋ฌด๋ฆฌ ๋ณต์กํด์ง๋๋ผ๋ ์ฌ์ฉ์ ๊ฒฝํ์ด ์ํํ๊ฒ ์ ์ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค. JavaScript ๋์์ฑ์ ๋ฏธ๋๋ ์ฌ๊ธฐ์ ์์ผ๋ฉฐ, ๋์์ฑ ํธ๋ผ์ด์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ํตํด ๊ทธ ์ด๋ ๋๋ณด๋ค ํฅ๋ฏธ๋กญ๊ณ ์ ๋ฅํด์ก์ต๋๋ค.