기본 콘텐츠로 건너뛰기

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)

댓글

이 블로그의 인기 게시물

카카오 오픈빌더와 외부 API 연동(feat.Nodejs)

카카오 오픈빌더와 외부 API 연동(feat.Nodejs) 이전에 플러스 친구와 외부 API 연동에 관한 글을 작성한 적 있습니다. 하지만 지난 2년동안 플러스 친구에 많은 변화가 생겼는데요. 카카오 플러스 친구의 명칭이 카카오 채널로 바뀌고, 챗봇 세팅 방식이 기존 [카카오 플러스 친구 - 외부 API 연동] 구조에서 오픈빌더가 추가되어 [카카오 채널(구 플러스 친구) - 카카오 i 오픈빌더 - 외부 API 연동] 구조로 바뀌었습니다. 이번 글에서는 오픈빌더의 챗봇 시나리오 관리 기능을 간단히 소개하고 외부 API를 연동하는 예제를 다뤄보겠습니다. (연동파트는 5번 항목부터 보시면 됩니다.) 1. 블록 블록은 오픈빌더에서 질의/응답을 관리하는 최소 단위로, 사용자의 발화와 챗봇의 대답을 입력할 수 있습니다. 예를들어 인사라는 블록을 만들고 인사에 해당하는 사용자 발화 패턴들을 입력해두면, 실제 채널 톡방에서 그에 해당하는 발화가 들어왔을때 입력해둔 응답이 나오는 형식입니다. 예전에는 패턴과 발화 키워드가 1:1 매칭, 즉 입력해둔 패턴과 사용자 발화의 string이 정확히 일치할때만 블록이 실행됐었는데, 발화 패턴을 20개 이상 등록하면 머신러닝 기능을 이용할 수 있도록 기능이 생겼습니다. 아마 유사도 분석 개념이 기본으로 들어가있을 것이기 때문에 블록의 주제와 벗어나는 너무 뜬금없는 발화패턴들을 많이 넣지 않도록 하는걸 권장하겠습니다. 2. 시나리오 시나리오는 '블록'들을 묶어서 관리할 수 있는 단위로, 일종의 폴더 구조라고 생각하면 쉽습니다. 오픈빌더에서 좌측 상단에 파란 버튼을 클릭하여 시나리오를 생성할 수 있습니다. 하나의 시나리오에서 모든 블록을 관리하면 챗봇 도메인이 커질수록 관리가 어려워지니 아래 같은식으로 시나리오를 사용하여 블록을 구조화하면 운영 측면에서 수월해집니다. 3. 컨텍스트 컨텍스트는 맥락이라는 뜻 입니다. 오픈빌더에 존재하는 컨텍스트는 자연어 분석을 통해서 맥...

20.03.24 ShareBook TIL

20.03.24 ShareBook TIL Project/TIL 20.03.24 ShareBook TIL 중간 배포를 위해 EC2, RDS를 다시 설정하였다. EC2에 git에서 clone을 하고 서버를 작동시켜보니 ts로 돌려서 그런지 작동하지 않고 대기 상태로 있다가 timeout같은 시간 초과 에러가 났다. 그리고 갑자기 EC2 자체가 느려져서 nodejs를 삭제하고 다시 nvm으로 높은 버전의 node를 설치하였다. 그리고 나서 혹시 js로 돌리면 될까 해서 tsc로 js로 변환한뒤 돌려보니 RDS와 연결이 되지 않는 에러가 생겼다. workbench로 RDS를 연결했을 때는 정상적으로 작동해서 EC2에서 잘 못 설정한게 있다고 생각했다. 그래서 local에서 한번 config.json을 수정하고 연결하여도 똑같은 에러가 발생했다. 그럼 보안 설정에서 문제인가 싶어서 EC2, RDS 보안 그룹에서 설정을 막 만져보다 RDS에서 Custom TCP에 처음 RDS에서 설정한 포트를 넣어주었더니 연결되었다. config.json내용을 EC2에도 똑같이 적용시켜보려고 json파일을 vim으로 작성해서 넣어 주었지만 여전히 같은 에러를 반복하였다. 그럼 json 파일을 못 읽어내는게 아닌가 싶어서 그냥 module에 index.js에서 sequelize를 생성하는 부분에 직접 넣어 주었더니 마침내 연결이 되었다. 해결하고 난 뒤 생각의 흐름을 적어보니 매우 짧지만 정작 오늘 아침 10시 반부터 시작해서 저녁 10시 반까지 12시간을 고민하고나서야 해결되었다. from http://three-five.tistory.com/46 by ccl(A) rewrite - 2020-03-25 00:54:05

AWS instance로 Nodejs 구현하기

AWS instance로 Nodejs 구현하기 서버와 데이터베이스 관리 차원에서 효율적으로 관리하기 위해선 로컬보다는 서버를 호스팅해서 하는 것이 좋다. 우리는 Nodejs를 구동하기 위해 AWS에서 인스턴스를 할당받을 계획이다. 인스턴스의 pem키를 발급받아 nodejs와 npm까지는 설치를 완료한 상태이다. $ sudo npm install -g express 다음의 명령어를 입력하면 글로벌 옵션으로 어느 path에서든 express를 사용할 수 있게 설치한다. 다음과 같이 실행이 된다면 성공이다. 이후 Express generator를 설치한다. $ sudo npm install -g express-generator@4 버전은 4.x이며 이 역시 글로벌 옵션으로 설치해 준다. 이제 Node monitoring을 위해 nodemon을 설치해 준다. $ sudo npm install -g nodemon 모든 설치가 끝났다. 이제 nodejs를 실행시킬 프로젝트용 directory를 만든다. 이렇게 만들어 주고 express를 실행시키면 된다. $ express -e 다음과 같은 결과가 나오면 된다. 이제 node package를 설치하는 명령어를 입력하자. $ sudo npm install 이제 vi를 통해 포트번호를 정의해보자. app.set의 마지막에 한줄을 추가하면 된다. app.set('port', process.env.PORT || 9000); 이로써 우리는 9000번 포트를 사용하게 되었다. 또한 마지막줄에 서버를 생성하기 위한 코드를 작성하자. module.exports = app; var server = app.listen(app.get('port'), function() { console.log('Express server listening on port ' + server.address().port); }); 이...