기본 콘텐츠로 건너뛰기

NodeJS와 npm

NodeJS와 npm

NodeJS와 npm

NodeJS와 npm에 대해 알아보겠습니다.

1. NodeJS 소개

NodeJS는 Chrome V8 자바스크립트 엔진으로 빌드된 JavaScript Runtime Environment 입니다. 주로 서버 사이드 애플리케이션 개발에 사용되는 플랫폼이며, 웹 브라우저에 종속적인 자바스크립트 애플리케이션을 여러 OS에서 실행할 수 있는 환경을 제공합니다. 또한 애플리케이션 개발에 사용하기 위해 필요한 모듈, 파일 시스템, http 라이브러리 등을 built-in 으로 제공합니다.

NodeJS는 자바스크립트를 사용해 개발하는데 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)이 발생하기 때문에 웹페이지 표시가 지연되는 현상이 발생합니다. NodeJS의 경우 이러한 문제에 대해 모든 API를 비동기 방식으로 동작하도록 하여 Non-blocking I/O 가 가능하도록 합니다. 따라서 실시간 데이터 처리가 빈번한 SPA(Single Page Application) 에 적합합니다. 하지만 CPU 사용률이 높은 애플리케이션에서는 권장되지 않는다는 특징을 갖고 있습니다.

2. NodeJS 설치와 실행

NodeJS 설치를 위해 아래 사이트에 접속하여 설치파일을 다운로드 해줍니다.

(일반적으로 LTS 버전으로 설치하지만 Angular 최신 버전인 8 버전의 실행을 위해서 NodeJS는 12 버전 이상을 설치해주어야 합니다.)

설치를 완료하면 다음과 같이 NodeJS와 npm의 버전을 확인해줍니다. (NodeJS 설치시 npm도 함께 설치됩니다.)

※ npm (Node Package Manager) npm은 자바스크립트 프로그래밍 언어의 패키지 관리자이며, NodeJS의 기본 패키지 관리자입니다.

1 2 node -v npm -v cs

다음으로 설치된 NodeJS를 업데이트하기 위해 버전 매니저인 'n'을 설치해줍니다.

1 npm install -g n cs

설치후 캐시를 삭제해줍니다.

1 npm cache clean -f cs

버전 매니저를 사용하여 다음과 같이 NodeJS의 버전을 관리할 수 있습니다.

버전 설치

n 10.0.0

버전 지정 설치

버전 지정 설치 n lts

최신 LTS 버전 설치

최신 LTS 버전 설치 n stable

stable 버전 설치

stable 버전 설치 n latest

최신 current 버전 설치

버전 삭제

n rm 10.15.1

버전 지정 삭제

버전 지정 삭제 n - 10.15.1

rm 대신 '-' 사용하여 삭제

rm 대신 '-' 사용하여 삭제 n prune

현재 사용중인 버전을 제외한 나머지를 일괄 삭제

2.1. NodeJS REPL

NodeJS의 REPL(Read Eval Print Loop)은 간단한 코드를 직접 실행해 결과를 확인해볼 수 있는 가상환경입니다. node 명령어를 실행하여 프롬프트가 '>' 로 변경되면 NodeJS 코드를 실행하여 결과를 확인할 수 있습니다.

1 node cs

2.2. NodeJS 실행 (HTTP Server)

NodeJS를 이용하여 간단한 HTTP 서버를 실행해보겠습니다. NodeJS는 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)을 갖게 됩니다.

모듈을 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)은 자바스크립트 패키지 매니저입니다. NodeJS에서 사용할 수 있는 모듈을 패키지화하여 모아둔 저장소와 패키지 설치, 관리를 위한 CLI를 제공합니다.

npm은 기본적으로 NodeJS에 포함되어 있어서 NodeJS 설치시 자동으로 함께 설치되지만 자주 업데이트되므로 필요에 따라 최신 버전으로의 업데이트가 필요합니다.

다음 명령어를 실행하여 최신 버전으로 업데이트를 해줍니다.

1 npm install - g npm@latest cs

2.4. npm을 이용한 패키지 설치

