Skip to content

Commit 3aaf225

Browse files
authored
[이상조] 챕터 10: 모듈형 자바스크립트 디자인 패턴 (#89)
1 parent d974ed4 commit 3aaf225

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

챕터_10/이상조.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# JavaScript 모듈 시스템의 포괄적 심층 분석: AMD, CommonJS, UMD
2+
3+
JavaScript 생태계에서 모듈 시스템의 발전은 웹 개발의 역사와 깊은 관련이 있습니다.
4+
초기 JavaScript는 단순한 웹 페이지의 상호작용을 처리하기 위한 작은 스크립트 언어로 시작했지만, 웹 애플리케이션이 점차 복잡해지면서 코드 구조화와 재사용성에 대한 필요성이 대두되었습니다.
5+
이러한 배경에서 다양한 모듈 시스템이 등장하게 되었고, 각각의 시스템은 특정 문제를 해결하기 위해 설계되었습니다.
6+
7+
AMD(Asynchronous Module Definition)는 웹 브라우저 환경에서 발생하는 특수한 문제를 해결하기 위해 개발되었습니다.
8+
웹 브라우저에서는 네트워크를 통해 리소스를 로드해야 하는데, 이는 본질적으로 비동기적인 작업입니다.
9+
AMD는 이러한 환경적 특성을 고려하여 설계되었으며, 모듈을 비동기적으로 로드하면서도 의존성을 명확하게 관리할 수 있는 방법을 제공합니다.
10+
AMD의 핵심은 define 함수입니다.
11+
이 함수는 모듈을 정의할 때 사용되며, 모듈의 의존성과 팩토리 함수를 인자로 받습니다.
12+
의존성 모듈들이 모두 로드되면, 팩토리 함수가 실행되어 실제 모듈이 생성됩니다.
13+
이러한 방식은 웹 애플리케이션의 초기 로딩 시간을 최적화하고, 필요한 모듈만 동적으로 로드할 수 있게 해줍니다.
14+
15+
예를 들어, 대규모 웹 애플리케이션에서 사용자가 특정 기능을 처음 사용할 때까지 해당 기능과 관련된 코드의 로딩을 지연시킬 수 있습니다.
16+
이는 초기 페이지 로드 시간을 크게 단축시킬 수 있습니다.
17+
AMD는 RequireJS라는 라이브러리를 통해 널리 구현되었으며, 이는 모듈 로딩의 순서를 보장하고 의존성 충돌을 방지하는 강력한 기능을 제공합니다.
18+
19+
CommonJS는 서버 사이드 JavaScript 환경을 위해 설계된 모듈 시스템입니다.
20+
Node.js가 이 규격을 채택하면서 서버 사이드 JavaScript의 사실상 표준이 되었습니다.
21+
CommonJS의 주요 특징은 동기적인 모듈 로딩입니다.
22+
서버 환경에서는 파일 시스템에서 직접 모듈을 로드하기 때문에, 비동기적 로딩이 필요하지 않습니다.
23+
CommonJS는 require 함수와 module.exports 객체를 통해 모듈을 관리합니다.
24+
require 함수는 모듈을 동기적으로 로드하고, module.exports는 모듈에서 외부로 노출할 기능을 정의합니다.
25+
26+
CommonJS의 모듈 시스템은 Node.js의 성공과 함께 크게 발전했습니다.
27+
Node.js의 모듈 시스템은 매우 정교한 모듈 해석 알고리즘을 가지고 있습니다.
28+
모듈을 찾을 때 먼저 코어 모듈을 확인하고, 그 다음 node_modules 디렉토리를 검색하며, 마지막으로 상대 경로나 절대 경로를 확인합니다.
29+
이 과정에서 파일 확장자를 자동으로 추가하고, 디렉토리를 모듈로 취급할 수도 있습니다.
30+
31+
또한 CommonJS는 모듈 캐싱이라는 중요한 최적화 기능을 제공합니다.
32+
한 번 로드된 모듈은 캐시되어 다음 require 호출 시 캐시된 버전이 반환됩니다.
33+
이는 모듈이 싱글톤처럼 동작하게 만들며, 메모리 사용을 최적화합니다.
34+
순환 참조(circular dependency) 처리도 CommonJS의 중요한 특징입니다.
35+
모듈 A가 모듈 B를 참조하고, 동시에 모듈 B가 모듈 A를 참조하는 상황에서도 문제없이 동작할 수 있도록 설계되었습니다.
36+
37+
UMD(Universal Module Definition)는 AMD와 CommonJS의 장점을 모두 활용하면서, 브라우저의 전역 스코프까지 고려한 통합 모듈 정의 방식입니다.
38+
UMD는 실행 환경을 감지하여 적절한 모듈 시스템을 사용하는 방식으로 동작합니다.
39+
이는 하나의 코드베이스로 여러 환경에서 동작할 수 있는 라이브러리를 만들 때 특히 유용합니다.
40+
41+
UMD의 동작 방식은 다음과 같습니다.
42+
먼저 AMD의 define 함수가 있는지 확인하여 AMD 환경인지 검사합니다.
43+
그다음 module.exports가 있는지 확인하여 CommonJS 환경인지 검사합니다.
44+
마지막으로 둘 다 아닌 경우 전역 객체에 모듈을 추가합니다.
45+
이러한 방식으로 UMD는 거의 모든 JavaScript 실행 환경에서 동작할 수 있습니다.
46+
47+
최근에는 ES Modules(ESM)이 JavaScript의 공식 모듈 시스템으로 채택되면서, 이러한 전통적인 모듈 시스템들의 사용이 점차 줄어들고 있습니다.
48+
그러나 여전히 많은 레거시 코드와 라이브러리들이 이러한 모듈 시스템을 사용하고 있으며, 특히 UMD는 라이브러리 배포에 있어 중요한 역할을 하고 있습니다.
49+
50+
각 모듈 시스템은 성능 면에서도 차이가 있습니다.
51+
AMD는 비동기 로딩으로 인해 초기 로딩 시간을 최적화할 수 있지만, 많은 HTTP 요청이 발생할 수 있습니다.
52+
CommonJS는 동기적 로딩으로 인해 예측 가능한 실행 순서를 가지지만, 브라우저 환경에서는 번들링이 필요합니다.
53+
UMD는 여러 환경을 지원하기 위한 추가적인 코드로 인해 약간의 오버헤드가 있을 수 있습니다.
54+
55+
모듈 시스템의 선택은 프로젝트의 요구사항과 실행 환경에 따라 달라져야 합니다.
56+
순수한 브라우저 환경에서는 AMD가, Node.js 환경에서는 CommonJS가, 그리고 라이브러리 개발에는 UMD가 적합할 수 있습니다.
57+
그러나 현대의 웹 개발에서는 대부분 번들러를 사용하기 때문에, ESM을 사용하고 필요한 경우 번들러가 적절한 포맷으로 변환하는 방식이 일반적입니다.

0 commit comments

Comments
 (0)