Node.js는 JavaScript 런타임 환경으로, 서버 사이드 자바스크립트 개발에 널리 사용됩니다. Node.js에서 모듈 시스템은 코드를 재사용 가능한 단위로 분리하여 관리하는 중요한 역할을 합니다. 이 글에서는 Node.js에서 사용되는 다양한 모듈 확장자(cts, cjs, ts, mts, mjs)의 의미와 차이점을 자세히 알아보고, 각 확장자를 선택해야 하는 상황에 대해 설명합니다.
모듈 시스템의 진화: CommonJS와 ES Modules
Node.js 초기에는 CommonJS(CJS) 모듈 시스템이 주로 사용되었습니다. CJS는 require() 함수를 통해 모듈을 가져오고, module.exports를 통해 모듈을 내보내는 방식을 사용합니다. 하지만 CJS는 동기적 로딩 방식을 사용하고, 모듈 간 순환 의존성 문제를 해결하기 어렵다는 단점이 있습니다.
이러한 CJS의 단점을 보완하기 위해 **ES Modules(ESM)**이 등장했습니다. ESM은 ES6에서 도입된 표준 모듈 시스템으로, import와 export 키워드를 사용하여 모듈을 가져오고 내보냅니다. ESM은 비동기 로딩을 지원하고, 모듈 간 순환 의존성을 허용하는 등 CJS보다 더 유연한 기능을 제공합니다.
모듈 확장자의 의미
- .js: 일반적인 자바스크립트 파일 확장자입니다. package.json 파일의 type 필드에 따라 CJS 또는 ESM으로 해석됩니다.
- .cjs: CommonJS 모듈임을 명시적으로 나타내는 확장자입니다.
- .mjs: ES Modules임을 명시적으로 나타내는 확장자입니다.
- .ts: TypeScript 파일 확장자입니다. TypeScript는 타입스크립트 컴파일러를 통해 JavaScript 파일로 변환됩니다.
- .cts: TypeScript에서 CommonJS 모듈을 나타내는 확장자입니다.
- .mts: TypeScript에서 ES Modules를 나타내는 확장자입니다.
각 확장자의 특징과 선택 기준
확장자 | 의미 | 주요 특징 | 사용 시기 |
.js | 자바스크립트 | package.json의 type 필드에 따라 CJS 또는 ESM으로 해석 | 기본 확장자 |
.cjs | CommonJS 모듈 | 동기적 로딩, require 사용, Node.js 초기 버전부터 지원 | CJS 환경에서 명확하게 구분하고 싶을 때 |
.mjs | ES Modules | 비동기 로딩, import 사용, Node.js 12 이상 버전에서 지원 | ESM 환경에서 명확하게 구분하고 싶을 때 |
.ts | TypeScript | 타입스크립트 파일, 컴파일 후 .js 파일로 변환 | TypeScript 프로젝트에서 사용 |
.cts | TypeScript (CommonJS) | TypeScript로 작성된 CommonJS 모듈 | TypeScript 프로젝트에서 CJS 모듈을 사용할 때 |
.mts | TypeScript (ES Modules) | TypeScript로 작성된 ES Modules | TypeScript 프로젝트에서 ESM을 사용할 때 |
어떤 확장자를 사용해야 할까요?
- Node.js 버전: Node.js 12 이상에서는 ESM을 공식적으로 지원하므로, 새로운 프로젝트에서는 ESM을 사용하는 것이 좋습니다.
- 프로젝트 규모: 대규모 프로젝트에서는 모듈 관리를 위해 ESM을 사용하는 것이 유리합니다.
- 팀 규약: 팀에서 특정 모듈 시스템을 사용하기로 정했다면, 팀 규약을 따라야 합니다.
- 기존 코드와의 호환성: 기존에 작성된 CJS 코드와의 호환성을 고려해야 합니다.
Node.js에서 모듈 시스템은 프로젝트의 규모와 복잡도에 따라 적절한 방식을 선택해야 합니다. 최근에는 ESM이 더욱 주목받고 있으며, 새로운 프로젝트에서는 ESM을 기본으로 사용하는 것이 권장됩니다. 하지만 기존 프로젝트와의 호환성이나 팀 규약 등을 고려하여 적절한 확장자를 선택해야 합니다.
핵심 정리:
- CJS: CommonJS, 동기적 로딩, require 사용
- ESM: ES Modules, 비동기 로딩, import 사용, Node.js 12 이상 지원
- ts: TypeScript, 타입 안전성 제공
- cts: TypeScript (CommonJS)
- mts: TypeScript (ES Modules)
추가적으로 알아두면 좋은 점:
- package.json의 type 필드를 통해 프로젝트의 기본 모듈 시스템을 설정할 수 있습니다.
- Node.js는 --experimental-modules 플래그를 통해 ESM을 사용할 수 있습니다.
- Babel과 같은 트랜스파일러를 사용하여 ES Modules를 지원하지 않는 환경에서도 ESM 코드를 실행할 수 있습니다.
주의: Node.js 버전과 프로젝트의 특성에 따라 적절한 모듈 시스템을 선택해야 합니다.
'Node.js 를 배워보자' 카테고리의 다른 글
Node.js로 JavaScript 파일의 함수 호출 정보 파싱하기 (1) | 2025.03.02 |
---|---|
Node.js로 일반 JS와 TS 파일을 파싱하는 다양한 방법 (0) | 2025.03.02 |
Node.js 개발의 필수 도구: Nodemon을 활용한 효율적인 개발 환경 구축 (0) | 2025.01.24 |
Node.js Express 환경에서 Swagger와 Redoc을 활용한 API 문서화 (0) | 2025.01.22 |
MySQL/MariaDB 연결: mysql, mysql2, mysql2/promise 비교 분석 (0) | 2025.01.14 |