NodeJS에서 사용할 수 있는 모듈인 패키지를 설치할 때는 npm install 명령어 뒤에 패키지명을 붙여서 사용합니다.

1 npm install [패키지명] cs

Angular2 버전 이상에서 사용되는 cookie 모듈인 ng2-cookies 패키지를 설치해보겠습니다.

1 npm install - g ng2 - cookies cs

설치 후에 NodeJS의 기본 설치 경로인 /usr/local/lib/node_modules (macOS 기준) 경로로 이동하여 확인해보면 정상적으로 설치된 것을 확인할 수 있습니다.

※ npm 지역 설치와 전역 설치 npm install 명령어는 지역 설치와 전역 설치 옵션이 있습니다.

지역 설치

npm install [패키지명]

옵션을 별도로 지정하지 않으면 프로젝트 디렉터리 내에 node_modules 디렉터리가 자동 생성되고 그 안에 패키지가 설치됩니다.

지역 설치된 패키지는 해당 프로젝트 내에서만 사용할 수 있습니다.

npm install [패키지명] 옵션을 별도로 지정하지 않으면 프로젝트 디렉터리 내에 node_modules 디렉터리가 자동 생성되고 그 안에 패키지가 설치됩니다. 지역 설치된 패키지는 해당 프로젝트 내에서만 사용할 수 있습니다. 전역 설치

npm install -g [패키지명]

-g 옵션을 추가하여 설치하면 전역으로 설치되며 해당 패키지는 전역에서 참조할 수 있습니다.

모든 프로젝트가 공통으로 사용하는 패키지는 지역 설치가 아닌 전역 설치를 하여 사용합니다.

2.5. package.json과 의존성 관리

npm install을 전역 설치하지 않을 경우 다음과 같이 package .json을 찾을 수 없다는 경고가 발생합니다.

NodeJS 프로젝트의 경우 많은 패키지를 사용하게 되는데 의존 패키지에 대해 일괄적으로 관리해줄 필요가 있습니다. npm은 이러한 경우에 대해 package.json 파일을 이용하여 프로젝트 정보와 패키지 의존성을 관리합니다. package.json 파일은 Java의 maven에서 사용되는 pom.xml과 비슷한 역할을 합니다.

package.json 파일의 생성을 위해 프로젝트의 루트 경로에서 npm init 명령어를 실행해줍니다. (기본 설정값으로 생성하기 위해 --y 옵션을 함께 써줍니다.)

1 npm init - y cs

생성된 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이 작성됩니다.

npm install [패키지명] --save package.json의 dependencies에 name과 version이 작성됩니다. --save-dev

npm install [패키지명] --save-dev

package.json의 devDependencies에 name과 version이 작성됩니다.

이상으로 NodeJS와 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

공유하기 글 요소 저작자표시

from http://freestrokes.tistory.com/93 by ccl(A)

댓글

이 블로그의 인기 게시물

[Mac OS X] 데스크탑 응용프로그램 개발시작

[Mac OS X] 데스크탑 응용프로그램 개발시작 현재 회사에서 다음 프로젝트로 Mac OS X를 개발해야 하는 일정이 생겨 난생 처음 데스크탑 응용프로그램을 개발하기 공부를 시작했고 여러가지 플랫폼이 있다는것을 발견했다. 어떤 플랫폼을 사용해야할 지 먼저 고민해보자. 무엇으로 개발할것인가? Xcode & Swfit or Objective-C Mac OS X 는 objective-c를 기반으로 만들어졌다. apple에서 제공하는 Xcode와 objective-c 혹은 Swift로 응용 프로그램을 만들 수 있다. Electron Electron 프레임워크를 사용하면 javascript, HTML, CSS를 사용하여 크로스 플랫폼 데스크탑 응용 프로그램을 만들 수 있다. react-native-desktop Qt 프레임 워크를 기반으로하는 크로스 플랫폼이다. react-native 와 javascript로 응용 프로그램을 만들 수 있다. Qt는 컴퓨터 프로그래밍에서 GUI 프로그램 개발에 널리 쓰이는 크로스 플랫폼 프레임워크. 각 플랫폼의 장단점은 무엇인가? Xcode & Swfit or Objective-C - 장점 모든 OSX API에 직접 접근할 수 있다. Xcode를 통해 App Store에 쉽게 배포할 수 있다. - 단점 Windows 전용 응용 프로그램을 다시 개발해야한다. Swift언어를 모른다면 새로 공부해야 한다. Electron - 장점 웹스택을 가지고 빠르게 만들 수 있다. 다양한 플랫폼을 지원한다. - 단점 Native언어로 개발할때 보다 성능이 떨어질 이슈가있다. OS X API를 사용하는데 복잡하다. *API에 대한 JavaScript 래퍼가 없으면 자체 래퍼를 작성하지 않는 한 프로젝트에서 사용할 수 없습니다. React-native-desktop - 장점 현재 개발스택과 완전히 동일하므로 더 빠르게 개발 할 수 있다. 다양한 플랫폼을 지원한다. - 단점 N...

