๐Ÿ“– ๋ชจ๋“ˆ์˜ ์ผ๋ฐ˜์  ์˜๋ฏธ

c_yjยท2022๋…„ 7์›” 24์ผ
0

DeepDive

๋ชฉ๋ก ๋ณด๊ธฐ
42/42

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

์ž์‹ ๋งŒ์˜ ํŒŒ์ผ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ์ž์‚ฐ์€ ์บก์Šํ™”๋˜์–ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋ชจ๋“ˆ์€ ๊ฐœ๋ณ„์  ์กด์žฌ๋กœ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ์กด์žฌํ•œ๋‹ค.

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

๊ณต๊ฐœ๋œ ๋ชจ๋“ˆ์˜ ์ž์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์„ ๋ชจ๋“ˆ ์‚ฌ์šฉ์ž๋ผ ํ•œ๋‹ค. ๋ชจ๋“ˆ ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“ˆ์ด ๊ณต๊ฐœํ•œ ์ž์‚ฐ ์ค‘ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ์„ ํƒํ•ด ์ž์‹ ์˜ ์Šค์ฝ”ํ”„ ๋‚ด๋กœ ๋ถˆ๋Ÿฌ๋“ค์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ import๋ผ ํ•œ๋‹ค.

๋ชจ๋“ˆ์€ ์ฝ”๋“œ์˜ ๋‹จ์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹์•„์„œ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ชจ๋“ˆ ๐Ÿ˜ƒ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋ฅผ ๋ชฉ์ ์œผ๋กœ ํƒœ์–ด๋‚ฌ๋‹ค. ์ด๋Ÿฌํ•œ ํƒœ์ƒ์  ํ•œ๊ณ„๋กœ ์ธํ•ด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋น„๊ตํ•  ๋–„ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋“ˆ์ด ์„ฑ๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒŒ์ผ ์Šค์ฝ”ํ”„์™€ import, export๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•˜๋‹ค.

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

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

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

ES6 ๋ชจ๋“ˆ(ESM) ๐Ÿ˜‰

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ES6์—์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค. IE๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ES6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
script ํƒœ๊ทธ์— type="module" ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋กœ๋“œ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ๋ชจ๋“ˆ๋กœ์„œ ๋™์ž‘ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹Œ ESM์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ESM์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋Š” mjs๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

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

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

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

ESM์€ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค. ESM์ด ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ script ํƒœ๊ทธ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋กœ๋“œํ•ด๋„ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.

// foo.js
// x ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋‹ค.
var x = 'foo';
console.log(window.x); // foo
// bar.js
// x ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋‹ค. foo.js์—์„œ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜ x์™€ ์ค‘๋ณต๋œ ์„ ์–ธ์ด๋‹ค.
var x = 'bar';

// foo.js์—์„œ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜ x์˜ ๊ฐ’์ด ์žฌํ• ๋‹น๋˜์—ˆ๋‹ค.
console.log(window.x); //bar
<!DOCTYPE html>
<html>
<body>
  <script src="foo.js"></script>
  <script src="bar.js"></script>
</body>
</html>

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

ESM์€ ํŒŒ์ผ ์ž์ฒด์˜ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ ๋‚ด์—์„œ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋”๋Š” ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋„ ์•„๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ๋‚ด์—์„œ ์„ ์–ธํ•œ ์‹๋ณ„์ž๋Š” ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

export ํ‚ค์›Œ๋“œ ๐ŸŸฃ

๋ชจ๋“ˆ์€ ๋…์ž์ ์ธ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ชจ๋“  ์‹๋ณ„์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ใ…Ž๋Œ€ใ…ใ…‡ ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ์‹๋ณ„์ž๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜์—ฌ ๋‹ค๋ฅด๋ชจ๋“ˆ๋“ค์ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด export ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

export ํ‚ค์›Œ๋“œ๋Š” ์„ ์–ธ๋ฌธ ์•ž์— ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋กœ์จ ๋ฒผ๋ˆ—, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ ๋ชจ๋“  ์‹๋ณ„์ž๋ฅผ exportํ•  ์ˆ˜ ์žˆ๋‹ค.

// lib.mjs
// ๋ณ€์ˆ˜์˜ ๊ณต๊ฐœ
export const pi = Math.PI;

// ํ•จ์ˆ˜์˜ ๊ณต๊ฐœ
export function square(x) {
  return x * x;
}

// ํด๋ž˜์Šค์˜ ๊ณต๊ฐœ
export class Person {
  constructor(name) {
    this.name = name;
  }
}

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

import ํ‚ค์›Œ๋“œ ๐ŸŸฃ

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

// app.mjs
// ๊ฐ™์€ ํด๋” ๋‚ด์˜ lib.mjs ๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž ์ด๋ฆ„์œผ๋กœ importํ•œ๋‹ค.
// ESM์˜ ๊ฒฝ์šฐ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.
import { pi, square, Person } from './lib.mjs';

console.log(pi);
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person {name : 'Lee'}
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="app.mjs"></script>
</html>
</body>

์œ„ ์˜ˆ์ œ์˜ app.mjs๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ script ํƒœ๊ทธ๋กœ ๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ lib.mjs๋Š” app.mjs์˜ import ๋ฌธ์— ์˜ํ•ด ๋กœ๋“œ๋˜๋Š” ์˜์กด์„ฑ์ด๋‹ค. ๋”ฐ๋ผ์„œ lib.mjs๋Š” script ํƒœ๊ทธ๋กœ ๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž ์ด๋ฆ„์„ ์ผ์ผ์ด ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ์ด๋ฆ„์œผ๋กœ ํ•œ ๋ฒˆ์— importํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋•Œ import๋˜๋Š” ์‹๋ณ„์ž๋Š” as ๋’ค์— ์ง€์ •ํ•œ ์ด๋ฆ„์˜ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น๋œ๋‹ค.

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

๋ชจ๋“ˆ์—์„œ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ exportํ•œ๋‹ค๋ฉด default ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. default ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฆ„ ์—†์ด ํ•˜๋‚˜์˜ ๊ฐ’์„ epxortํ•œ๋‹ค.

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

default ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ exportํ•œ ๋ชจ๋“ˆ์€ {} ์—†์ด ์ž„์˜์˜ ์ด๋ฆ„์œผ๋กœ importํ•œ๋‹ค.

profile
FrontEnd Developer

0๊ฐœ์˜ ๋Œ“๊ธ€