Node.js와 npm
Node.js와 npm에 대해 알아보겠습니다.
1. Node.js 소개
Node.js는 Chrome V8 자바스크립트 엔진으로 빌드된 JavaScript Runtime Environment 입니다. 주로 서버 사이드 애플리케이션 개발에 사용되는 플랫폼이며, 웹 브라우저에 종속적인 자바스크립트 애플리케이션을 여러 OS에서 실행할 수 있는 환경을 제공합니다. 또한 애플리케이션 개발에 사용하기 위해 필요한 모듈, 파일 시스템, http 라이브러리 등을 built-in 으로 제공합니다.
Node.js는 자바스크립트를 사용해 개발하는데 front-end와 back-end에서 모두 사용이 가능한 동형성(isomorphic)의 특징을 갖고 있습니다. 또한 Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 Request 처리 성능을 가지고 있습니다.
※ Non-blocking I/O
Asynchronous I/O 또는 Non-sequential I/O 라고도 합니다. 입출력 처리를 완료하지 않은 상태에서 다른 처리 작업을 진행할 수 있도록 도중에 멈추지 않고 입출력 처리를 기다리는 방식입니다. 외부에 I/O 작업을 요청한 후 다음 작업을 처리하여 시스템 자원을 효율적으로 사용할 수 있도록 해줍니다. 그러나 작업 완료 이후에 처리해야할 후속 작업이 있다면 이전 작업이 완료되어야하기 때문에 후속 작업을 이어서 진행할 수 있도록 별도의 약속(Polling, Callback function) 등을 사용합니다.
일반적으로 데이터베이스로부터 대량의 데이터를 조회하여 웹페이지에 표시할 때 대기시간(blocking)이 발생하기 때문에 웹페이지 표시가 지연되는 현상이 발생합니다. Node.js의 경우 이러한 문제에 대해 모든 API를 비동기 방식으로 동작하도록 하여 Non-blocking I/O 가 가능하도록 합니다. 따라서 실시간 데이터 처리가 빈번한 SPA(Single Page Application) 에 적합합니다. 하지만 CPU 사용률이 높은 애플리케이션에서는 권장되지 않는다는 특징을 갖고 있습니다.
2. Node.js 설치와 실행
Node.js 설치를 위해 아래 사이트에 접속하여 설치파일을 다운로드 해줍니다.
(일반적으로 LTS 버전으로 설치하지만 Angular 최신 버전인 8 버전의 실행을 위해서 Node.js는 12 버전 이상을 설치해주어야 합니다.)
설치를 완료하면 다음과 같이 Node.js와 npm의 버전을 확인해줍니다. (Node.js 설치시 npm도 함께 설치됩니다.)
※ npm (Node Package Manager)
npm은 자바스크립트 프로그래밍 언어의 패키지 관리자이며, Node.js의 기본 패키지 관리자입니다.
1
2
|
node -v
npm -v
|
cs |
다음으로 설치된 Node.js를 업데이트하기 위해 버전 매니저인 'n'을 설치해줍니다.
1
|
npm install -g n
|
cs |
설치후 캐시를 삭제해줍니다.
1
|
npm cache clean -f
|
cs |
버전 매니저를 사용하여 다음과 같이 Node.js의 버전을 관리할 수 있습니다.
버전 설치
- n 10.0.0
버전 지정 설치 - n lts
최신 LTS 버전 설치 - n stable
stable 버전 설치 - n latest
최신 current 버전 설치
버전 삭제
- n rm 10.15.1
버전 지정 삭제 - n - 10.15.1
rm 대신 '-' 사용하여 삭제 - n prune
현재 사용중인 버전을 제외한 나머지를 일괄 삭제
2.1. Node.js REPL
Node.js의 REPL(Read Eval Print Loop)은 간단한 코드를 직접 실행해 결과를 확인해볼 수 있는 가상환경입니다. node 명령어를 실행하여 프롬프트가 '>' 로 변경되면 Node.js 코드를 실행하여 결과를 확인할 수 있습니다.
1
|
node
|
2.2. Node.js 실행 (HTTP Server)
Node.js를 이용하여 간단한 HTTP 서버를 실행해보겠습니다. Node.js는 HTTP 서버 모듈을 내장하고 있어서 아파치와 같은 별도의 웹 서버를 설치할 필요가 없습니다. 실행을 위해서 아래와 같은 코드로 app.js 파일을 작성해줍니다.
1
2
3
4
5
6
7
8
9
|
const http = require('http');
http.createServer((request, response) => {
response.statusCode = 200;
response.setHeader('Content-Type', 'text/plain');
response.end('Hello World');
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');
|
cs |
다음은 작성한 코드에 대한 설명입니다.
- const http = require('http');
모듈을 require 함수를 사용하여 import 한 것이며, http 모듈을 로딩하여 http 변수에 할당하였습니다.
모듈은 파일과 1대1 대응 관계를 가지며 하나의 모듈은 독립적이 실행 영역(scope)을 갖게 됩니다. - http.createServer((request, response) => {}).listen(3000);
http 모듈의 createServer 메서드를 사용하여 http 서버 객체를 생성합니다.
생성한 http 서버 객체에 포트 번호 3000을 할당하여 서버를 실행합니다.
http 서버에 request가 발생하면 request listener 함수를 호출하여 처리 후 response를 반환합니다.
request listener 함수는 http request가 발생할 때마다 호출됩니다.
파일을 생성한 경로로 이동하여 다음 명령어를 실행해줍니다.
1
|
node app.js
|
cs |
이후 브라우저에서 http://localhost:3000 주소로 접속해보면 다음과 같이 response가 출력되는 것을 확인할 수 있습니다.
2.3. npm 설치
npm(Node Package Manager)은 자바스크립트 패키지 매니저입니다. Node.js에서 사용할 수 있는 모듈을 패키지화하여 모아둔 저장소와 패키지 설치, 관리를 위한 CLI를 제공합니다.
npm은 기본적으로 Node.js에 포함되어 있어서 Node.js 설치시 자동으로 함께 설치되지만 자주 업데이트되므로 필요에 따라 최신 버전으로의 업데이트가 필요합니다.
다음 명령어를 실행하여 최신 버전으로 업데이트를 해줍니다.
1
|
npm install -g npm@latest
|
cs |
2.4. npm을 이용한 패키지 설치
Node.js에서 사용할 수 있는 모듈인 패키지를 설치할 때는 npm install 명령어 뒤에 패키지명을 붙여서 사용합니다.
1
|
npm install [패키지명]
|
cs |
Angular2 버전 이상에서 사용되는 cookie 모듈인 ng2-cookies 패키지를 설치해보겠습니다.
1
|
npm install -g ng2-cookies
|
cs |
설치 후에 Node.js의 기본 설치 경로인 /usr/local/lib/node_modules (macOS 기준) 경로로 이동하여 확인해보면 정상적으로 설치된 것을 확인할 수 있습니다.
※ npm 지역 설치와 전역 설치
npm install 명령어는 지역 설치와 전역 설치 옵션이 있습니다.
- 지역 설치
npm install [패키지명]
옵션을 별도로 지정하지 않으면 프로젝트 디렉터리 내에 node_modules 디렉터리가 자동 생성되고 그 안에 패키지가 설치됩니다.
지역 설치된 패키지는 해당 프로젝트 내에서만 사용할 수 있습니다.- 전역 설치
npm install -g [패키지명]
-g 옵션을 추가하여 설치하면 전역으로 설치되며 해당 패키지는 전역에서 참조할 수 있습니다.
모든 프로젝트가 공통으로 사용하는 패키지는 지역 설치가 아닌 전역 설치를 하여 사용합니다.
2.5. package.json과 의존성 관리
npm install을 전역 설치하지 않을 경우 다음과 같이 package .json을 찾을 수 없다는 경고가 발생합니다.
Node.js 프로젝트의 경우 많은 패키지를 사용하게 되는데 의존 패키지에 대해 일괄적으로 관리해줄 필요가 있습니다. npm은 이러한 경우에 대해 package.json 파일을 이용하여 프로젝트 정보와 패키지 의존성을 관리합니다. package.json 파일은 Java의 maven에서 사용되는 pom.xml과 비슷한 역할을 합니다.
package.json 파일의 생성을 위해 프로젝트의 루트 경로에서 npm init 명령어를 실행해줍니다. (기본 설정값으로 생성하기 위해 --y 옵션을 함께 써줍니다.)
1
|
npm init -y
|
생성된 package.json 의 내용을 보면 dependencies 항목에 name과 version이 추가된 것을 확인할 수 있습니다.
package.json의 항목을 보면 dependencies와 devDependencies 항목이 있는데 의존 패키지에 대한 용도를 다르게 설정할 때 나누어 사용합니다.
- dependencies
운영,배포 단계에서 필요한 의존성 모듈을 설정합니다. - devDependencies
개발 단계에서 필요한 의존성 모듈을 설정합니다.
TypeScript와 같은 트랜스파일러(transpiler)의 경우 개발 단계에서만 필요하기 때문에 여기에 설정해줍니다.
※ npm install의 --save 옵션
npm@5 부터 --save는 기본 옵션이 되었습니다. 따라서 별도로 사용하지 않더라도 package.json의 dependencies에 설치한 패키지의 name과 version이 작성됩니다. --save 옵션은 다음과 같이 나눠집니다.
- --save
npm install [패키지명] --save
package.json의 dependencies에 name과 version이 작성됩니다.- --save-dev
npm install [패키지명] --save-dev
package.json의 devDependencies에 name과 version이 작성됩니다.
이상으로 Node.js와 npm에 대해 알아보았습니다.
※ 참고 문헌
- 이웅모 지음, 『Angular Essentials』, 루비페이퍼(2018), p9 ~ p19. 02. Node.js와 npm
- tech.peoplefund.co.kr, 멈추지 않고 기다리기(Non-blocking)와 비동기(Asynchronous) 그리고 동시성(Concurrency), https://tech.peoplefund.co.kr/2017/08/02/non-blocking-asynchronous-concurrency.html