Node.js에서 CommonJS는 JavaScript 모듈을 정의하고 가져오는 데 사용되는 모듈 시스템입니다. CommonJS 모듈 시스템은 모듈 간의 의존성 관리와 코드 재사용을 용이하게 합니다. 이 모듈 시스템은 웹 브라우저에서는 사용되지 않으며, 주로 서버 측 JavaScript인 Node.js에서 사용됩니다.
CommonJS 도입 (2010년):
- CommonJS 모듈 스펙을 채택하여 Node.js의 모듈 시스템이 정착되었습니다.
- module.exports와 exports 객체를 사용하여 모듈에서 내보내는 방식이 정의되었습니다.
CommonJS 모듈 시스템의 주요 특징은 다음과 같습니다.
1. 모듈 정의
- 모듈은 각 파일에 개별적으로 정의됩니다. 각 파일은 하나의 모듈을 나타내며, 파일의 경로에 따라 모듈의 이름이 결정됩니다.
// example.js
const foo = require('./foo');
이 예제에서 `example.js` 파일은 `foo` 모듈을 가져오고 있습니다.
2. 모듈 가져오기
require()
함수를 사용하여 다른 모듈을 가져올 수 있습니다.require()
함수는 지정된 모듈의 경로를 인수로 받아 해당 모듈을 로드하고 그 모듈의 내보낸 객체를 반환합니다.
const foo = require('./foo');
3. 모듈 내보내기
1. 함수 내보내기
module.exports
객체를 사용하여 모듈에서 공개할 함수, 객체 또는 값들을 지정할 수 있습니다. 다른 파일에서 이러한 값들을 가져올 수 있습니다.
// foo.js
const foo = () => {
return 'Hello, world!';
}
module.exports = foo;
위의 예제에서 `foo` 함수를 다른 파일에서 사용할 수 있도록 `module.exports`에 할당했습니다.
- MyApp.js를 만든다.
// MyApp.js
const foo = require('./foo');
console.log(foo());
2. Class 내보내기
CommonJS 방식으로 클래스를 내보내는 예제는 다음과 같습니다.
- MyClass.js 파일 작성
MyClass.js 파일에 클래스를 정의하고 내보냅니다.
// MyClass.js
class MyClass {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, ${this.name}!`);
}
}
module.exports = MyClass;
이 예제에서는 MyClass라는 클래스를 정의하고, 생성자와 greet 메서드를 포함합니다. 그리고 `module.exports`를 사용하여 MyClass 클래스를 내보냅니다.
- MyApp.js 파일에서 MyClass 사용
MyApp.js 파일에서 MyClass 클래스를 가져와 사용합니다.
// MyApp.js
const MyClass = require('./MyClass');
const obj = new MyClass('World');
obj.greet(); // 출력: Hello, World!
이 예제에서는 MyClass 클래스를 `require()` 함수를 사용하여 가져옵니다. 그리고 이를 인스턴스화하여 사용합니다.
이렇게 하면 CommonJS 방식으로 클래스를 정의하고 내보내고, 다른 파일에서 가져와 사용할 수 있습니다.
3. 인스턴스 내보내기
CommonJS 방식으로 인스턴스를 내보내는 것은 일반적으로 권장되지 않습니다. 대신 클래스나 함수를 내보내고, 필요할 때 해당 클래스나 함수를 사용하여 새로운 인스턴스를 생성하는 것이 일반적입니다. 그러나 가능하다면 인스턴스를 직접 내보내는 방법도 있습니다. 아래는 그 예제입니다.
- MyClass.js 파일 작성
MyClass.js 파일에 클래스를 정의하고 해당 클래스의 인스턴스를 생성한 후 내보냅니다.
// MyClass.js
class MyClass {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, ${this.name}!`);
}
}
const myInstance = new MyClass('World');
module.exports = myInstance;
이 예제에서는 MyClass 클래스를 정의하고, 생성자를 사용하여 myInstance라는 인스턴스를 생성합니다. 그리고 `module.exports`를 사용하여 이 인스턴스를 직접 내보냅니다.
- MyApp.js 파일에서 MyClass 인스턴스 사용
MyApp.js 파일에서 MyClass 인스턴스를 가져와 사용합니다.
// MyApp.js
const myInstance = require('./MyClass');
myInstance.greet(); // 출력: Hello, World!
이 예제에서는 MyClass 인스턴스를 `require()` 함수를 사용하여 가져와서 greet 메서드를 호출합니다.
위의 예제는 가능은 하지만, 보통은 클래스나 함수를 내보내는 것이 더 유연하고 관례적입니다. 인스턴스를 직접 내보내는 것은 코드의 가독성과 유지보수성을 저해할 수 있습니다.
4. 동기적 로딩
- CommonJS는 모듈을 동기적으로 로드합니다. 이것은 모듈이 필요할 때마다 해당 모듈이 로드되어 사용 가능해짐을 의미합니다. 따라서 모듈이 로드될 때까지 스크립트 실행이 차단될 수 있습니다.
const foo = require('./foo');
console.log(foo()); // 'Hello, world!'
CommonJS 모듈 시스템은 Node.js의 주요 기능 중 하나이며, Node.js 생태계의 많은 패키지와 프로젝트가 이 모듈 시스템을 사용하여 모듈을 관리하고 공유합니다.
'언어 > Node.js' 카테고리의 다른 글
[ Node.js ] 프로젝트 작성 및 실행 (express-generator) (0) | 2024.06.16 |
---|---|
Node.js ESM(ECMAScript) 모듈 사용해 보기 (0) | 2024.06.10 |
Node.js 비동기 처리에 대해서 이해하기 (1) | 2024.06.10 |
Node.js 설치하고 Hellow World 첫 프로그램 만들기 (1) | 2024.06.10 |
Node.js 개념과 특징 (1) | 2024.06.10 |