Codesigner

[Nodejs] 첫 번째 노드 프로젝트 & 모듈 본문

Nodejs

[Nodejs] 첫 번째 노드 프로젝트 & 모듈

eunsukimme 2019. 6. 5. 02:39

이번 포스팅에서는 VScode를 활용해서 노드 프로젝트를 직접 생성하여 기초적인 노드 사용법에 대해 알아보도록 하자. VScode는 MS에서 제작한 가볍고 심플한 코드 에디터이다. VScode가 미리 설치되었다고 가정하고 진행하도록 하겠다. 먼저 코드를 작성하기 위한 폴더를 생성하고, 터미널에서 해당 디렉터리로 이동한 후 code 명령을 입력하면 해당 디렉터리를 루트로 하는 VScode 편집 창이 열린다. 필자는 node_test라는 폴더를 생성한 후 코드 편집기를 실행시켰다. 자, 그럼 본격적으로 첫 번째 노드 프로젝트를 만들어 보도록 하자

 

 

 

첫 번째 노드 프로젝트

sample.js 라는 파일을 생성하고, 다음과 같이 입력한 후 저장하자

 

<그림 1> 첫 번째 노드 프로젝트 구성 화면

 

그런 다음, 터미널에서 node 명령의 파라미터로 sample.js를 넘겨주자. 엔터를 치면 터미널에 'hello world'가 나타날 것이다. 축하한다! 당신은 첫 번째 노드 프로젝트를 성공적으로(?) 만들었다

 

<그림 2> 첫 번째 노드 프로젝트 실행 화면

 

첫 번째 프로젝트에서 console.log() 가 콘솔 창에 출력해 준다는 것을 알게 되었다. console은 어디서든 사용할 수 있는 전역 객체로 로그를 출력할 수 있도록 해준다. 전역 객체는 console 뿐만 아니라 프로세스의 실행에 대한 정보를 다루는 process, 모듈을 다루는 exports 등이 존재하는데, 이에 대해서는 나중에 더 자세히 알아보도록 하자. console은 또한 다음과 같이 출력 파라미터의 포맷을 지정할 수 있다

console.log('숫자 : %d', 10);
console.log('문자 : %s', 'hello world!');
console.log('JSON 객체 : %j', { name: 'Codesigner' });

 

 

 

프로세스(Process) 객체

process 객체는 프로세스 정보를 다루는 객체이다. 프로세스 객체는 다음과 같은 속성/메서드를 보유하고 있다

  • argv - 프로세스를 실행할 때 전달되는 파라미터 정보
  • env - 환경 변수 정보
  • exit() - 프로세스를 끝내는 메서드

다음 코드를 실행하면서 파라미터를 전달해주면 결과는 다음과 같다

console.log(process.argv);

<그림 3> 코드 실행 결과

파라미터를 배열로 저장해서 출력해 주었다. 파라미터로 주어진 값들 뿐만 아니라 node 실행 파일, 스크립트 파일 또한 파라미터로 인식된다는 점을 주목하자

 

 

 

모듈(Module)

별도의 파일로 분리된 독립 기능을 모듈이라고 한다. 모듈을 만들어 놓으면 다른 파일에서 모듈을 불러와 사용할 수 있다. CommonJS 표준 스펙을 따르며 exports 전역 객체를 사용하여 모듈을 생성할 수 있다. 모듈 파일 안에서 exports를 생성할 수도 있고 module.exports를 사용할 수도 있는데, 객체를 직접 할당하려면 module.exports를 사용해야 한다. 무슨 말인지 잘 이해가 안 된다면 다음 코드를 보자

// calc.js
exports.add = function(a, b) {
  return a + b;
};

exports.mul = function(a, b) {
  return a * b;
};

먼저 calc.js 라는 모듈로 사용할 파일을 생성하였다. 여기서 exports 객체의 속성으로 add와 mul이라는 함수를 추가하였다.

// main.js
const calc = require('./calc');
console.log('모듈로 분리한 후');
console.log(calc.add(10, 10));	// 20
console.log(calc.mul(10, 10));	// 100

그런 다음 main.js 에서 calc.js 모듈을 불러들였다. 여기서 calc 객체는 모듈에서 add와 mul 속성을 추가한 exports 객체로 간주할 수 있고, console 출력 결과 함수의 실행은 모듈에서 정의한 대로 나타나게 된다

 

그렇다면 module.exports 는 어떻게 사용하는 것인지 알아보자. 먼저 calc.js 모듈을 다음과 같이 수정하자

// calc.js
const calc = {};
calc.add = function(a, b) {
  return a + b;
};
calc.mul = function(a, b) {
  return a * b;
};

module.exports = calc;	// 객체를 exports 하기에 module.exports를 사용

