AMD, CMD, UMD, ESM 및 CommonJS에 대한 심층 분석

JavaScript 모듈화 기술의 주요 표준인 CommonJS, AMD, CMD, UMD, ESM의 개념과 차이점을 정리합니다. 이들 표준은 클라이언트/서버 환경에서 코드 관리 효율성을 높이기 위한 목적으로 개발되었습니다.

1. CommonJS - 서버 환경용 동기 모듈 시스템

Node.js 환경에서 주로 사용되는 표준으로, 파일 시스템 접근이 빠른 서버 환경에서 동기 방식으로 모듈을 로드합니다.

핵심 특징

  • 동기적 불러오기: require() 호출 시 다음 코드 실행이 일시 중단됨
  • 값 복사 전달: 모듈 내부 상태 변경이 외부 영향을 주지 않음
  • 파일 단위 모듈: 각 파일이 독립적인 스코프를 갖음

구문 예시

// 수출 모듈
function calculateSum(a, b) {
  return a + b;
}
module.exports = {
  sum: calculateSum
};

// 불러오기
const calculator = require('./calculator');
console.log(calculator.sum(2, 3)); // 5

2. AMD - 브라우저 최적화 비동기 모듈

RequireJS와 같은 라이브러리에서 구현된 표준으로, 네트워크 지연을 고려한 비동기 로딩 방식을 채택했습니다.

구현 특징

  • 명시적 의존성 선언: define()로 의존 모듈을 사전에 등록
  • 즉시 실행: 모듈 로딩 후 바로 실행 가능

구문 예시

// 모듈 정의
define(['jquery'], function($) {
  function showContent() {
    $('#target').html('AMD 모듈 작동');
  }
  return { display: showContent };
});

// 모듈 사용
require(['moduleA'], function(moduleA) {
  moduleA.display();
});

3. CMD - 유연한 브라우저 모듈 프레임워크

Sea.js에서 개발된 표준으로, CommonJS와 AMD의 장점을 결합한 방식입니다.

구현 특징

  • 지연 로딩: 필요 시점에 require() 호출
  • 동적 의존 처리: require.async()로 비동기 로딩 가능

구문 예시

define(function(require, exports, module) {
  const $ = require('jquery');
  require.async('./utils', function(utils) {
    utils.processData();
  });
  
  exports.show = function() {
    $('#container').html('CMD 모듈 실행');
  };
});

4. UMD - 다중 환경 호환 패턴

모듈을 다양한 환경에서 실행할 수 있도록 설계된 패턴으로, CommonJS, AMD, 글로벌 변수 지원 모두 가능합니다.

구현 원리

(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(['jquery'], factory);
  } else if (typeof module === 'object' && module.exports) {
    module.exports = factory(require('jquery'));
  } else {
    root.myLib = factory(root.jQuery);
  }
}(this, function ($) {
  function init() {
    $('body').append('<p>UMD 모듈 로드 성공</p>');
  }
  return { initialize: init };
}));

5. ESM - 표준화된 모듈 시스템

ECMAScript 2015 이후 도입된 언어 자체 모듈 시스템으로, 현대 브라우저 및 Node.js에서 널리 사용됩니다.

주요 특징

  • 정적 분석 가능: 컴파일 시 의존성 결정
  • 참조 전달: 모듈 내부 변화가 외부 영향을 줌
  • 타입스크립트 호환: 기본값, 이름별 수출 지원

구문 예시

// 모듈 수출
export const PI = 3.14159;
export default function() {
  console.log('ESM 모듈 실행');
}

// 모듈 불러오기
import { PI } from './math';
import myDefault from './lib';

console.log(PI); // 3.14159
myDefault();

비교 요약표

규격 주요 환경 로딩 방식 주요 특징
CommonJS Node.js 동기 간단한 서버용 구현
AMD 브라우저 비동기 의존성 선언 중심
CMD 브라우저 비동기 필요 시점 로드
UMD 다중 환경 조건적 환경 자동 감지
ESM 현대 환경 정적/비동기 표준화된 언어 기능

발전 추세

  • ESM: 웹팩, Vite 등의 도구 발전으로 현대 프로젝트에서 필수
  • CommonJS: Node.js에서 여전히 사용되지만 ESM로 전환 중
  • AMD/CMD: 옛 프로젝트에서만 유지됨
  • UMD: 크로스 플랫폼 라이브러리에 적합

현대 개발에서는 라이브러리 분배 시 UMD 또는 ESM 사용, 애플리케이션 개발 시 ESM 직접 활용이 권장됩니다.

태그: JavaScript CommonJS AMD CMD UMD

7월 25일 06:21에 게시됨