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 ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ ์„ธ ๋‹จ๊ณ„๋กœ ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. Construction - ๋ชจ๋“  ํŒŒ์ผ์„ ์ฐพ์•„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋ชจ๋“ˆ ๋ ˆ์ฝ”๋“œ๋กœ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
  2. Instantiation - ๋‚ด ๋ณด๋‚ธ ๊ฐ’์„ ๋ชจ๋‘ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์žˆ๋Š” ์ƒ์ž๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๊ฐ’์„ ์•„์ง ์ฑ„์šฐ์ง€๋Š” ์•Š์Œ). ๊ทธ๋Ÿฐ ๋‹ค์Œ exports์™€ imports ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•ด๋‹น ์ƒ์ž๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋งํฌ๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  3. 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 ๋‹จ๊ณ„์—์„œ ๊ฐ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์„ธ ๊ฐ€์ง€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋“ˆ์ด ๋“ค์–ด ์žˆ๋Š” ํŒŒ์ผ์„ ์–ด๋””์—์„œ ๋‹ค์šด๋กœ๋“œํ• ์ง€ ์•Œ์•„๋ผ (aka module resolution)
  2. (URL์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์—ฌ) ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ์„ ๋ชจ๋“ˆ ๋ ˆ์ฝ”๋“œ๋กœ Parseํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ฐพ๊ธฐ ๋ฐ ๊ฐ€์ ธ ์˜ค๊ธฐ

loader๋Š” ํŒŒ์ผ์„ ์ฐพ์•„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ง„์ž…์ (entry point) ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. HTML์—์„œ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ loader๋ฅผ ์ฐพ์„ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ main.js๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๋Š” ๋‹ค์Œ ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์„œ import ๋ฌธ์ด ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. import ๋ฌธ ์ค‘ ํ•œ ๋ถ€๋ถ„์„ ๋ชจ๋“ˆ ์ง€์ •์ž๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋”์—๊ฒŒ ๋‹ค์Œ ๋ชจ๋“ˆ์„ ์–ด๋””์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ์ง€์ •์ž์— ๋Œ€ํ•ด ์ฃผ๋ชฉํ•ด์•ผํ•  ํ•œ ๊ฐ€์ง€ ์‚ฌํ•ญ :
๋ธŒ๋ผ์šฐ์ €์™€ Node๊ฐ„์— ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ˜ธ์ŠคํŠธ๋Š” ๋ชจ๋“ˆ ์ง€์ •์ž ๋ฌธ์ž์—ด์„ ํ•ด์„ํ•˜๋Š” ๊ณ ์œ  ํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ”Œ๋žซํผ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ชจ๋“ˆ ํ•ด์ƒ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜(module resolution algorithm)์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Node์—์„œ ์ž‘๋™ํ•˜๋Š” ์ผ๋ถ€ ๋ชจ๋“ˆ ์ง€์ •์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ์ง€์†์ ์ธ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ชจ๋“ˆ ์ง€์ •์ž๋กœ URL ๋งŒ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น URL์—์„œ ๋ชจ๋“ˆ ํŒŒ์ผ์„๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ž˜ํ”„ ์ „์ฒด๊ฐ€ ๋™์‹œ์— ๊ทธ๋Ÿฐ ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋ถ„์„์„ ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ชจ๋“ˆ์ด ์–ด๋–ค ์ข…์†์„ฑ์„ ํ•„์š”๋กœ ํ•˜๋Š”์ง€๋„ ๋ชจ๋ฅด๊ณ ... ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๊นŒ์ง€๋Š” ๋ถ„์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฆ‰, ํŠธ๋ฆฌ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ถ„์„ํ•œ ๋‹ค์Œ ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•œ ํ›„ ์ข…์†์„ฑ์„ ํŒŒ์•…ํ•ด์„œ ํ•ด๋‹น ์ข…์†์„ฑ์„ ์ฐพ์•„๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋“ค ํŒŒ์ผ ๊ฐ๊ฐ์„ ๋‹ค์šด๋กœ๋“œ ํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผํ•œ๋‹ค๋ฉด ๋งŽ์€ ๋‹ค๋ฅธ ์ž‘์—…๋“ค์ด ๋Œ€๊ธฐ์—ด์— ์Œ“์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘์—… ํ•  ๋•Œ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Based on this chart.

์ด์™€ ๊ฐ™์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Š๋ฆฐ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด 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 ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์›ํ™œํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ ์ž‘์—…์ด ์•ž์œผ๋กœ ๋” ์ข‹์•„ ์ง€๋ฆฌ๋ผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.