관리 메뉴

Daehyunii's Dev-blog

48μž₯ λͺ¨λ“ˆ λ³Έλ¬Έ

48.1 λͺ¨λ“ˆμ˜ 일반적 의미
  λͺ¨λ“ˆμ΄λž€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ  μš”μ†Œλ‘œμ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ 쑰각을 λ§ν•œλ‹€. 일반적으둜 λͺ¨λ“ˆμ€ κΈ°λŠ₯을 κΈ°μ€€μœΌλ‘œ 파일 λ‹¨μœ„λ‘œ λΆ„λ¦¬ν•œλ‹€. μ΄λ•Œ λͺ¨λ“ˆμ΄ μ„±λ¦½ν•˜λ €λ©΄ λͺ¨λ“ˆμ€ μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„(λͺ¨λ“ˆ μŠ€μ½”ν”„)λ₯Ό κ°€μ§ˆ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

  μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” λͺ¨λ“ˆμ˜ μžμ‚°μ€ 기본적으둜 λΉ„κ³΅κ°œ μƒνƒœλ‹€. μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” λͺ¨λ“ˆμ˜ λͺ¨λ“  μžμ‚°μ€ μΊ‘μŠν™”λ˜μ–΄ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€. 즉, λͺ¨λ“ˆμ€ κ°œλ³„μ  μ‘΄μž¬λ‘œμ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λΆ„λ¦¬λ˜μ–΄ μ‘΄μž¬ν•œλ‹€.

  ν•˜μ§€λ§Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό μ™„μ „νžˆ λΆ„λ¦¬λ˜μ–΄ κ°œλ³„μ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” λͺ¨λ“ˆμ€ μž¬μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ 쑴재의 μ˜λ―Έκ°€ μ—†λ‹€. λ”°λΌμ„œ λͺ¨λ“ˆμ€ κ³΅κ°œκ°€ ν•„μš”ν•œ μžμ‚°μ— ν•œμ •ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ 선택적 κ³΅κ°œκ°€ κ°€λŠ₯ν•˜λ‹€. 이λ₯Ό export라 ν•œλ‹€.

  곡개된 λͺ¨λ“ˆμ˜ μžμ‚°μ€ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆλ‹€. λͺ¨λ“ˆ μ‚¬μš©μžλŠ” λͺ¨λ“ˆμ΄ κ³΅κ°œν•œ μžμ‚° 쀑 일뢀 λ˜λŠ” 전체λ₯Ό 선택해 μžμ‹ μ˜ μŠ€μ½”ν”„ λ‚΄λ‘œ λΆˆλŸ¬λ“€μ—¬ μž¬μ‚¬μš©ν•  수 μžˆλ‹€. 이λ₯Ό import라 ν•œλ‹€. 이처럼 λͺ¨λ“ˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λΆ„λ¦¬λ˜μ–΄ κ°œλ³„μ μœΌλ‘œ μ‘΄μž¬ν•˜λ‹€κ°€ ν•„μš”μ— 따라 λ‹€λ₯Έ λͺ¨λ“ˆμ— μ˜ν•΄ μž¬μ‚¬μš©λœλ‹€. λͺ¨λ“ˆμ€ κΈ°λŠ₯λ³„λ‘œ λΆ„λ¦¬λ˜μ–΄ κ°œλ³„μ μΈ 파일둜 μž‘μ„±λœλ‹€. 이λ₯Ό 톡해 개발 νš¨μœ¨μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆλ‹€.

48.2 μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ λͺ¨λ“ˆ
  μ•„μ‰½κ²Œλ„ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ ν•˜λ‚˜μ˜ 전역을 κ³΅μœ ν•œλ‹€. λ”°λΌμ„œ λΆ„λ¦¬λœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌλ“€μ˜ μ „μ—­ λ³€μˆ˜κ°€ μ€‘λ³΅λ˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€. μ΄κ²ƒμœΌλ‘œλŠ” λͺ¨λ“ˆμ„ κ΅¬ν˜„ν•  수 μ—†λ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ œμ•ˆλœ 것이 CommonJS와 AMDλ‹€. 이둜써 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ€ 크게 CommonJS와 AMD μ§„μ˜μœΌλ‘œ λ‚˜λ‰˜κ²Œ λ˜μ—ˆκ³  λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” CommonJS와 AMDλ₯Ό κ΅¬ν˜„ν•œ λͺ¨λ“ˆ λ‘œλ” 라이브러리λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 상황이 λ˜μ—ˆλ‹€.

