From dfda5bf945571afd2b410b16ca1c1233d043dea4 Mon Sep 17 00:00:00 2001 From: ccconac Date: Thu, 25 Jan 2024 04:16:06 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EB=AA=A8=EB=93=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\353\254\270\354\206\214\355\235\254.md" | 187 ++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 "docs/48_\353\252\250\353\223\210/\353\254\270\354\206\214\355\235\254.md" diff --git "a/docs/48_\353\252\250\353\223\210/\353\254\270\354\206\214\355\235\254.md" "b/docs/48_\353\252\250\353\223\210/\353\254\270\354\206\214\355\235\254.md" new file mode 100644 index 00000000..fed520c5 --- /dev/null +++ "b/docs/48_\353\252\250\353\223\210/\353\254\270\354\206\214\355\235\254.md" @@ -0,0 +1,187 @@ +# ๐Ÿš€ ๋ชจ๋“ˆ + +## ๐Ÿ”Ž 1. ๋ชจ๋“ˆ์˜ ์ผ๋ฐ˜์  ์˜๋ฏธ + +> ๋ชจ๋“ˆmodule์ด๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ณ„์  ์š”์†Œ๋กœ์„œ _์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋งํ•œ๋‹ค._ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆ์€ ๊ธฐ๋Šฅ์„ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์ผ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š”๋ฐ, ๋ชจ๋“ˆ์ด ์„ฑ๋ฆฝํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋ชจ๋“ˆ์€ ์ž์‹ ๋งŒ์˜ **ํŒŒ์ผ ์Šค์ฝ”ํ”„๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ** ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. + +์ž์‹ ๋งŒ์˜ ํŒŒ์ผ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ์ž์‚ฐ๋ชจ๋“ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๊ฐ์ฒด ๋“ฑ์€ ์บก์Šํ™”๋˜์–ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, _๋ชจ๋“ˆ์€ ๊ฐœ๋ณ„์  ์กด์žฌ๋กœ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ์กด์žฌํ•œ๋‹ค._ ํ•˜์ง€๋งŒ ๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์˜ํ•ด ์žฌ์‚ฌ์šฉ๋˜์–ด์•ผ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ **๊ณต๊ฐœ๊ฐ€ ํ•„์š”ํ•œ ์ž์‚ฐ์— ํ•œ์ •ํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ์  ๊ณต๊ฐœ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฅผ export๋ผ๊ณ  ํ•œ๋‹ค.** + +๊ณต๊ฐœexport๋œ ๋ชจ๋“ˆ์˜ ์ž์‚ฐ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์„ ๋ชจ๋“ˆ ์‚ฌ์šฉ์žmodule consumer๋ผ๊ณ  ํ•œ๋‹ค. **๋ชจ๋“ˆ ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“ˆ์ด ๊ณต๊ฐœexportํ•œ ์ž์‚ฐ ์ค‘ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ์„ ํƒํ•ด ์ž์‹ ์˜ ์Šค์ฝ”ํ”„ ๋‚ด๋กœ ๋ถˆ๋Ÿฌ๋“ค์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ import๋ผ ํ•œ๋‹ค.** + +๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด _์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ• _ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹์•„ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”Ž 2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ชจ๋“ˆ + +> ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” script ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ์™ธ๋ถ€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ _ํŒŒ์ผ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค._ + +์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด script ํƒœ๊ทธ๋กœ ๋กœ๋“œํ•ด๋„ ๋ถ„๋ฆฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์€ ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋‚ด์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. _์ฆ‰, ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ์ „์—ญ์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฆฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด_ ์ด๊ฒƒ์œผ๋กœ๋Š” ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. + +์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ, ์ฆ‰ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์— ๊ตญํ•œํ•˜์ง€ ์•Š๊ณ  ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์›€์ง์ž„์ด ์ƒ๊ธฐ๋ฉด์„œ ์ œ์•ˆ๋œ ๊ฒƒ์ด CommonJS์™€ AMDAsynchronous Module Definition๋‹ค. + +์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ธ `Node.js`๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ CommonJS๋ฅผ ์ฑ„ํƒํ•ด ์™„์ „ํžˆ ๋™์ผํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ CommonJS ์‚ฌ์–‘์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค. ์ฆ‰, ECMAScript ํ‘œ์ค€ ์‚ฌ์–‘์€ ์•„๋‹ˆ์ง€๋งŒ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•ด ํŒŒ์ผ๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ ์Šค์ฝ”ํ”„๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค. + +## ๐Ÿ”Ž 3. ES6 ๋ชจ๋“ˆ (ESM) + +> ES6์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค. script ํƒœ๊ทธ์— `type="module"` ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋กœ๋“œ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ๋ชจ๋“ˆ๋กœ์„œ ์ž‘๋™ํ•œ๋‹ค. + +์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹Œ ESM์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ํ™•์žฅ์ž๋Š” mjs๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค. ESM์—๋Š” ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ strict mode๊ฐ€ ์ ์šฉ๋œ๋‹ค. + +```html + +``` + +### ๐Ÿ’ฌ 1. ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„ + +> ESM์€ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค. + +์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ script ํƒœ๊ทธ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋กœ๋“œํ•ด๋„ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค. script ํƒœ๊ทธ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋กœ๋“œ๋œ 2๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋‚ด์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด ํ•˜๋‚˜์˜ ์ „์—ญ์„ ๊ณต์œ ํ•œ๋‹ค. ์ฆ‰, x ๋ณ€์ˆ˜๋Š” ์ค‘๋ณต ์„ ์–ธ๋˜๋ฉฐ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฎ์–ด์จ์ง€๋Š” ๊ฒƒ์ด๋‹ค. ๐Ÿšจ + +```javascript +// foo.js +var x = 'foo'; +console.log(window.x); // foo +``` + +```javascript +// bar.js +var x = 'bar'; +console.log(window.x); // bar (์žฌํ• ๋‹น) +``` + +```html + + + + + + + +``` + +ESM์€ ํŒŒ์ผ ์ž์ฒด์˜ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋ชจ๋“ˆ ๋‚ด์—์„œ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋”๋Š” ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋„ ์•„๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“ˆ ๋‚ด์—์„œ ์„ ์–ธํ•œ ์‹๋ณ„์ž๋Š” ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. + +```mjs +// foo.mjs +var x = 'foo'; +var y = 'test'; + +console.log(x); // foo +console.log(window.x); // undefined +``` + +```mjs +// bar.mjs +var x = 'bar'; // foo.mjs์—์„œ ์„ ์–ธํ•œ x ๋ณ€์ˆ˜์™€ ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜ + +console.log(x); // bar +console.log(window.x); // undefined + +console.log(y); // ReferenceError: y is not defined +``` + +```html + + + + + + + +``` + +### ๐Ÿ’ฌ 2. export ํ‚ค์›Œ๋“œ + +> ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ์‹๋ณ„์ž๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด export ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์„ ์–ธ๋ฌธ ์•ž์— ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ ๋ชจ๋“  ์‹๋ณ„์ž๋ฅผ exportํ•  ์ˆ˜ ์žˆ๋‹ค. + +```mjs +// lib.mjs +export const pi = Math.PI; // ๋ณ€์ˆ˜์˜ ๊ณต๊ฐœ + +// ํ•จ์ˆ˜์˜ ๊ณต๊ฐœ +export function square(x) { + return x * x; +} + +// ํด๋ž˜์Šค์˜ ๊ณต๊ฐœ +export class Person { + constructor(name) { + this.name = name; + } +} +``` + +exportํ•  ๋Œ€์ƒ์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํ•œ ๋ฒˆ์— exportํ•  ์ˆ˜๋„ ์žˆ๋‹ค. + +```mjs +const pi = Math.PI; + +function square(x) { + return x * x; +} + +class Person { + constructor(name) { + this.name = name; + } +} + +export { pi, square, Person }; +``` + +### ๐Ÿ’ฌ 3. import ํ‚ค์›Œ๋“œ + +> ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ๊ณต๊ฐœํ•œ ์‹๋ณ„์ž๋ฅผ ์ž์‹ ์˜ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„ ๋‚ด๋ถ€๋กœ ๋กœ๋“œํ•˜๋ ค๋ฉด import ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž ์ด๋ฆ„์œผ๋กœ importํ•ด์•ผ ํ•˜๋ฉฐ _ESM์˜ ๊ฒฝ์šฐ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค._ + +์•„๋ž˜ ์˜ˆ์ œ์˜ `app.mjs`๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ script ํƒœ๊ทธ๋กœ ๋กœ๋“œํ•ด์•ผ ํ•˜์ง€๋งŒ, `lib.mjs`๋Š” `app.mjs`์˜ import ๋ฌธ์— ์˜ํ•ด ๋กœ๋“œ๋˜๋Š” ์˜์กด์„ฑ์ด๋ฏ€๋กœ script ํƒœ๊ทธ๋กœ ๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. + +```mjs +import { pi, square, Person } from './lib.mjs'; + +console.log(pi); // 3.141592653589793 +console.log(square(10)); // 100 +console.log(new Person('Lee')); // Person { name: "Lee" } +``` + +```html + + + + + + +``` + +ํ•˜๋‚˜์˜ ์ด๋ฆ„์œผ๋กœ ํ•œ ๋ฒˆ์— importํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋•Œ import๋˜๋Š” ์‹๋ณ„์ž๋Š” as ๋’ค์— ์ง€์ •ํ•œ ์ด๋ฆ„์˜ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น๋œ๋‹ค. ๋˜ํ•œ ๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ด importํ•  ์ˆ˜๋„ ์žˆ๋‹ค. + +```mjs +import * as lib from './lib.mjs'; +// import { pi as PI, square as sq, Person as P } from './lib.mjs'; + +console.log(lib.pi); // 3.141592653589793 +console.log(lib.square(10)); // 100 +console.log(new lib.Person('Lee')); // Person { name: "Lee" } +``` + +๋ชจ๋“ˆ์—์„œ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ exportํ•œ๋‹ค๋ฉด default ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฆ„ ์—†์ด ํ•˜๋‚˜์˜ ๊ฐ’์„ exportํ•œ๋‹ค. ๋‹จ, default ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ var, let, const ํ‚ค์›Œ๋“œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. + +```mjs +// lib.mjs +export default (x) => x * x; + +export default const foo = () => {}; +// => SyntaxError: Unexpected token 'const' +// export default () => {}; +``` + +default ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ exportํ•œ ๋ชจ๋“ˆ์€ {} ์—†์ด ์ž„์˜์˜ ์ด๋ฆ„์œผ๋กœ importํ•œ๋‹ค. + +```mjs +// app.mjs +import square from './lib.mjs'; + +console.log(square(3)); // 9 +``` + +## ๐Ÿ‘€ REFERENCE + +๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive 48์žฅ ๋ชจ๋“ˆ