더북(TheBook)

dep-run.js를 만들어 두 모듈을 실행해보겠습니다.

dep-run.js

const dep1 = require('./dep1');
const dep2 = require('./dep2');

dep1();
dep2();

코드가 위에서부터 실행되므로 require('./dep1')이 먼저 실행됩니다. dep1.js에서는 제일 먼저 require('./dep2')가 실행되는데요. 다시 dep2.js에서는 require('./dep1')이 실행됩니다. 이 과정이 계속 반복되므로 어떻게 될지 궁금할 겁니다. 실제로 실행해봅시다.

콘솔

$ node dep-run
require dep1 {}
require dep2 [Function (anonymous)]
dep2 [Function (anonymous)]
dep1 {}
(node:29044) Warning: Accessing non-existent property 'Symbol(nodejs.util.inspect.custom)' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
...

놀랍게도 dep1의 module.exports가 함수가 아니라 빈 객체로 표시됩니다. 이러한 현상을 순환 참조(circular dependency)라고 부릅니다. 이렇게 순환 참조가 있을 경우에는 순환 참조되는 대상을 빈 객체로 만듭니다. 이때 에러가 발생하지 않고(Warning은 에러가 아니라 경고입니다) 조용히 빈 객체로 변경되므로 예기치 못한 동작이 발생할 수 있습니다. 따라서 순환 참조가 발생하지 않도록 구조를 잘 잡는 것이 중요합니다.

Note ≣ 존재하지 않는 모듈을 불러오려는 시도를 할 때

존재하지 않는 모듈을 불러올 때는 다음 에러가 발생합니다. 에러 내용은 모듈명을 보고 분석하면 됩니다.

Error: Cannot find module '모듈명' { code: 'MODULE_NOT_FOUND' }

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '모듈명' imported from 모듈명

이번에는 ECMAScript 모듈을 알아봅시다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.