Skip to content

Commit

Permalink
Merge pull request #1266 from narinn-star/narinn-star
Browse files Browse the repository at this point in the history
48์žฅ ๋ชจ๋“ˆ - ๋‚˜์„ธํ˜„
  • Loading branch information
Ryan-Dia authored Jan 24, 2024
2 parents fe77afb + b7d7a68 commit ecaa9fa
Showing 1 changed file with 112 additions and 0 deletions.
112 changes: 112 additions & 0 deletions docs/48_๋ชจ๋“ˆ/์ด๋‚˜๋ฆฐ.md
Original file line number Diff line number Diff line change
@@ -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
<!DOCTYPE html>
<html>
<body>
<script src="foo.js"></script>
<script src="bar.js"></script>
</body>
</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
<!DOCTYPE html>
<html>
<body>
<script type="module" src="foo.mjs"></script>
<script type="module" src="bar.mjs"></script>
</body>
</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ํ•œ๋‹ค.

0 comments on commit ecaa9fa

Please sign in to comment.