2️⃣ Node.js 핵심 모듈: 강력한 기본기 다지기 🧱
첫 번째 챕터에서 Node.js가 무엇인지, 어떻게 실행되는지, 그리고 Java와 어떤 차이점이 있는지 살펴보았습니다. 이제부터는 Node.js를 실제로 활용하는 데 필요한 강력한 도구들, 바로 **핵심 모듈(Core Modules)**에 대해 알아볼 시간입니다.
Node.js는 그 자체로도 강력하지만, 다양한 내장 모듈을 통해 파일 시스템 접근, HTTP 통신, 경로 처리 등 서버 개발에 필수적인 기능들을 별도의 라이브러리 설치 없이 바로 사용할 수 있게 해줍니다. Java에서 java.io, java.net, java.nio 등의 표준 라이브러리를 사용하는 것과 유사하다고 생각하시면 됩니다.
이 챕터에서는 Node.js의 모듈 시스템을 이해하고, 자주 사용되는 핵심 모듈들의 사용법을 익혀보겠습니다.
모듈 시스템 이해하기 (CommonJS)
Node.js 애플리케이션을 만들다 보면 코드가 점점 길어지고 복잡해집니다. 이때 코드를 여러 파일로 분리하여 관리하는 것이 필수적인데, Node.js는 이를 위해 모듈(Module) 시스템을 사용합니다. 모듈은 관련된 기능들을 그룹화한 파일 또는 디렉토리라고 생각할 수 있습니다.
Java에서 클래스나 패키지를 사용하여 코드를 구조화하고 재사용하는 것처럼, Node.js에서는 모듈을 통해 코드의 재사용성과 유지보수성을 높입니다. Node.js는 기본적으로 CommonJS라는 모듈 명세를 따릅니다. (최신 버전의 Node.js에서는 ES 모듈(ECMAScript Modules)도 지원하지만, 여기서는 먼저 CommonJS를 중심으로 설명하겠습니다. CommonJS는 Node.js 생태계에서 오랫동안 널리 사용되어 온 방식입니다.)
CommonJS 모듈 시스템의 주요 키워드:
- require(): 다른 모듈을 불러올 때 사용합니다. Java의 import 문과 유사한 역할을 합니다.
- require() 함수는 모듈의 경로(문자열)를 인자로 받아 해당 모듈에서 내보낸(export) 객체, 함수, 또는 값을 반환합니다.
- 핵심 모듈(예: http, fs)을 불러올 때는 모듈 이름만 적습니다. (예: const http = require('http');)
- 직접 작성한 파일 모듈을 불러올 때는 상대 경로 또는 절대 경로를 명시합니다. (예: const myModule = require('./myModule.js');)
- module.exports: 현재 모듈에서 외부로 기능을 내보낼 때 사용합니다. 이렇게 내보낸 기능만이 다른 모듈에서 require()를 통해 접근할 수 있습니다.
- 하나의 값, 함수, 또는 객체를 할당할 수 있습니다.
- Java에서 public 접근 제어자를 사용하여 클래스나 메소드를 외부 패키지에 공개하는 것과 비슷한 개념으로 이해할 수 있습니다.
- exports: module.exports를 가리키는 짧은 별칭(shorthand)입니다.
- exports 객체에 속성을 추가하는 방식으로 여러 기능을 내보낼 수 있습니다. (예: exports.myFunction = () => { ... };)
- 주의할 점: exports에 직접 새로운 객체를 할당하면(exports = newValue;), module.exports와의 참조 관계가 끊어져서 의도대로 동작하지 않을 수 있습니다. 따라서 모듈 전체를 하나의 객체로 내보낼 때는 module.exports를 사용하는 것이 안전합니다.
간단한 예제:
예를 들어, 두 개의 파일을 만들어 모듈 시스템을 사용해 보겠습니다.
- myMath.js (모듈 파일)
-
// 이 파일은 수학 관련 함수들을 제공하는 모듈입니다. const add = (a, b) => { return a + b; }; const subtract = (a, b) => { return a - b; }; // 방법 1: module.exports에 객체를 할당하여 여러 함수를 한 번에 내보내기 module.exports = { add, // ES6 단축 표기법: add: add 와 동일 subtract: subtract }; // 방법 2: exports 객체의 속성으로 각각 내보내기 (이 경우 module.exports = {} 로 시작한다고 가정) // exports.add = add; // exports.subtract = subtract; // 주의: 이렇게 하면 안 됩니다! (exports가 가리키는 참조가 바뀜) // exports = { add, subtract }; - JavaScript
- app.js (메인 애플리케이션 파일)
-
JavaScript
// myMath.js 모듈을 불러옵니다. // './'는 현재 디렉토리를 의미합니다. 확장자 .js는 생략 가능합니다. const math = require('./myMath'); const sum = math.add(5, 3); console.log(`5 + 3 = ${sum}`); // 출력: 5 + 3 = 8 const difference = math.subtract(10, 4); console.log(`10 - 4 = ${difference}`); // 출력: 10 - 4 = 6 // 만약 myMath.js에서 module.exports = add; 와 같이 하나의 함수만 내보냈다면 // const addFunction = require('./myMath'); // const result = addFunction(1, 2);
모듈이 로드되는 과정 (간략히):
- require() 함수가 호출되면 Node.js는 해당 모듈을 찾습니다.
- 먼저 핵심 모듈인지 확인합니다.
- 아니라면, 파일 경로를 기준으로 .js, .json, .node 확장자를 가진 파일을 찾습니다.
- 그래도 없다면, node_modules 디렉토리에서 해당 이름의 패키지를 찾습니다.
- 모듈 코드가 실행됩니다. 이 과정에서 module.exports에 할당된 값들이 수집됩니다.
- require() 함수는 해당 모듈의 module.exports 객체를 반환합니다.
- 한 번 로드된 모듈은 캐시되어, 다음에 다시 require() 할 때는 새로 실행하지 않고 캐시된 module.exports 객체를 반환합니다. (싱글톤처럼 동작)
이처럼 Node.js의 모듈 시스템은 코드를 잘 조직하고, 재사용성을 높이며, 복잡한 애플리케이션을 관리하기 쉽게 만들어줍니다. Java 개발자분들은 패키지 시스템과 유사성을 발견하실 수 있을 것이며, require와 module.exports의 관계를 잘 이해하는 것이 중요합니다.
'프로그래밍 > NODEJS 강좌 BY GEMINI' 카테고리의 다른 글
| 주요 내장 모듈 살펴보기- http: HTTP 서버 및 클라이언트 생성 (Java의 java.net.HttpURLConnection 또는 서블릿 API와 비교) (0) | 2025.06.04 |
|---|---|
| 주요 내장 모듈 살펴보기 (0) | 2025.06.04 |
| Java vs. Node.js: 서버 사이드 패러다임 비교 🔄 (0) | 2025.05.28 |
| Hello Node.js! - 첫 애플리케이션 작성 (1) | 2025.05.27 |
| NODE 툴 (0) | 2025.05.27 |