먼저 calc 라는 객체를 생성하고, 해당 객체에 add와 mul 메서드를 추가하였다. 그런 다음 그 객체 그대로를 module.exports에 할당하였다. 아까와는 다르게 각각의 메서드가 아닌 calc '객체'를 전달하였기 때문에 module.exports를 사용하였다는 걸 주목하자. 모듈을 불러와서 사용하는 방법은 이전과 동일하다. 중요한 것은 모듈화 하는 대상이 객체냐 아니냐에 따라 불러들이는 방법에서 차이가 난다는 것이다

 

노드 프로젝트 에서 또한 외장 모듈을 사용할 수 있다. 예를 들어, nconf라는 외장 모듈을 사용하면 시스템 환경 변수에 쉽게 접근할 수 있다. 외장 모듈을 사용하려면 npm을 이용해 패키지를 설치해야 한다

npm install nconf

패키지 설치 후 자바스크립트 코드를 실행하면 OS환경 변수가 출력된다

const nconf = require("nconf");

nconf.env();
console.log("OS 환경 변수: ", nconf.get("OS")); // Windows_NT

설치된 외장 모듈을 사용할 때는 실행 파일과 동일한 디렉토리에 있는 node_modules 폴더에서 가장 먼저 설치 여부를 확인하고, 상위 폴더의 node_modules 폴더를 확인한다. 즉, 프로젝트 상위 폴더에 설치되어 있어도 사용 가능하다

 

 

 

Package.json 파일

npm init 명령으로 일단 노드 프로젝트를 생성하면, package.json 파일이 생성된다. 이 파일은 현재 프로젝트의 명세를 담은 파일로, 프로젝트의 이름, 버전, 설명, 의존성 등을 명시한다. 즉 방금처럼 npm install nconf 명령을 하면 package.json의 dependencies 값에 nconf 가 추가된다

 

<그림 4> package.json 파일

 

언제든지 프로젝트 폴더를 클론한 후 npm install 명령만으로 package.json에 명시된 패키지를 일괄 설치할 수 있다. 얼마나 편리한가! 패키지 삭제 시엔 npm uninstall <패키지 이름> 명령으로 간단히 삭제할 수 있다

 

 

 

간단한 내장 모듈 사용하기(os, path)

노드 설치시 기본적으로 제공하는 모듈인 os와 path에 대해서 알아보고 마무리하도록 하자. os는 시스템 정보를 알려주는 모듈이다. 호스트 이름, 시스템 메모리, CPU, 네트워크 인터페이스 등의 정보를 알려준다

const os = require('os');

console.log('시스템 hostname: '+ os.hostname());
console.log('시스템 메모리: '+ os.freemem() +' / '+ os.totalmem());	// 가용 메모리/전체 메모리
console.log('시스템 CPU 정보: \n');
console.log(os.cpus());					// 각 CPU Core 정보
console.log('시스템 네트워크 인터페이스 정보: \n');
console.log(os.networkInterfaces());	// 각 네트워크 인터페이스 정보

path모듈은 파일 패스에서 파일 이름을 구별하는 등의 기능을 제공하는 모듈이다. join, dirname, basename, extnames 등의 메서드를 제공한다

const path = require("path");
// 디렉터리 이름 합치기(users/eunsu/docs)
const directories = ["users", "eunsu", "docs"];
const docsDirectory = directories.join(path.sep);
console.log("doc directory: " + docsDirectory);
// 디렉터리 이름과 파일 이름 합치기(join)
const curPath = path.join("/Users/mike", "notepad.exe");
console.log("파일 경로: " + curPath);

파일 패스에서 디렉터리, 파일 이름, 확장자를 구별할 수도 있다

// ..위 코드 중략
const filename = 'C\\Users\\mike\\notepad.exe';
const dirname = path.dirname(filename);
const basename = path.basename(filename);
const extname = path.extname(filename);

console.log('디렉터리: ' + dirname + ' 파일 이름: ' + basename + ' 확장자: ' + extname);
// 디렉터리: C\Users\mike 파일 이름: notepad.exe 확장자: .exe

 

 

 

Review

지금까지 노드에서의 전역 객체와 기본적으로 제공하는 내장 모듈, 개발자가 직접 모듈을 생성하고 exports 하는 법, 그리고 외장 모듈에 대해서 알아보았다. 지금까지 배운 내용을 정리하면 다음과 같다

 

  • 전역 객체로는 console과 process가 있다
  • console은 콘솔 창에 로그를 출력하는 메서드를 포함한다
  • process는 파라미터, 환경 변수 정보와 같은 프로세스 정보를 포함한다
  • 모듈을 생성한 후 exports 해주는데, 객체를 exports하기 위해선 module.exports를 사용한다
  • package.json은 노드 프로젝트의 명세를 담은 파일이다
  • 외장 모듈을 설치/삭제할 땐 npm install/uninstall <패키지 이름> 명령을 사용한다
  • 노드 설치시 기본 내장 모듈로 os, path 가 설치된다
  • os는 시스템 정보를 알려주는 모듈로, 호스트, 메모리, CPU, 네트워크 등의 정보를 제공한다
  • path는 파일 경로에서 디렉터리, 파일 이름, 확장자 등을 구별하는 데 사용한다

 

 

 

Comments