Skip to content

Commit

Permalink
Merge pull request #1265 from nincoding/nincoding
Browse files Browse the repository at this point in the history
48์žฅ ๋ชจ๋“ˆ - ํ•œ์ˆ˜์ง€
  • Loading branch information
Ryan-Dia authored Jan 24, 2024
2 parents fcca384 + 0cbadcb commit fe77afb
Showing 1 changed file with 169 additions and 0 deletions.
169 changes: 169 additions & 0 deletions docs/48_๋ชจ๋“ˆ/ํ•œ์ˆ˜์ง€.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
## 48์žฅ. โœจ ๋ชจ๋“ˆ(Module)

### ๐Ÿ“Œ 48-1. ๋ชจ๋“ˆ์˜ ์ผ๋ฐ˜์  ์˜๋ฏธ

> **๋ชจ๋“ˆ**์ด๋ž€ **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ณ„์  ์š”์†Œ๋กœ์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐ๊ฐ**์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆ์€ `๊ธฐ๋Šฅ์„ ๊ธฐ์ค€`์œผ๋กœ `ํŒŒ์ผ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ`ํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋ชจ๋“ˆ์ด ์„ฑ๋ฆฝํ•˜๋ ค๋ฉด ๋ชจ๋“ˆ์€ `์ž์‹ ๋งŒ์˜ ํŒŒ์ผ ์Šค์ฝ”ํ”„(๋ชจ๋“ˆ ์Šค์ฝ”ํ”„)`๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

**์ž์‹ ๋งŒ์˜ ํŒŒ์ผ ์Šค์ฝ”ํ”„**๋ฅผ ๊ฐ–๋Š” **๋ชจ๋“ˆ์˜ ์ž์‚ฐ**(๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๊ฐ์ฒด ๋“ฑ)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ **๋น„๊ณต๊ฐœ ์ƒํƒœ**์ž…๋‹ˆ๋‹ค.

์ž์‹ ๋งŒ์˜ ํŒŒ์ผ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ์ž์‚ฐ์€ `์บก์Šํ™”`๋˜์–ด **๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.**

์ฆ‰, ๋ชจ๋“ˆ์€ ๊ฐœ๋ณ„์  ์กด์žฌ๋กœ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์˜ํ•ด `์žฌ์‚ฌ์šฉ๋˜์–ด์•ผ ์˜๋ฏธ`๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

> ๋”ฐ๋ผ์„œ, **๋ชจ๋“ˆ์€ ๊ณต๊ฐœ๊ฐ€ ํ•„์š”ํ•œ ์ž์‚ฐ์— ํ•œ์ •ํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ์  ๊ณต๊ฐœ๊ฐ€ ๊ฐ€๋Šฅ**ํ•ฉ๋‹ˆ๋‹ค. (= `export`)
**export(๊ณต๊ฐœ)๋œ ๋ชจ๋“ˆ์˜ ์ž์‚ฐ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์žฌ์‚ฌ์šฉ**ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ, ์ด๋•Œ **๊ณต๊ฐœ๋œ ๋ชจ๋“ˆ์˜ ์ž์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์„ ๋ชจ๋“ˆ ์‚ฌ์šฉ์ž**๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

> ๋ชจ๋“ˆ ์‚ฌ์šฉ์ž๋Š” **๋ชจ๋“ˆ์ด ๊ณต๊ฐœํ•œ ์ž์‚ฐ ์ค‘ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ์„ ํƒํ•ด ์ž์‹ ์˜ ์Šค์ฝ”ํ”„ ๋‚ด๋กœ ๋ถˆ๋Ÿฌ๋“ค์—ฌ ์žฌ์‚ฌ์šฉ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (= `import`)
๋ชจ๋“ˆ์€ ์ฝ”๋“œ์˜ ๋‹จ์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹์•„์„œ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

---

### ๐Ÿ“Œ 48-2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ชจ๋“ˆ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋“ˆ์ด ์„ฑ๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒŒ์ผ ์Šค์ฝ”ํ”„์™€ import, export๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” script ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, `์™ธ๋ถ€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œ`ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ `ํŒŒ์ผ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.`

์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜์—ฌ script ํƒœ๊ทธ๋กœ ๋กœ๋“œํ•ด๋„ ๋ถ„๋ฆฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์€ ๊ฒฐ๊ตญ **ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋‚ด์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘**ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š”, **๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ํ•˜๋‚˜์˜ ์ „์—ญ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ**ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์ œ์•ˆ๋œ ๊ฒƒ์ด CommonJS์™€ AMD์ž…๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ํฌ๊ฒŒ CommonJS์™€ AMD ์ง„์˜์œผ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋˜์—ˆ๊ณ , ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” CommonJS์™€ AMD๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“ˆ ๋กœ๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