AWS CI/CD 파이프라인에 Slack 알람 적용(Lambda, CloudWatch Events 연동)

AWS CI/CD 파이프라인에 Slack 알람 적용(Lambda, CloudWatch Events 연동) 이번 글에서는 구축된 CI/CD 파이프라인과 Slack 알람을 연동하는 방법에 대해서 알아볼 것이다. CI/CD 파이프라인 시작/종료(성공/실패) 시 Amazon CloudWatch Events에서 해당 이벤트를 감지한 후 AWS Lambda로 트리거 신호를 보내면 AWS Lambda에서 Slack채널로 알람을 보내는 프로세스다. 글의 순서는 다음과 같다. Amazon CloudWatch Events, AWS Lambda란? 실습 전 준비사항 Slack Webhook 생성 AWS Lambda 함수 생성 AWS CloudWatch Events 생성 테스트 위와 같은 방식으로 구축을 하면 최종 프로세스는 다음 그림과 같다 (우리가 이 글에서 진행하는 내용은 빨간색으로 표시된 부분) 1. Amazon CloudWatch Events, AWS Lambda란? 1-1. Amazon CloudWatch Events란? Amazon CloudWatch Event(혹은 AWS CloudWatch Events)는 AWS 상태 변경 등을 감시할 수 있는 기능이다. 만약 사용자가 만든 규칙에 맞는 이벤트가 발생하게 되면 해당 이벤트가 사정에 정의된 규칙과 일치할 경우 하나 이상의 대상 작업을 호출한다. 이벤트 유형에 따라 알람을 보내거나, 이벤트 정보를 캡쳐하거나, 교정작업을 수행하거나, 이벤트를 시작하거나, 기타 작업을 수행할 수 있다. 이벤트가 발생할 경우 대상 작업은 AWS Lambda함수, AWS Kinesis 스트림, AWS SQS, Amazon SNS 등이 있다. 사용되는 사례로는 1) 이벤트가 발생하면 Lambda함수를 사용하여 Slack채널로 알림을 전달하거나, 2) AWS 상태 이벤트가 발생하면 Lambda 및 CloudWatch Events를 사용하여 Amazon SNS로 사용자 지정 텍스트 또는 SMS 알림을 보내는 등...

[2020-angstromCTF] web - A peculiar query write-up

[2020-angstromCTF] web - A peculiar query write-up English write-up UI seems like below. If you click the 'the source' link, you can get back-end source code. const express = require("express"); const rateLimit = require("express-rate-limit"); const app = express(); const { Pool, Client } = require("pg"); const port = process.env.PORT || 9090; const path = require("path"); const client = new Client({ user: process.env.DBUSER, host: process.env.DBHOST, database: process.env.DBNAME, password: process.env.DBPASS, port: process.env.DBPORT }); async function query(q) { const ret = await client.query(`SELECT name FROM Criminals WHERE name ILIKE '${q}%';`); return ret; } app.set("view engine", "ejs"); app.use(express.static("public")); app.get("/src", (req, res) => { res.sendFile(path.join(__dirname, "index.js")); }); app.get("/", async (req, res) => { if (req.query...