Node.JS) Module Caching 을 알아보자

Module Caching

Node.js에서 모듈이 어떻게 로드되고 캐싱되는지 이해하는 것은 최적화된 효율적인 코드를 작성하기 위해 중요합니다. 모듈 캐싱은 시간과 리소스를 절약하여 애플리케이션을 더 빠르고 반응성 있게 만들 수 있습니다. 이 글에서는 Node.js의 모듈 캐싱에 대해 자세히 알아보고, 어떻게 효과적으로 사용할 수 있는지에 대해 탐구하겠습니다.

 

모듈 캐싱이란?

모듈 캐싱은 Node.js가 모듈 파일을 단 한 번만 로드하도록 하는 메커니즘이며, 이는 애플리케이션 전체에서 여러 번 require 되더라도 마찬가지입니다. 모듈이 처음 로드될 때 실행되고 메모리에 캐시됩니다. 동일한 모듈에 대한 후속 require 호출은 캐시된 버전을 반환합니다, 추가적인 파일 작업이나 코드 실행이 필요 없게 만듭니다.

 

모듈 캐싱은 어떻게 작동하는가?

**require**를 사용하여 모듈을 호출할 때, Node.js는 다음 작업을 수행합니다:

  1. 모듈이 코어 모듈인지(예: fs, http 등) 확인합니다.
  2. 그렇다면 코어 모듈을 반환합니다.
  3. 그렇지 않다면 Node.js는 캐시를 확인하여 모듈이 이미 로드되었는지 확인합니다.
  4. 모듈이 캐시에서 발견되면, Node.js는 캐시된 exports 객체를 반환합니다.
  5. 모듈이 캐시에 없으면, Node.js는 디스크에서 모듈 파일을 읽고 실행한 다음 사용을 위해 캐싱합니다.

 

예를 들어, 다음과 같은 간단한 모듈이 있다고 가정해보겠습니다:

// myModule.js
console.log('This module is being loaded!');
module.exports = function() {
  return 'Hello, world!';
};

이 모듈을 두 번 **require**하는 경우:

// app.js
const myModule = require('./myModule');  // 콘솔에 "This module is being loaded!" 출력
const myModuleAgain = require('./myModule');  // 콘솔에 추가 출력 없음

첫 번째 **require**에서 "This module is being loaded!"가 콘솔에 출력되지만, 두 번째 **require**에서는 출력되지 않습니다. 이는 두 번째 **require**에서는 캐싱된 모듈을 사용하기 때문입니다.

 

모듈 캐싱의 이점

  1. 성능: 디스크에서 파일을 읽고 실행하는 것은 시간과 리소스를 소모합니다. 캐싱은 이미 로드된 모듈을 재사용함으로써 이를 완화합니다.
  2. 일관성: 모든 require 호출이 동일한 객체를 반환하므로 모듈 동작의 약간의 변동이 애플리케이션의 다른 부분에서 발생할 위험이 없습니다.

 

캐싱이 문제가 되는 경우는?

캐싱은 여러 장점을 제공하지만, 때로는 장애가 될 수 있습니다:

  1. 상태 있는 모듈: 모듈이 자신의 상태를 수정하면, 그 상태는 모듈이 가져온 곳에서도 공유됩니다. 이로 인해 예기치 않은 동작이 발생할 수 있습니다.
  2. 핫 리로딩: 개발 중에 코드를 변경하고 애플리케이션을 다시 시작하지 않고 효과를 볼 수 있도록 하려면 캐싱이 이를 어렵게 만듭니다.

 

캐시 우회하기

일반적으로 권장되지 않지만, 프로그래밍적으로 캐시를 우회할 수 있습니다. Node.js는 **require.cache**에 캐시를 저장합니다. 이 객체에서 항목을 삭제하여 Node.js가 모듈을 다시 로드하도록 할 수 있습니다:

const path = require('path');
const modulePath = path.resolve(__dirname, 'some-module.js');
delete require.cache[modulePath];

 

결론

모듈 캐싱은 성능과 리소스 사용에 중요한 장점을 제공하는 Node.js의 중요한 부분입니다. 그것의 제한과 함정이 있지만, 그것이 어떻게 작동하는지 이해하면 더 효율적이고 신뢰성 있는 코드를 작성할 수 있습니다.

'Backend > Node.js' 카테고리의 다른 글

Node.js child_process  (1) 2024.01.08
Node.js Event Architecture  (0) 2023.12.14
Node.js TDD 단위테스트, 통합테스트  (0) 2023.07.14
Node.js 작동방식 및 Event loop  (0) 2023.06.26
Node.js  (0) 2023.06.26