diff --git "a/docs/48_\353\252\250\353\223\210/\354\235\264\353\202\230\353\246\260.md" "b/docs/48_\353\252\250\353\223\210/\354\235\264\353\202\230\353\246\260.md" new file mode 100644 index 00000000..90327b77 --- /dev/null +++ "b/docs/48_\353\252\250\353\223\210/\354\235\264\353\202\230\353\246\260.md" @@ -0,0 +1,112 @@ +# ๐ฏ 48 ๋ชจ๋ + +[48.1 ๋ชจ๋์ ์ผ๋ฐ์ ์๋ฏธ](#1-๋ชจ๋์-์ผ๋ฐ์ -์๋ฏธ) +[48.2 ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋](#2-์๋ฐ์คํฌ๋ฆฝํธ์-๋ชจ๋) +[48.3 ES6 ๋ชจ๋(ESM)](#3-es6-๋ชจ๋esm) + +## 1. ๋ชจ๋์ ์ผ๋ฐ์ ์๋ฏธ + +**๋ชจ๋?** + +์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๊ฐ๋ณ์ ์์๋ก์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ ์กฐ๊ฐ์ ๋งํ๋ค. +์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋์ ๊ธฐ๋ฅ์ ๊ธฐ์ค์ผ๋ก ํ์ผ ๋จ์๋ก ๋ถ๋ฆฌํ๋ค. ์ด๋ ๋ชจ๋์ด ์ฑ๋ฆฝํ๋ ค๋ฉด ๋ชจ๋์ ์์ ๋ง์ ํ์ผ ์ค์ฝํ(๋ชจ๋ ์ค์ฝํ)๋ฅผ ๊ฐ์ง ์ ์์ด์ผ ํ๋ค. + +์์ ๋ง์ ํ์ผ ์ค์ฝํ๋ฅผ ๊ฐ๋ ๋ชจ๋์ ๋ชจ๋ ์์ฐ์ ์บก์ํ๋์ด ๋ค๋ฅธ ๋ชจ๋์์ ์ ๊ทผํ ์ ์๋ค. ์ฆ, ๋ชจ๋์ ๊ฐ๋ณ์ ์กด์ฌ๋ก์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ถ๋ฆฌ๋์ด ์กด์ฌํ๋ค. + +๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ค๋ฅธ ๋ชจ๋์ ์ํด ์ฌ์ฌ์ฉ๋์ด์ผ ์๋ฏธ๊ฐ ์๋ค. ๋ฐ๋ผ์ ๋ชจ๋์ ๊ณต๊ฐ๊ฐ ํ์ํ ์์ฐ์ ํ์ ํ์ฌ ๋ช ์์ ์ผ๋ก ์ ํ์ ๊ณต๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ฅผ *export*๋ผ ํ๋ค. + +๊ณต๊ฐ๋ ๋ชจ๋์ ์์ฐ์ ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ณต๊ฐ๋ ๋ชจ๋์ ์์ฐ์ ์ฌ์ฉํ๋ ๋ชจ๋์ ๋ชจ๋ ์ฌ์ฉ์๋ผ ํ๋ค. ๋ชจ๋ ์ฌ์ฉ์๋ ๋ชจ๋์ด ๊ณต๊ฐํ ์์ฐ ์ค ์ผ๋ถ ๋๋ ์ ์ฒด๋ฅผ ์ ํํด ์์ ์ ์ค์ฝํ ๋ด๋ก ๋ถ๋ฌ๋ค์ฌ ์ฌ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ *import*๋ผ ํ๋ค. + +๐๐ป ์ฝ๋์ ๋จ์๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ ์ ์๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ์ข์์ ๊ฐ๋ฐ ํจ์จ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์๋ค. + +## 2. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ + +์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ์์คํ ์ ์ง์ํ์ง ์๋๋ค. ๋ชจ๋์ด ์ฑ๋ฆฝํ๊ธฐ ์ํด ํ์ํ ํ์ผ ์ค์ฝํ์ import, export๋ฅผ ์ง์ํ์ง ์์๋ค. + +์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์ผ์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ๋ก ๋ถ๋ฆฌํด script ํ๊ทธ๋ก ๋ก๋ํด๋ ๋ถ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ค์ ๊ฒฐ๊ตญ ํ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ด์ ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค. ์ฆ, ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ์ ์ญ์ ๊ณต์ ํ๋ค. ์ด๋ ์ ์ญ ๋ณ์๊ฐ ์ค๋ณต๋๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. + +๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ๊ตญํํ์ง ์๊ณ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ ์์ง์์ด ์๊ธฐ๋ฉด์ ๋ชจ๋ ์์คํ ์ ๋ฐ๋์ ํด๊ฒฐํด์ผ ํ๋ ํต์ฌ ๊ณผ์ ๊ฐ ๋์๊ณ CommonJS์ AMD(Asynchronous Module Definition)์ด ์ ์๋๋ค. + +Node.js๋ ๋ชจ๋ ์์คํ ์ ์ฌ์ค์ ํ์ค์ธ CommonJS๋ฅผ ์ฑํํ๊ณ , ํ์ฌ๋ 100% ๋์ผํ์ง ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก CommonJS ์ฌ์์ ๋ฐ๋ฅด๊ณ ์๋ค. ์ฆ, Node.js๋ ECMAScript ํ์ค ์ฌ์์ ์๋์ง๋ง ๋ชจ๋ ์์คํ ์ ์ง์ํ๋ค. ๋ฐ๋ผ์ Node.js ํ๊ฒฝ์์๋ ํ์ผ๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ํ์ผ ์ค์ฝํ(๋ชจ๋ ์ค์ฝํ)๋ฅผ ๊ฐ๋๋ค. + +## 3. ES6 ๋ชจ๋(ESM) + +ESM์ script ํ๊ทธ์ type="module" ์ดํธ๋ฆฌ๋ทฐํธ๋ง ์ถ๊ฐํ๋ฉด ๋ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ชจ๋๋ก์ ๋์ํ๋ค. ์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋ ESM์์ ๋ช ํํ๊ธฐ ์ํด ESM์ ํ์ผ ํ์ฅ์๋ mjs๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ค. + +ESM์๋ ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ณธ์ ์ผ๋ก strict mode๊ฐ ์ ์ฉ๋๋ค. + +### 3.1 ๋ชจ๋ ์ค์ฝํ + +ESM์ ๋ ์์ ์ธ ๋ชจ๋ ์ค์ฝํ๋ฅผ ๊ฐ๋๋ค. ESM์ด ์๋ ์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ script ํ๊ทธ๋ก ๋ถ๋ฆฌํด์ ๋ก๋ํด๋ ๋ ์์ ์ธ ๋ชจ๋ ์ค์ฝํ๋ฅผ ๊ฐ์ง ์๋๋ค. + +```javascript +// foo.js +// x ๋ณ์๋ ์ ์ญ ๋ณ์๋ค. +var x = 'foo'; +console.log(window.x); // foo +``` + +```javascript +// bar.js +// x ๋ณ์๋ ์ ์ญ ๋ณ์๋ค. foo.js์ ์ ์ธํ ์ ์ญ ๋ณ์ x์ ์ค๋ณต๋ ์ ์ธ์ด๋ค. +var x = 'bar'; + +// foo.js์์ ์ ์ธํ ์ ์ญ ๋ณ์ x์ ๊ฐ์ด ์ฌํ ๋น๋์๋ค. +console.log(window.x); // bar +``` + +```html + + +
+ + + + +``` + +์ ์์ ์ HTML์์ script ํ๊ทธ๋ก ๋ถ๋ฆฌํด ๋ก๋๋ 2๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ด์ ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค. ๋ฐ๋ผ์ foo.js์์ ์ ์ธํ x ๋ณ์์ bar.js์์ ์ ์ธํ x ๋ณ์๋ ์ค๋ณต ์ ์ธ๋๋ฉฐ ์๋์น ์๊ฒ x ๋ณ์์ ๊ฐ์ด ๋ฎ์ด์จ์ง๋ค. + +ESM์ ํ์ผ ์์ฒด์ ๋ ์์ ์ธ ๋ชจ๋ ์ค์ฝํ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ด์์ var ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ๋์ด์ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค. + +```javascript +// foo.mjs +// x ๋ณ์๋ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค. +var x = 'foo'; +console.log(x); // foo +console.log(window.x); // undefined +``` + +```javascript +// bar.mjs +// x ๋ณ์๋ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค. +// foo.mjs์์ ์ ์ธํ x ๋ณ์์ ์ค์ฝํ๊ฐ ๋ค๋ฅธ ๋ณ์๋ค. +var x = 'bar'; +console.log(x); // bar +console.log(window.x); // undefined +``` + +```html + + + + + + + +``` + +๋ชจ๋ ๋ด์์ ์ ์ธํ ์๋ณ์๋ ๋ชจ๋ ์ค์ฝํ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ธ๋ถ์์ ์ฐธ์กฐํ ์๋ ์๋ค. + +### 3.2 export ํค์๋ + +๋ชจ๋์ ๋ ์์ ์ธ ๋ชจ๋ ์ค์ฝํ๋ฅผ ๊ฐ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๋ด๋ถ์์ ์ ์ธํ ๋ชจ๋ ์๋ณ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋ชจ๋ ๋ด๋ถ์์๋ง ์ฐธ์กฐํ ์ ์๋ค. ๋ชจ๋ ๋ด๋ถ์์ ์ ์ธํ ์๋ณ์๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ์ฌ ๋ค๋ฅธ ๋ชจ๋๋ค์ด ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ค๋ฉด export ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. + +### 3.3 import ํค์๋ + +๋ค๋ฅธ ๋ชจ๋์์ ๊ณต๊ฐ(export)ํ ์๋ณ์๋ฅผ ์์ ์ ๋ชจ๋ ์ค์ฝํ ๋ด๋ถ๋ก ๋ก๋ํ๋ ค๋ฉด import ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ๋ค๋ฅธ ๋ชจ๋์ด exportํ ์๋ณ์ ์ด๋ฆ์ผ๋ก importํด์ผ ํ๋ฉฐ ESM์ ๊ฒฝ์ฐ **ํ์ผ ํ์ฅ์๋ฅผ ์๋ต**ํ ์ ์๋ค. + +- ๋ชจ๋์ด exportํ ์๋ณ์ ์ด๋ฆ์ ๋ณ๊ฒฝํด import ํ ์๋ ์๋ค. +- ๋ชจ๋์์ ํ๋์ ๊ฐ๋ง exportํ๋ค๋ฉด default ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. default ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฆ ์์ด ํ๋์ ๊ฐ์ exportํ๋ค. +- defualt ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ var, let, const ํค์๋๋ ์ฌ์ฉํ ์ ์๋ค. +- default ํค์๋์ ํจ๊ป exportํ ๋ชจ๋์ {}์์ด ์์์ ์ด๋ฆ์ผ๋ก importํ๋ค.