본문 바로가기

언어/Node.js

Node.js CommonJS란 무엇인가?

반응형
반응형

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 생태계의 많은 패키지와 프로젝트가 이 모듈 시스템을 사용하여 모듈을 관리하고 공유합니다.

반응형