48.3 ES6 λͺ¨λ“ˆ(ESM)
  μœ„μ™€ 같은 μƒν™©μ—μ„œ ES6μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ λ™μž‘ν•˜λŠ” λͺ¨λ“ˆ κΈ°λŠ₯을 μΆ”κ°€ν–ˆλ‹€. ES6 λͺ¨λ“ˆ 즉, ESM의 μ‚¬μš©λ°©λ²•μ€ script νƒœκ·Έμ— type="module" μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‘œλ“œλœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ λͺ¨λ“ˆλ‘œ λ™μž‘ν•œλ‹€. 일반적인 μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 μ•„λ‹Œ ESMμž„μ„ λͺ…ν™•νžˆν•˜κΈ° μœ„ν•΄ ESM의 파일 ν™•μž₯μžλŠ” mjsλ₯Ό 일반적으둜 μ‚¬μš©ν•œλ‹€.

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

48.3.1 λͺ¨λ“ˆ μŠ€μ½”ν”„
  ESM은 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€. ESM이 μ•„λ‹Œ 일반적인 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ script νƒœκ·Έλ‘œ λΆ„λ¦¬ν•΄μ„œ λ‘œλ“œν•΄λ„ λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό 갖지 μ•ŠλŠ”λ‹€. 예λ₯Όλ“€λ©΄, ESM은 파일 자체의 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— λͺ¨λ“ˆ λ‚΄μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ”λŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©° window객체의 ν”„λ‘œνΌν‹°λ„ μ•„λ‹ˆλ‹€. λ˜ν•œ λͺ¨λ“ˆ λ‚΄μ—μ„œ μ„ μ–Έν•œ μ‹λ³„μžλŠ” λͺ¨λ“ˆ μ™ΈλΆ€μ—μ„œ μ°Έμ‘°ν•  수 μ—†λ‹€. λͺ¨λ“ˆ μŠ€μ½”ν”„κ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.

48.3.2 export ν‚€μ›Œλ“œ
  λͺ¨λ“ˆμ€ λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€. λ”°λΌμ„œ λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ λͺ¨λ“  μ‹λ³„μžλŠ” 기본적으둜 ν•΄λ‹Ή λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€. λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ μ‹λ³„μžλ₯Ό 외뢀에 κ³΅κ°œν•˜μ—¬ λ‹€λ₯Έ λͺ¨λ“ˆλ“€μ΄ μž¬μ‚¬μš©ν•  수 있게 ν•˜λ €λ©΄ export ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. export ν‚€μ›Œλ“œλŠ” μ„ μ–Έλ¬Έ μ•žμ— μ‚¬μš©ν•œλ‹€. λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“± λͺ¨λ“  μ‹λ³„μžλ₯Ό exportν•  수 μžˆλ‹€.

export const pi = 3.14;

export function add(x, y){
    return x + y;
}

export class Person {
    constructor(name){
        this.name = name;
    }
}

  exportν•  λŒ€μƒμ„ ν•˜λ‚˜μ˜ 객체둜 κ΅¬μ„±ν•˜μ—¬ ν•œ λ²ˆμ— exportν•  μˆ˜λ„ μžˆλ‹€.

const pi = 3.14;

function add(x, y){
    return x + y;
}

class Person {
    constructor(name){
        this.name = name;
    }
}


export { pi, add, Person };

48.3.3 import ν‚€μ›Œλ“œ
  λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ κ³΅κ°œν•œ μ‹λ³„μžλ₯Ό μžμ‹ μ˜ λͺ¨λ“ˆ μŠ€μ½”ν”„ λ‚΄λΆ€λ‘œ λ‘œλ“œν•˜λ €λ©΄ import ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. λ‹€λ₯Έ λͺ¨λ“ˆμ΄ exportν•œ μ‹λ³„μž μ΄λ¦„μœΌλ‘œ importν•΄μ•Ό ν•˜λ©° ESM의 경우 파일 ν™•μž₯자λ₯Ό μƒλž΅ν•  수 μ—†λ‹€.

 import { pi, add, Person} from './lib.mjs';

  λͺ¨λ“ˆμ΄ exportν•œ μ‹λ³„μž 이름을 일일이 μ§€μ •ν•˜μ§€ μ•Šκ³  ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ ν•œ λ²ˆμ— importν•  μˆ˜λ„ μžˆλ‹€. μ΄λ•Œ importλ˜λŠ” μ‹λ³„μžλŠ” as 뒀에 μ§€μ •ν•œ μ΄λ¦„μ˜ 객체에 ν”„λ‘œνΌν‹°λ‘œ ν• λ‹Ήλœλ‹€.

import * as lib from './lib.mjs';

  λͺ¨λ“ˆμ΄ exportν•œ μ‹λ³„μž 이름을 λ³€κ²½ν•˜μ—¬ importν•  μˆ˜λ„ μžˆλ‹€.

import { pi as PI, add as Add, Person as people} from './lib.mjs';