`์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ธ Node.js`๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์ธ `CommonJS`๋ฅผ ์ฑ„ํƒํ–ˆ๊ณ , ๋…์ž์ ์ธ ์ง„ํ™”๋ฅผ ๊ฑฐ์ณ ๊ธฐ๋ณธ์ ์œผ๋กœ CommonJS ์‚ฌ์–‘์„ ๋”ฐ๋ฅด๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.

> Node.js๋Š” ECMAScript ํ‘œ์ค€ ์‚ฌ์–‘์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ **Node.js ํ™˜๊ฒฝ์—์„œ๋Š” ํŒŒ์ผ๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ ์Šค์ฝ”ํ”„**(๋ชจ๋“ˆ ์Šค์ฝ”ํ”„)๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

---

### ๐Ÿ“Œ 48-3. ES6 ๋ชจ๋“ˆ(ESM)

ES6์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

IE๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ES6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```html
<script type="module" src="app.mjs"></script>
```

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ, script ํƒœ๊ทธ์˜ `type='module'` ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋กœ๋“œ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ๋ชจ๋“ˆ๋กœ์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹Œ, ESM์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŒŒ์ผ ํ™•์žฅ์ž๋ช…์„ mjs๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ)

ESM์—๋Š” ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ strict mode๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

#### ๐Ÿ”Ž ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„

> ESM์€ **๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„**๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ script ํƒœ๊ทธ๋กœ ๋ถ„๋ฆฌํ•ด๋„, ํ•˜๋‚˜์˜ ์ „์—ญ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ค‘๋ณต๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ESM ํŒŒ์ผ์€ ์ž์ฒด์˜ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๊ณต์œ ๋˜๋Š” ์ „์—ญ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

#### ๐Ÿ”Ž export ํ‚ค์›Œ๋“œ

์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋“ฏ์ด, ๋ชจ๋“ˆ์€ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ **๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ชจ๋“  ์‹๋ณ„์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์ฐธ์กฐ**ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ์‹๋ณ„์ž๋ฅผ ์™ธ๋ถ€๋กœ ๊ณต๊ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด `export` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

```js
// export์˜ ์˜ˆ์‹œ
export const name = 'foo';

export function sum {

}
export class Person {

}
```

์„ ์–ธ๋ฌธ ์•ž์— ๋งค๋ฒˆ `export`ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋ฉด, exportํ•  ๋Œ€์ƒ์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํ•œ๋ฒˆ์— export ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```js
const name = 'foo';

function sum {

}
class Person {

}

// exportํ•  ๋Œ€์ƒ์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋‚ด๋ณด๋‚ด๊ธฐ
export {name, sum, Person}
```

์ถ”๊ฐ€์ ์œผ๋กœ ๋ชจ๋“ˆ์—์„œ ํ•˜๋‚˜์˜ ๋Œ€์ƒ๋งŒ์„ exportํ•  ๊ฒฝ์šฐ `default`ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```js
class Person {}

export default Person;
```

`default`ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, `var, let, const`ํ‚ค์›Œ๋“œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

#### ๐Ÿ”Ž import ํ‚ค์›Œ๋“œ

๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ export(๊ณต๊ฐœ)ํ•œ ์‹๋ณ„์ž๋ฅผ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„ ๋‚ด๋ถ€๋กœ ๋กœ๋“œํ•˜๋ ค๋ฉด import ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž ์ด๋ฆ„์œผ๋กœ importํ•ด์•ผ ํ•˜๋ฉฐ ESM์˜ ๊ฒฝ์šฐ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

```js
// export.js - ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ
const name = 'foo';

function sum {

}
class Person {

}

export {name, sum, Person}

// import.js - ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ํŒŒ์ผ
import {name, sum, Person} from './export.js'
```

์ฐธ๊ณ ๋กœ, ๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ import ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

```js
// export.js - ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ
const name = 'foo';

function sum {

}
class Person {

}

export {name, sum, Person}

// import.js - ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ํŒŒ์ผ
// as๋กœ ๋’ค์— ์ด๋ฆ„์œผ๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๊ธฐ
import {name as NAME, sum, Person} from './export.js'

// export๋œ ์ž์› ํ•œ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
// *๋Š” ๋ชจ๋“  ์ž์›์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
// as๋ฅผ ํ†ตํ•ด ๋’ค์— obj๊ฐ์ฒด์— ๋ชจ๋“  ์ž์›์„ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹นํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
import * as obj from './export.js';
```

import ๋˜๋Š” ์‹๋ณ„์ž๋Š” as ๋’ค์— ์ง€์ •ํ•œ ์ด๋ฆ„์˜ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

0 comments on commit fe77afb

Please sign in to comment.