ES modules : A cartoon deep dive - Lee-hyuna/33-js-concepts-kr GitHub Wiki
ES modules : A cartoon deep-dive
ES ๋ชจ๋์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ณต์ ํ์คํ ๋ ๋ชจ๋ ์์คํ ์ ๋์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ 10๋ ๊ฐ๊น์ด ํ์คํ ์์ ์ ํ๋ฉด์ ์ฌ๊ธฐ๊น์ง ์ค๋๋ฐ๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
ํ์ง๋ง ๊ธฐ๋ค๋ฆผ์ ๊ฑฐ์ ๋๋ฌ์ต๋๋ค. 5์์ ํ์ด์ด ํญ์ค60(ํ์ฌ ๋ฒ ํ ๋ฒ์ )์ด ์ถ์๋๋ฉด ๋ชจ๋ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๊ฐ ES ๋ชจ๋์ ์ง์ํ ๊ฒ์ด๊ณ , Node๋ชจ๋ ์ค๋ฌด๊ทธ๋ฃน์ ํ์ฌ Node.js์ ES ๋ชจ๋ ์ง์์ ์ถ๊ฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๋ํ WebAssembly๋ฅผ์ํ ES ๋ชจ๋ ํตํฉ๋ ์งํ ์ค์ ๋๋ค.
๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ค์ ES ๋ชจ๋์ด ๋ ผ๋์ด ๋์์์ ์๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ES ๋ชจ๋์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค์ ๋ก ์ดํดํ๋ ์ฌ๋์ ๊ฑฐ์ ์์ต๋๋ค.
๋ชจ๋์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ ๋ฌด์์ธ๊ฐ?
์๊ฐํด๋ณด๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฝ๋ฉ์ ๋ณ์ ๊ด๋ฆฌ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ณ์์ ๊ฐ์ ํ ๋นํ๊ฑฐ๋ ๋ณ์์ ์ซ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ ๋ณ์๋ฅผ ๊ฒฐํฉํ์ฌ ๋ค๋ฅธ ๋ณ์์ ๋ฃ๋ ๊ฒ์ด ์ ๋ถ์ ๋๋ค.
์ฝ๋์ ์๋น ๋ถ๋ถ์ด ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ณ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฝ๋๋ฅผ ์ผ๋ง๋ ์ ์์ฑํ๊ณ ์ผ๋ง๋ ์ ์ ์ง ๊ด๋ฆฌ ํ ์ ์๋์ง์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
ํ๋ฒ์ ๋ช ๊ฐ์ง ๋ณ์๋ง ์๊ฐํ๋ฉด ์ผ์ด ์ฌ์์ง๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค์ฝํ(Scope)๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฒ์ด ๋๋ ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฒ์๊ฐ ์๋ํ๋ ๋ฐฉ์ ๋๋ฌธ์ ํจ์๋ ๋ค๋ฅธ ํจ์์์ ์ ์๋ ๋ณ์์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ข๋ค. ์ฆ, ํ ๊ฐ์ง ํจ์๋ฅผ ์ํ ํ ๋ ๊ทธ ํจ์ ํ๋๋ง ์๊ฐํ๋ฉด๋ฉ๋๋ค. ๋ค๋ฅธ ํจ์๊ฐ ๋ณ์์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ํ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ค๋ฅธ ํจ์๋ค๊ฐ์ ๋ณ์๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋ณ์๋ฅผ ๋ฒ์ ์ธ๋ถ์์ ๊ณต์ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น?
์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ์ญ ๋ฒ์์ ๊ฐ์ด ์์ ๋ฒ์์ ๋ฐฐ์นํ๋ ๊ฒ์
๋๋ค.
์๋ง๋ jQuery์์ ์ด ์ฌ์ค์ ๊ธฐ์ตํ ๊ฒ์
๋๋ค.
jQuery ํ๋ฌ๊ทธ์ธ์ ๋ก๋ํ๊ธฐ ์ ์ jQuery๊ฐ ์ ์ญ ๋ฒ์์ ์๋์ง ํ์ธํด์ผ ํ์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ ํจ๊ณผ์ ์ด์ง๋ง ๊ฒฐ๊ณผ๋ก ์๊ธฐ๋ ์ฑ๊ฐ์ ๋ฌธ์ ์
๋๋ค.
๋จผ์ , ๋ชจ๋ ์คํฌ๋ฆฝํธ ํ๊ทธ๊ฐ ์ฌ๋ฐ๋ฅธ ์์๋ก ์ ๋ ฌ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์๋ฌด๋ ๋ช
๋ น์ ๋ง์น์ง ์๋๋ก ์กฐ์ฌํด์ผ ํฉ๋๋ค.
๊ทธ ๋ช
๋ น์ ๋ง์ณ ๋ฒ๋ฆฌ๋ฉด ์คํ ์ค์ ์ฑ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํจ์๊ฐ ์ ์ญ์์ jQuery๊ฐ ๊ธฐ๋ํ๋ ์์น์ ํจ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ณ ์คํ์ ์ค๋จํฉ๋๋ค.
์ด๋ก ์ธํด ์ฝ๋ ์ ์ง๊ฐ ๊น๋ค๋ก์์ง๋๋ค. ์ค๋๋ ์ฝ๋ ๋๋ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ ๊ฑฐํ๋ ๋ฃฐ๋ ์ ๊ฒ์์ํฉ๋๋ค. ๋น์ ์ ๋ฌด์์ด ๊นจ์ง์ง ๋ชจ๋ฆ ๋๋ค. ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ๋ค ์ฌ์ด์ ์ข ์ ๊ด๊ณ๋ ์์์ ์ ๋๋ค. ๋ชจ๋ ํจ์๋ ์ ์ญ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฏ๋ก ์ด๋ค ํจ์๊ฐ ์ด๋ค ์คํฌ๋ฆฝํธ์ ์์กดํ๋์ง ์์ง ๋ชปํฉ๋๋ค.
๋ ๋ฒ์งธ ๋ฌธ์ ๋ ์ด๋ฌํ ๋ณ์๊ฐ ์ ์ญ ๋ฒ์์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ ์ญ ๋ฒ์ ์์์๋ ์ฝ๋์ ๋ชจ๋ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ ์ฑ ์ฝ๋๋ ์ผ๋ถ๋ฌ ํด๋น ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฝ๋๊ฐ ์๋ํ์ง ์์ ์์ ์ ์ํํ๋๋ก ๋ง๋ค๊ฑฐ๋ ๋น์ ์ฑ ์ฝ๋๊ฐ ์ค์๋ก ๋ณ์๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค.
๋ชจ๋์ ์ด๋ป๊ฒ ๋์์ด๋ฉ๋๊น?
๋ชจ๋์ ์ด๋ฌํ ๋ณ์์ ํจ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ํจ๊ป ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ ๋ณ์์ ํจ์๋ฅผ ๊ทธ๋ฃนํ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจ์์ ๋ณ์๋ฅผ ๋ชจ๋ ๋ฒ์์ ๋ฃ์ต๋๋ค. ๋ชจ๋ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ํจ์๊ฐ์ ๋ณ์๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํจ์ ๋ฒ์์ ๋ฌ๋ฆฌ ๋ชจ๋ ๋ฒ์๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ชจ๋์์๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋์ ์ด๋ค ๋ณ์, ํด๋์ค ๋๋ ํจ์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ผํ๋์ง ๋ช ์ ์ ์ผ๋ก ๋งํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์์๋ ๊ฒ์ด ์์ผ๋ฉด ์ด๋ฅผ export๋ผ๊ณ ํฉ๋๋ค. export๋ฅผํ๋ฉด ๋ค๋ฅธ ๋ชจ๋์ ํด๋น ๋ณ์, ํด๋์ค ๋๋ ํจ์์ ์์กดํ๋ค๊ณ ๋ช ์ ํ ์ ์์ต๋๋ค.
๋ชจ๋์ ๋ช ์์ ์ธ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ชจ๋์ ์ ๊ฑฐํ๋ฉด ์ด๋ค ๋ชจ๋์ด ํ์๋ ์ง๋ฅผ ์ ์ ์์ต๋๋ค.
์ผ๋จ ๋ชจ๋๋ค ์ฌ์ด์ ๋ณ์๋ฅผ exportํ๊ณ import ๋ฅ๋ ฅ์ ๊ฐ๊ฒ ๋๋ฉด, ๋น์ ์ ์ฝ๋๋ฅผ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ ์ ์๋ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋ถํดํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ๋ฉ์ด๋ฆฌ๋ฅผ ๊ฒฐํฉํ๊ณ ๋ค์ ๊ฒฐํฉํ๋ฉด, ๋ง์น ๋ ๊ณ ๋ธ๋ก๊ณผ ๊ฐ์, ๋์ผํ ๋ชจ๋์์ ๋ชจ๋ ์ข ๋ฅ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ชจ๋์ด ๋งค์ฐ ์ ์ฉํ๊ธฐ ๋๋ฌธ์, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๋ ์๋๊ฐ ์ฌ๋ฌ ๋ฒ ์์์ต๋๋ค. ์ค๋๋ ์๋ ๋ ๊ฐ์ง ๋ชจ๋ ์์คํ
์ด ํ๋ฐํ๊ฒ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
CommonJS(CommonJS, CJS)๋ Node.js๊ฐ ์ญ์ฌ์ ์ผ๋ก ์ฌ์ฉํด ์จ ๊ฒ์ด๋ค. ESM(EcmaScript ๋ชจ๋)์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ท๊ฒฉ์ ์ถ๊ฐ๋ ์ต์ ์์คํ
์
๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ ES ๋ชจ๋์ ์ง์ํ๋ฉฐ, Node๋ ์ง์์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
์๋ก์ด ๋ชจ๋ ์์คํ ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ธํ ์ดํด๋ด ์๋ค.
ES ๋ชจ๋์ ์๋ ๋ฐฉ์
๋ชจ๋์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํ ๋ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์์ฑํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ์ข ์์ฑ ์ฌ์ด์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ๋ชจ๋ import ๋ฌธ์์์ต๋๋ค.
์ด import ๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋๋ Node๊ฐ ๋ก๋ํด์ผํ๋ ์ฝ๋๋ฅผ ์ ํํ ์ธ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ๋ํ์ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ ํ์ผ์ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋๋จธ์ง ์ฝ๋๋ฅผ ์ฐพ์ผ๋ ค๋ฉด import๋ฌธ์ ๋ฐ๋ฅด๋ฉด ๋ฉ๋๋ค.
ํ์ง๋ง ํ์ผ ์์ฒด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์๋๋๋ค. ์ด ๋ชจ๋ ํ์ผ์ ๋ชจ๋ ๋ ์ฝ๋๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ณํํ๋ ค๋ฉด ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ํ์ผ์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋์ง ์ค์ ๋ก ์ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ธ์คํด์ค๋ก ๋ณํํด์ผํฉ๋๋ค. ์ธ์คํด์ค๋ ๋ ๊ฐ์ง๋ฅผ ๊ฒฐํฉํฉ๋๋ค : Code์ State.
์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ จ์ ์ง์์ฌํญ ์ ๋๋ค. ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ํ์ง๋ง ๊ทธ ์์ฒด๋ก๋ ์ด๋ค ์ผ๋ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ง์๋ค์ ๋ฐ๋ฅด๊ธฐ ์ํ ์๋ฃ๊ฐ ํ์ํฉ๋๋ค.
State๋ ๋ฌด์์
๋๊น? State๋ ๋น์ ์๊ฒ ์๋ฃ๋ฅผ ์ค๋๋ค.
State๋ ์์์ ์์ ์์ ๋ณ์์ ์ค์ ๊ฐ์
๋๋ค. ๋ฌผ๋ก ์ด ๋ณ์๋ ๊ฐ์ ๋ณด์ ํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์์ ๋ํ ์ ์นญ ์ผ ๋ฟ์
๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ์ธ์คํด์ค๋ Code(๋ช
๋ น์ด ๋ชฉ๋ก)์ State(๋ชจ๋ ๋ณ์์ ๊ฐ)๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ์๋กํ๋ ๊ฒ์ ๊ฐ ๋ชจ๋์ ๋ํ ๋ชจ๋ ์ธ์คํด์ค์ ๋๋ค. ๋ชจ๋ ๋ก๋ฉ ๊ณผ์ ์ ์ง์ ์ ํ์ผ์์ ๋ชจ๋ ์ธ์คํด์ค์ ์ ์ฒด ๊ทธ๋ํ๋ก ์งํ๋ฉ๋๋ค.
ES ๋ชจ๋์ ๊ฒฝ์ฐ ์ธ ๋จ๊ณ๋ก ์์ ์ด ์ํ๋ฉ๋๋ค.
- Construction - ๋ชจ๋ ํ์ผ์ ์ฐพ์ ๋ค์ด๋ก๋ํ๊ณ ๋ชจ๋ ๋ ์ฝ๋๋ก ํ์ฑํฉ๋๋ค.
- Instantiation - ๋ด ๋ณด๋ธ ๊ฐ์ ๋ชจ๋ ๋ฐฐ์นํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ์์๋ ์์๋ฅผ ์ฐพ์ต๋๋ค(๊ทธ๋ฌ๋ ๊ฐ์ ์์ง ์ฑ์ฐ์ง๋ ์์). ๊ทธ๋ฐ ๋ค์ exports์ imports ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ํด๋น ์์๋ฅผ ๊ฐ๋ฆฌ ํต๋๋ค. ์ด๋ฅผ ๋งํฌ๋ผ๊ณ ํฉ๋๋ค.
- Evaluation - ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ณ์์ ์ค์ ๊ฐ์ผ๋ก ์์๋ฅผ ์ฑ์๋๋ค.
์ฌ๋๋ค์ ES ๋ชจ๋์ด ๋น๋๊ธฐ์ ์ด๋ผ๊ณ ๋งํฉ๋๋ค. ์์ ์ loading, instantiation ๋ฐ evaluation ์ธ ๋จ๊ณ๋ก ๋๋๋ฉฐ ์ด๋ฌํ ๋จ๊ณ๋ ๊ฐ๋ณ์ ์ผ๋ก ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์ ์ด๋ผ๊ณ ์๊ฐ ํ ์ ์์ต๋๋ค.
์ด ์คํ์ด CommonJS์ ์๋ ์ข ๋ฅ์ ๋น๋๊ธฐ๋ฅผ ๋์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋์ค์ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ง๋ง, CJS์์๋ ๋ชจ๋๊ณผ ๊ทธ ์๋์ ์์กด์ฑ์ด ํ๊บผ๋ฒ์ ๋ก๋๋๊ณ , ์ธ์คํด์คํ๋๊ณ , evaluation์ด ์ด๋ฃจ์ด์ง๋๋ค.
๊ทธ๋ฌ๋ ๋จ๊ณ ์์ฒด๋ ๋ฐ๋์ ๋น๋๊ธฐ์์ ์๋๋๋ค. ๋๊ธฐ์์ผ๋ก ์ํ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ฌด์์ ๋ก๋ํ๊ณ ์๋์ง์ ๋ฌ๋ ค ์์ต๋๋ค. ์๋ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ES ๋ชจ๋ ์คํ์ ์ํด ์ ์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค์ ๋ก ๋ ๊ฐ์ ๋ฐ์ชฝ์ด ์๋๋ฐ, ์๋ก ๋ค๋ฅธ ์คํ์ผ๋ก ๋ค๋ค์ง๋๋ค.
ES ๋ชจ๋ ์คํ์ ํ์ผ์ ๋ชจ๋ ๋ ์ฝ๋๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ๊ณผ ํด๋น ๋ชจ๋์ ์ธ์คํด์คํํ๊ณ evaluationํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ๊ทธ๋ฌ๋, ์ฒ์์ ํ์ผ์ ์ป๋ ๋ฐฉ๋ฒ์ ๋งํ์ง ์์ต๋๋ค.
ํ์ผ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ loader์
๋๋ค. loader๋ ๋ค๋ฅธ ์คํ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ ํด๋น ์คํ์ HTML ์คํ์
๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ค ํ๋ซํผ์ ์ฌ์ฉํ๊ณ ์๋์ง์ ๋ฐ๋ผ ๋ค๋ฅธ loader๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
loader๋ ๋ชจ๋์ด ๋ก๋๋๋ ๋ฐฉ์์ ์ ํํ๊ฒ ์ ์ดํฉ๋๋ค.
ES ๋ชจ๋ ๋ฉ์๋ (ParseModule, Module.Instantiate ๋ฐ Module.Evaluate)๋ฅผ ํธ์ถํฉ๋๋ค.
JS ์์ง์ ๋์ ์กฐ์ข
ํ๋ ๊ผญ๋๊ฐ์ ์ธํ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
์ด์ ๊ฐ ๋จ๊ณ๋ฅผ ์์ธํ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
Construction
Construction ๋จ๊ณ์์ ๊ฐ ๋ชจ๋์ ๋ํด ์ธ ๊ฐ์ง ์ผ์ด ๋ฐ์ํฉ๋๋ค.
- ๋ชจ๋์ด ๋ค์ด ์๋ ํ์ผ์ ์ด๋์์ ๋ค์ด๋ก๋ํ ์ง ์์๋ผ (aka module resolution)
- (URL์์ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ํ์ผ ์์คํ ์์ ํ์ผ์ ๋ก๋ํ์ฌ) ํ์ผ์ ๊ฐ์ ธ์ต๋๋ค.
- ํ์ผ์ ๋ชจ๋ ๋ ์ฝ๋๋ก Parseํฉ๋๋ค.
ํ์ผ ์ฐพ๊ธฐ ๋ฐ ๊ฐ์ ธ ์ค๊ธฐ
loader๋ ํ์ผ์ ์ฐพ์ ๋ค์ด๋ก๋ํ๋ ๊ฒ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋จผ์ ์ง์ ์ (entry point) ํ์ผ์ ์ฐพ์์ผ ํฉ๋๋ค. HTML์์ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ loader๋ฅผ ์ฐพ์ ์์น๋ฅผ ์๋ ค์ค๋๋ค.
๊ทธ๋ฌ๋ main.js๊ฐ ์ง์ ์ ์ผ๋ก ์์กดํ๋ ๋ค์ ๋ชจ๋์ ์ด๋ป๊ฒ ์ฐพ์ ์ ์์ต๋๊น? ์ฌ๊ธฐ์ import ๋ฌธ์ด ๋ค์ด์ต๋๋ค. import ๋ฌธ ์ค ํ ๋ถ๋ถ์ ๋ชจ๋ ์ง์ ์๋ผ๊ณ ํฉ๋๋ค. ๋ก๋์๊ฒ ๋ค์ ๋ชจ๋์ ์ด๋์ ์ฐพ์ ์ ์๋์ง ์๋ ค์ค๋๋ค.
๋ชจ๋ ์ง์ ์์ ๋ํด ์ฃผ๋ชฉํด์ผํ ํ ๊ฐ์ง ์ฌํญ :
๋ธ๋ผ์ฐ์ ์ Node๊ฐ์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ๊ฐ ํธ์คํธ๋ ๋ชจ๋ ์ง์ ์ ๋ฌธ์์ด์ ํด์ํ๋ ๊ณ ์ ํ ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ํ๋ซํผ๋ง๋ค ๋ค๋ฅธ ๋ชจ๋ ํด์๋ ์๊ณ ๋ฆฌ์ฆ(module resolution algorithm)์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ํ์ฌ Node์์ ์๋ํ๋ ์ผ๋ถ ๋ชจ๋ ์ง์ ์๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ์ง ์์ง๋ง์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ์ง์์ ์ธ ์์
์ด ์งํ ์ค์
๋๋ค.
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๋๊น์ง ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ ์ง์ ์๋ก URL ๋ง ์๋ฝํฉ๋๋ค. ํด๋น URL์์ ๋ชจ๋ ํ์ผ์๋ก๋ํฉ๋๋ค. ํ์ง๋ง ๊ทธ๋ํ ์ ์ฒด๊ฐ ๋์์ ๊ทธ๋ฐ ์ผ์ ์ผ์ด๋์ง ์์ต๋๋ค. ํ์ผ ๋ถ์์ ํ๊ธฐ ์ ๊น์ง๋ ๋ชจ๋์ด ์ด๋ค ์ข ์์ฑ์ ํ์๋ก ํ๋์ง๋ ๋ชจ๋ฅด๊ณ ... ํ์ผ์ ๊ฐ์ ธ์ฌ ๋๊น์ง๋ ๋ถ์ํ ์ ์์ต๋๋ค.
์ฆ, ํธ๋ฆฌ๋ฅผ ํ๋์ฉ ๋ถ์ํ ๋ค์ ํ๋์ ํ์ผ์ ํ์ฑํ ํ ์ข ์์ฑ์ ํ์ ํด์ ํด๋น ์ข ์์ฑ์ ์ฐพ์๋ก๋ํด์ผ ํฉ๋๋ค.
๋ฉ์ธ ์ค๋ ๋๊ฐ ์ด๋ค ํ์ผ ๊ฐ๊ฐ์ ๋ค์ด๋ก๋ ํ ๋๊น์ง ๋๊ธฐํด์ผํ๋ค๋ฉด ๋ง์ ๋ค๋ฅธ ์์ ๋ค์ด ๋๊ธฐ์ด์ ์์ผ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์์ ํ ๋ ๋ค์ด๋ก๋ํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์ ๊ฐ์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ฉด ์ฌ์ฉํ๊ธฐ์๋ ๋๋ฌด ๋๋ฆฐ ๋ชจ๋์ ์ฌ์ฉํ๋ ์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๊ฒ์ด ES ๋ชจ๋ ์คํ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ ๋จ๊ณ๋ก ๋ถํ ํ๋ ์ด์ ์ค ํ๋์ ๋๋ค. ์์ฒด ๋จ๊ณ๋ก ๊ตฌ์ฑ์ ๋ถํ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ผ์ ๊ฐ์ ธ ์์ ๋ชจ๋ ๊ทธ๋ํ์ ๋ํ ์ดํด๋ฅผ ๋์ด๊ธฐ ์ ์ ๋๊ธฐ ํ ์์ ์ ์ํ ํ ์ ์์ต๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋จ๊ณ๋ก ๋๋๋ ์ด ์ ๊ทผ๋ฒ์ ES ๋ชจ๋๊ณผ CommonJS ๋ชจ๋์ ์ฃผ์ ์ฐจ์ด์ ์ค ํ๋์ ๋๋ค.
CommonJS๋ ์์คํ ์์ ํ์ผ์ ๋ก๋ํ๋๋ฐ ์ธํฐ๋ท์ ํตํด ๋ค์ด๋ก๋ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅด๊ฒ ์ํํ ์ ์์ต๋๋ค. ์ฆ, ๋ ธ๋๊ฐ ํ์ผ์ ๋ก๋ํ๋ ๋์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ผ์ด ์ด๋ฏธ ๋ก๋๋์์ผ๋ฏ๋ก ์ธ์คํด์คํํ๊ณ evaluationํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ค(CommonJS์์๋ ๋ณ๋์ ๋จ๊ณ๊ฐ ์๋๋ค). ๋ํ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ์ ์ฒด ํธ๋ฆฌ๋ฅผ ๊ฑธ์ด ๋ด๋ ค๊ฐ์ ์์์ ์ข ์์ฑ์ ๋ก๋, ์ธ์คํด์คํ ๋ฐ evaluationํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
CommonJS ์ ๊ทผ๋ฒ์ ๋ช ๊ฐ์ง ์ํฅ์ ๋ฏธ์น๋ฉฐ, ๋์ค์ ๊ทธ๊ฒ์ ๋ํด ๋ ์์ธํ ์ค๋ช
ํ๊ฒ ์ต๋๋ค. ํ์ง๋ง ํ ๊ฐ์ง ์๋ฏธ๋ CommonJS ๋ชจ๋์ด ์๋ Node์์ ๋ชจ๋ ์ง์ ์์์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ค์ ๋ชจ๋์ ์ฐพ๊ธฐ ์ ์ ์ด ๋ชจ๋์ ๋ชจ๋ ์ฝ๋(ํ์ํ ๋ช
๋ น๋ฌธ๊น์ง)๋ฅผ ์คํํ๊ณ ์์ต๋๋ค. ์ฆ, ๋ชจ๋ resolution๋ฅผ ์ํํ ๋ ๋ณ์์ ๊ฐ์ด ์์ต๋๋ค.
ํ์ง๋ง ES ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ํ๊ฐํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ ์ฒด ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ์ง์ ์์ ๋ณ์๋ฅผ ํฌํจํ ์ ์๋ค๋ ๋ป์ด๋ค.
ํ์ง๋ง ๋๋ก๋ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ง ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฝ๋๊ฐ ์คํ ์ค์ธ ํ๊ฒฝ์ด๋ ์ฝ๋์ ๋ฐ๋ผ ๋ก๋ํ ๋ชจ๋์ ์ ํํ ์ ์์ต๋๋ค.
ES ๋ชจ๋์ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด proposal called dynamic import์ด ์์ต๋๋ค. ์ด๋ฅผ ํตํด import(`$ {path} / foo.js`)
๊ณผ ๊ฐ์ import๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ import()๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋๋ ๋ชจ๋ ํ์ผ์ ๋ณ๋์ ๊ทธ๋ํ์ ์ง์
์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค.
๋์ ์ผ๋ก ๊ฐ์ ธ์จ ๋ชจ๋์ ๋ณ๋๋ก ์ฒ๋ฆฌ๋๋ ์๋ก์ด ๊ทธ๋ํ๋ฅผ ์์ํฉ๋๋ค.
ํ ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์ ์ด ๋ ๊ทธ๋ํ์ ํฌํจ๋ ๋ชจ๋ ๋ชจ๋์ด ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ ๊ฒ์
๋๋ค.
์ด๋ ๋ก๋๊ฐ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ์บ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํน์ ์ ์ญ ๋ฒ์์์๋ ๊ฐ ๋ชจ๋์๋ ํ๋์ ๋ชจ๋ ์ธ์คํด์ค๋ง ์กด์ฌํฉ๋๋ค.
์ด๊ฒ์ ์์ง์ ๋ํ ์์ ์ด ์ค์ด๋ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๋ชจ๋์ด ์ข ์๋์ด ์์ด๋ ๋ชจ๋ ํ์ผ์ ํ ๋ฒ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. (์ด๊ฒ์ด ๋ชจ๋์ ์บ์ํ๋ ํ ๊ฐ์ง ์ด์ ์ ๋๋ค. evaluation ์น์ ์์ ๋ค๋ฅธ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค.)
๋ก๋๋ ๋ชจ๋ ๋งต์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํ์ฌ์ด ์บ์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ฐ ๊ธ๋ก๋ฒ์ ๋ณ๋์ ๋ชจ๋ ๋งต์์ ๋ชจ๋์ ์ถ์ ํฉ๋๋ค.
๋ก๋๊ฐ URL์ ๊ฐ์ ธ ์ค๋ ค๊ณ ํ๋ฉด URL์ ๋ชจ๋ ๋งต์ ๋ฃ๊ณ ํ์ฌ ํ์ผ์ ๊ฐ์ ธ ์ค๋ ์ค์์ ๋ํ๋
๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ฒญ์ ์ ์กํ๊ณ ๋ค์ ํ์ผ์ ๊ฐ์ ธ ์ค๊ธฐ ์์ํฉ๋๋ค.
๋ค๋ฅธ ๋ชจ๋์ด ๊ฐ์ ํ์ผ์ ์์กดํ๋ฉด ์ด๋ป๊ฒ๋ฉ๋๊น? ๋ก๋๋ ๋ชจ๋ ๋งต์์ ๊ฐ URL์ ๊ฒ์ํฉ๋๋ค.
๊ฑฐ๊ธฐ์ fetching์ด ์์ผ๋ฉด ๋ค์ URL๋ก ์ด๋ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ชจ๋ ๋งต์ ๊ฐ์ ธ ์ค๋ ํ์ผ์ ์ถ์ ํ์ง ์์ต๋๋ค. ๋ชจ๋ ๋งต์ ๋ชจ๋์ ๋ํ ์บ์ ์ญํ ์ํฉ๋๋ค.
Parsing
์ด์ ์ด ํ์ผ์ ๊ฐ์ ธ์์ผ๋ ๋ชจ๋ ๋ ์ฝ๋๋ก Parsingํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ชจ๋์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ถ๋ถ์ ์ดํดํ ์ ์์ต๋๋ค.
๋ชจ๋ ๋ ์ฝ๋๊ฐ ์์ฑ๋๋ฉด ๋ชจ๋ ๋งต์ ์ ์ฅ๋ฉ๋๋ค. ์ฆ, ์ฌ๊ธฐ์๋ถํฐ ์์ฒญํ ๋๋ง๋ค ๋ก๋๊ฐ ๋งต์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
parsing์๋ ์ฌ์ํ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์๋ ์ธ๋ถ ์ฌํญ์ด ํ๋ ์์ง๋ง ์ค์ ๋ก๋ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ชจ๋ ๋ชจ๋์ ์๋จ์ "use strict"ํ ๊ฒ์ฒ๋ผ parsing๋ฉ๋๋ค.
๋ค๋ฅธ ์ฌ์ํ ์ฐจ์ด์ ๋ค๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํค์๋ await๋ ๋ชจ๋์ ์ต์์ ์ฝ๋์ ์์ฝ๋์ด ์์ผ๋ฉฐ 'this'๊ฐ์ 'undefined'๊ฐ์
๋๋ค.
์ด๋ฌํ parsing์ ๋ค๋ฅธ ๋ฐฉ์์ "parse goal"๋ผ๊ณ ํฉ๋๋ค.
๋์ผํ ํ์ผ์ parseํ์ง๋ง ๋ค๋ฅธ ๋ชฉํ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด parsing ํ ํ์ผ์ ์ข
๋ฅ๋ฅผ parsingํ๊ธฐ ์ ์ ์์์ผํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์๋ ๋งค์ฐ ์ฝ์ต๋๋ค. script ํ๊ทธ์ type = "module"์ ๋ฃ์ผ๋ฉด๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ธ๋ผ์ฐ์ ์ ์ด ํ์ผ์ ๋ชจ๋๋ก parseํด์ผ ํจ์ ์๋ฆฝ๋๋ค. ๋ชจ๋๋ง ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ imports๊ฐ ๋ชจ๋์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Node์์๋ HTML ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก type ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ปค๋ฎค๋ํฐ์์ ์ด๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๋ํ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ .mjs ํ์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ด ํ์ฅ์๋ฅผ ์ฌ์ฉํ๋ฉด Node๋ "์ด ํ์ผ์ ๋ชจ๋์
๋๋ค"๋ผ๊ณ ๋งํฉ๋๋ค.
์ฌ๋๋ค์ด ์ด ์ด์ผ๊ธฐ๋ฅผ parse goal์ ์๋จ์ผ๋ก ์ผ๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
ํ ๋ก ์ ํ์ฌ ์งํ ์ค์ด๋ฏ๋ก Node ์ปค๋ฎค๋ํฐ๊ฐ ๊ฒฐ๊ตญ ์ด๋ค ์๋จ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋์ง๋ ๋ถ๋ช
ํ์ง ์์ต๋๋ค.
์ด๋ ์ชฝ์ด๋ , ๋ก๋๋ ํ์ผ์ ๋ชจ๋๋ก parseํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ชจ๋์ด๊ณ ๊ฐ์ ธ ์ค๊ธฐ๊ฐ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ผ์ ๊ฐ์ ธ ์์ parse ํ ๋๊น์ง ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฐ ๋์ด์ผ! ๋ก๋ฉ ํ๋ก์ธ์ค๊ฐ ๋๋๋ฉด ์ง์ ์ ํ์ผ๋ง ๊ฐ์ง๊ณ ๋ชจ๋ ๋ ์ฝ๋ ๋ฌถ์๊น์ง ๊ฐ์ง๊ฒ๋์์ต๋๋ค.
๋ค์ ๋จ๊ณ๋ ๋ชจ๋์ ์ธ์คํด์คํํ๊ณ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ํจ๊ป ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค.
Instantiation
์์ ์ธ๊ธ ํ ๊ฒ์ฒ๋ผ ์ธ์คํด์ค๋ code์ state๋ฅผ ๊ฒฐํฉํฉ๋๋ค. state๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ผ๋ฏ๋ก ์ธ์คํด์คํ ๋จ๊ณ๋ ๋ชจ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค.
๋จผ์ , JS ์์ง์ ๋ชจ๋ ํ๊ฒฝ ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๋ชจ๋ ๋ ์ฝ๋์ ๋ณ์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ชจ๋ exports์ ๋ํด ๋ฉ๋ชจ๋ฆฌ์์๋ ์์๋ฅผ ์ฐพ์ต๋๋ค. ๋ชจ๋ ํ๊ฒฝ ๋ ์ฝ๋๋ ๊ฐ export์ ์ฐ๊ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ฅผ ์ถ์ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ์์๋์ด ์์๋ค์ ์์ง ๊ฐ์ ์ป์ง ๋ชปํฉ๋๋ค. evaluation ํ์๋ ์ค์ ๊ฐ์ด ์ฑ์์ง ๊ฒ์
๋๋ค.
์ด ๊ท์น์ ๋ํ ํ ๊ฐ์ง์ฃผ์ ์ฌํญ์ด ์์ต๋๋ค. export ๋ ํจ์ ์ ์ธ์ ์ด ๋จ๊ณ์์ ์ด๊ธฐํ๋ฉ๋๋ค. ๋ฐ๋ผ์ evaluation์ด ๋ ์ฌ์์ง๋๋ค.
๋ชจ๋ ๊ทธ๋ํ๋ฅผ ์ธ์คํด์คํํ๊ธฐ ์ํด ์์ง์ depth first post-order traversal๋ฅผ ์ํํฉ๋๋ค. ์ด๋ ๊ทธ๋ํ์ ๋งจ ์๋, ์ฆ ๋ค๋ฅธ ๊ฒ์ ์์กดํ์ง ์๋ ํ๋จ์ ์์กด์ฑ์ ์ด๋ฅด๊ฒํ์ฌ ํด๋น ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ค์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ง์ ๋ชจ๋ ์๋์์๋ ๋ชจ๋ exports - ๋ชจ๋์ด ์์กดํ๋ ๋ชจ๋ exports๋ฅผ ๋ง๋ฌด๋ฆฌํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ๋ชจ๋์์ ๊ฐ์ ธ์จ ํญ๋ชฉ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ๋ ๋ฒจ์ ๋ค์ ์ค์ ํฉ๋๋ค.
export์ import๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋์ผํ ์์น๋ฅผ ๊ฐ๋ฆฌ ํต๋๋ค. ๋จผ์ export์ ์ฐ๊ฒฐํ๋ฉด ๋ชจ๋ import์ ์ผ์นํ๋ export์ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ CommonJS ๋ชจ๋๊ณผ ๋ค๋ฆ ๋๋ค. CommonJS์์๋ ์ ์ฒด export object๊ฐ ๋ด๋ณด๋ผ ๋ ๋ณต์ฌ๋ฉ๋๋ค. ์ฆ, ๋ด๋ณด๋ด๋ ๊ฐ(์ซ์์ ๊ฐ์)์ ๋ณต์ฌ๋ณธ์ ๋๋ค.
์ฆ, ๋์ค์ export ๋ชจ๋์ด ํด๋น ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด importi ๋ชจ๋์ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ๋ณด์ง ๋ชปํฉ๋๋ค.
๋ฐ๋๋ก ES ๋ชจ๋์์๋ ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ์ด๋ผ๊ณ ํ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ๋ ๋ชจ๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋์ผํ ์์น๋ฅผ ๊ฐ๋ฆฌ ํต๋๋ค.
์ฆ, export ๋ชจ๋์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ํด๋น ๋ณ๊ฒฝ ๋ด์ฉ์ด import ๋ชจ๋์ ํ์๋ฉ๋๋ค.
export ๋ชจ๋์ ์ธ์ ๋ ์ง ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง import๋ชจ๋์ ํด๋น import๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ฆ, ๋ชจ๋์ด ๊ฐ์ฒด๋ฅผ importํ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด์์๋ ์์ฑ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
(Modules that export values can change those values at any time, but importing modules cannot change the values of their imports. That being said, if a module imports an object, it can change property values that are on that object.)
์ด์ ๊ฐ์ด ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ๋ชจ๋ ๋ชจ๋์ ์ฐ๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ ์ฃผ๊ธฐ์ ์์กด์ฑ์ ๊ฐ์ง ๋ evaluation์ ๋์์ด๋ฉ๋๋ค. ์๋์์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
์ด ๋จ๊ณ๊ฐ ๋๋๋ฉด, export/import ๋ณ์์ ๋ํ ๋ชจ๋ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ์์น๊ฐ ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ด์ ์ฝ๋๋ฅผ ํ๊ฐํ๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๊ฐ์ผ๋ก ์ฑ์ธ ์ ์์ต๋๋ค.
Evaluation
๋ง์ง๋ง ๋จ๊ณ๋ ์ด๋ฌํ ์์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฑ์ฐ๋ ๊ฒ์ ๋๋ค. JS ์์ง์ ํจ์ ์ธ๋ถ์์๋ ์ฝ๋์ธ ์ต์์ ์ฝ๋๋ฅผ ์คํํ์ฌ ์ด๋ฅผ ์ํํฉ๋๋ค. ์ด๋ฌํ ์์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฑ์ฐ๋ ๊ฒ ์ธ์๋ ์ฝ๋๋ฅผ evaluationํ๋ฉด ๋ถ์์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋์ด ์๋ฒ๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
๋ถ์์ฉ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋์ ํ ๋ฒ๋ง ํ๊ฐํ ์ ์์ต๋๋ค. ์ ํํ ๋์ผํ ๊ฒฐ๊ณผ๋ก ์ฌ๋ฌ ๋ฒ ์ํํ ์ ์๋ ์ธ์คํด์คํ์์ ๋ฐ์ํ๋ ๋งํฌ์๋ ๋ฌ๋ฆฌ evaluation๋ ๋ช ๋ฒ์ ์ํํ๋๋์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ชจ๋ ๋งต์ ๊ฐ๋ ํ ๊ฐ์ง ์ด์ ์ ๋๋ค. ๋ชจ๋ ๋งต์ ํ์ค URL๋ก ๋ชจ๋์ ์บ์ํ์ฌ ๊ฐ ๋ชจ๋์ ๋ํด ๋จ ํ๋์ ๋ชจ๋ ๋ ์ฝ๋๋ง ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ ๋ชจ๋์ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค. ์ธ์คํด์คํ์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด๊ฒ์ depth first post-order traversal๋ก ์ํ๋ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์ด์ผ๊ธฐํ๋ ์ฌ์ดํด์ ์ด๋จ๊น์?
์ฃผ๊ธฐ์ ์์กด์ฑ์์๋ ๊ทธ๋ํ์ ๋ฃจํ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ธด ๋ฃจํ์ ๋๋ค. ํ์ง๋ง ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ๋๋ ์งง์ ๋ฃจํ๋ฅผ ๊ฐ์ง ์ธ์์ ์ธ ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด CommonJS ๋ชจ๋์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ์ฃผ ๋ชจ๋์ require ๋ฌธ๊น์ง ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ counter ๋ชจ๋์ ๋ก๋ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ counter ๋ชจ๋์ export object ๋ฉ์์ง์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ง main ๋ชจ๋์์ evaluation๋์ง ์์์ผ๋ฏ๋ก ์์ง, ์ด๊ฒ์ undefined๋ก ๋ฐํ ํ ๊ฒ์ ๋๋ค. JS ์์ง์ ๋ก์ปฌ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๊ณ ๊ฐ์ undefined๋ก ์ค์ ํฉ๋๋ค.
evaluation๋ counter ๋ชจ๋์ ์ต์์ ์ฝ๋์ ๋๊น์ง ๊ณ์๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฉ์์ง์ ๋ํ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ์ป์ ์ ์๋์ง(main.js๋ฅผ ํ๊ฐํ ํ)๋ฅผ ์๊ณ ์ถ์ด์ ํ์์์์ ์ค์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ evaluation๋ main.js์์ ์ฌ๊ฐ๋๋ค.
๋ฉ์์ง ๋ณ์๊ฐ ์ด๊ธฐํ๋์ด ๋ฉ๋ชจ๋ฆฌ์ ์ถ๊ฐ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ์ง ์ฌ์ด์๋ ์๋ฌด๋ฐ ์ฐ๊ด์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ชจ๋์์ undefined๋ก ์ ์ง๋ฉ๋๋ค.
๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ export๊ฐ ์ฒ๋ฆฌ ๋ ๊ฒฝ์ฐ counter ๋ชจ๋์ ๊ฒฐ๊ตญ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค. ํ์ ์์์ด ์คํ๋ ๋๊น์ง main.js์ evaluation๊ฐ ์๋ฃ๋์ด ๊ฐ์ ์ฑ์๋๋ค.
์ด๋ฌํ ์ฌ์ดํด์ ์ง์ํ๋ ๊ฒ์ ES ๋ชจ๋ ์ค๊ณ์ ํฐ ๊ทผ๊ฑฐ์ ๋๋ค. ์ด๋ฌํ 3๋จ๊ณ ์ค๊ณ๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค.
Whatโs the status of ES modules? (ES ๋ชจ๋์ ์ํ๋ ์ด๋ป์ต๋๊น?)
5์ ์ด์ Firefox 60์ด ์ถ์๋๋ฉด ๋ชจ๋ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ES ๋ชจ๋์ ์ง์ํฉ๋๋ค. Node๋ ๋ํ CommonJS์ ES ๋ชจ๋ ๊ฐ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํ์
ํ๊ธฐ์ํ working group๊ณผ ํจ๊ป ์ง์์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
์ฆ, type = module ์ธ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ณ imports ๋ฐ exports๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ง์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์์ง ์ ๊ณต๋์ง ์์ต๋๋ค.
dynamic import proposal์ ์ฌ์ ํ๋ก์ธ์ค์ 3 ๋จ๊ณ์ ์์ผ๋ฉฐ import.meta๋ Node.js ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๋ ๋ฐ ๋์์ด๋๋ฉฐ ๋ชจ๋ ํด๊ฒฐ ์ ์์ ๋ธ๋ผ์ฐ์ ์ Node.js ๊ฐ์ ์ฐจ์ด๋ฅผ ์ํํ๊ฒ ํด์ค๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋์ ์ฌ์ฉํ ์์
์ด ์์ผ๋ก ๋ ์ข์ ์ง๋ฆฌ๋ผ ๊ธฐ๋ํ ์ ์์ต๋๋ค.