Node.js
: 확장성 있는 네트워크 App 개발에 사용되는 소프트웨어 플랫폼. 자바스크립트를 활용하며 Non-blocking I/O 와 단일 스레드 이벤트 루프를 통한 높은 처리 성능이 장점
스레드 기반 vs 비동기 이벤트 기반
Blocking I/O : 하나의 프로세스가 어떤 자원을 사용하고자 할 때 그 자원을 다른 프로세스가 점유하고 있다면, 해당 프로세스가 해당 자원의 사용을 마칠때까지 기다리는 것
멀티스레드 : CPU를 시분할을 통해 스레드가 시간을 나누어 동작하는 방식.
-> 스케쥴링, 문맥전환, 블로킹 등의 지연시간 발생하는 단점. (CPU가 모든일 처리)
이벤트기반의 비동기 I/O처리 : 작업 요청 후, 처리에 대한 응답을 기다리지 않고 다음 작업을 실행시키고, I/O작업이 종료되면 (콜백 형태의 데이터를 읽어오는)이벤트를 발생시켜 이벤트에 따른 작업을 실행. -> 문맥전환 소모시간을 줄임.
*단점 : 특정 하나의 작업이 오래걸릴시 처리가 늦어질 수 있다. (최소화 코드로 작성)
이벤트루프 : 작업 요청시, 해당 요청을 받아 콜백함수와 함께 (워커)스레드 전달, 실행만 시키고, 다시 다른 요청을 감지하기 위해 대기한다. (워커)스레드가 작업을 마치면 전달받은 콜백함수를 실행해 이벤트 루프로 응답하고, 이것을 실행시켜 클라이언트에게 결과를 응답하는 방식.
노드는 빠른 반응속도를 보장, 동시에 많은 연결에 좋은 성능을 가졌다. 하지만 CPU와 메모리를 더 사용한다는 측면이 있다. (아파치,PHP에 비해)
노드아키텍쳐 | ||||
노드 바인딩 (socket, http, etc) | ||||
v8엔진 : 노드는 이 엔진을 이용하여 자바스크립트로 개발된 노드 APP 동작 | 스레드 풀 : libeio(비동기 I/O 라이브러리)로 구성 비동기 입출력 작업들은 해당 라이브러리로 동작한다. | 이벤트 루프 : libev를 이용하여 구성. | DNS | crypto |
기본 모듈과 노드 기초
노드에서 모듈 : 개발한 App의 기본 조각. 확장성을 위해 모듈을 통해 App을 구성한다.
모듈의 종류 | |||||
기본으로 포함 | 설치 위치, 사용 범위 | 언어에 따라 | |||
기본모듈 | 확장모듈 | 글로벌 모듈 | 로컬 모듈 | 일반 모듈 | 네이티브 모듈 |
노드의 기능을 확장하기 위한 것. 기능 추가와 더 편리하기 사용하기 위한 | 어디서든 사용할 수 있도록 설치한 모듈 | 해당 App에서만 사용하기 위한 | 자바스크립트로 개발된 모듈 | C/C++로 모듈을 개발한 경우 | |
복합모듈 : 다양한 파일 포함, 모듈 구성단위는 폴더. 폴더 단위 모듈을 인식하려면 index.js 혹은 package.json 파일 중 하나가 반드시 있어야한다. |
모듈 식별자 | 상대적 식별자 | 현재 위치 기준. ./생략시 현재 위치에서 모듈 찾지 않음. |
절대적 식별자 | 절대 위치 기준. | |
최상위 레벨 식별자 | 모듈 이름만 입력시, 해당 모듈이름을 검색하여 로드 | |
EX> require('./file'); , require('/folder1/folder2/file') , require('file') |
Console객체 | Log() | 로그 메시지 출력 | |
time(label) | 시간 측정 시작 | ||
timeEnd(label) | 시간 측정 종료 |
Process 객체 | argv | 명령줄에서 실행할 때 입력한 매개 변수를 나타내는 배열 |
env | 실행된 컴퓨터 시스템의 환경에 대한 정보 | |
version | 노드의 버전 | |
versions | 이 노드 프로세스에서 사용하는 모듈들의 버전 | |
arch | 프로세서의 아키텍쳐 정보 | |
platform | 플랫폼 정보 | |
메서드 | 설명 | |
exit([exitCode=0]) | 프로그램 종료 | |
memoryUsage() | 메모리 사용 정보 반환 | |
uptime() | 프로세스의 실행 시점부터 이 메서드를 호출한 시점까지의 시간반환 | |
OS 객체 | tmpDir() | 운영체제의 임시 파일들을 위한 기본 Dir를 반환 |
hostname() | 운영체제의 호스트 이름 반환 | |
type() | 운영체제 이름반환 | |
platform() | 운영체제 플랫폼을 반환 | |
arch() | 운영체제의 CPU 아키텍처 이름을 반환 | |
release() | 운영체제 시스템의 릴리즈 버전 반환 | |
uptime() | 운영체제가 지금까지 실행된 총 시간을 반환 | |
loadavg() | 운영체제의 1 , 5 ,15분간의 평균 부하량을 배열로 변환 | |
totalmem() | 운영체제의 전체 메모리 크기를 바이트 단위로 반환 | |
freemem() | 운영체제의 사용 가능한 메모리 크기를 바이트 단위로 반환 | |
cpus() | CPU 세부 정보 반환 | |
getNetworkInterfaces() | 네트워크 인터페이스를 반환 |
유틸리티 함수 모듈 : Utilities - require() 메서드를 이용 객체로 로드해야함 var util = require('util') | |
format(format, [...]) | 문자열 포맷팅 메서드 %s 문자열 %d 숫자 %j JSON %순서에있는 문자열 인수 소비x |
debug(string) | 디버그용 메시지 출력 |
error([...]) | 오류용 메시지 출력 |
puts([...]) | 동기 방식의 출력 함수이며 인수마다 개행 문자 추가 |
print([...]) | 동기 방식의 출력 메서드 |
log(string) | 타임스탬프와 함께 문자열 출력 |
inspect (object, [showHidden], [depth], [colors] | 객체의 정보를 문자열로 표현 depth값 - 탐색 정도의 값. (기본값 2회, null시 무한) colors값 - ture시 ANSI컬러 스타일 (기본값 false) |
isArray(object) | 객체가 배열 형태인지 확인 |
isRegExp(object) | 객체가 정규식인지 확인 |
isDate(object) | 객체가 날짜 형태인지 확인 |
isError(object) | 객체가 오류 형태인지 확인 |
pump(readableStream, writableStream, [callback]) | 스트림에서 데이터를 읽어서 스트림에 보내는 메서드 |
inherits(constructor, superConstructor) | 객체 상속메서드 |
파일 시스템 모듈 : File System 모듈의 모든 메서드들은 동기 버전과 비동기 버전이며, var fs = require('fs') 로 불러들여 사용한다. (모든 메서드에 Sync를 붙여 동기 버전으로 사용가능, 순서적으로 진행됨) |
|
압축 모듈 (Zlib) : 파일 압축을 도와주는 기본 모듈 var zlib = require ('zlib') |
|
이벤트 모듈 <p.163 | |
emitter.addListener(event, listener) | 특정 이벤트에 대응하여 동작할 이벤트 리스너 추가 |
emitter.on(event, listener) | 특정 이벤트에 대응하여 동작할 이벤트 리스너 추가 |
emitter.once(event,listener) | 특정 이벤트에 대응하여 단 한번 동작할 이벤트 리스너 추가 |
emitter.removeListener (event, listener) | 특정 이벤트에 대응하는 이벤트 리스너를 제거 |
emitter.removeAllListeners([event]) | 특정 이벤트에 대응하는 모든 이벤트 리스너 제거 |
emitter.setMaxListeners(n) | EventEmitter가 가질 수 있는 리스너의 최대 개수를 지정 |
emitter.listeners(event) | 특정 이벤트에 추가된 모든 리스너를 배열로 전화 |
emitter.emit(event, [arg1],[art2...]) | 리스너에 전달할 매개변수와 함께 특정 이벤트를 발생 |
HTTP 모듈 : TCP/IP 기반 프로토콜, 요청과 응답 (Request, Response)이 전부인 요청헤더와 응답헤더를 주고받음으로 통신을하게 됨. < var http = require('http'); //http var https = require('https'); //https > | |||||||||||||||||||
메서드 | 설명 | ||||||||||||||||||
listen(port [ , callback]) | 서버 실행 | ||||||||||||||||||
close() | 서버 종료 | ||||||||||||||||||
이벤트 | 설명 | ||||||||||||||||||
request | 클라이언트 요청 발생 | ||||||||||||||||||
connection | 클라이언트 접속 | ||||||||||||||||||
close | 서버가 종료될 때 발생 | ||||||||||||||||||
checkContinue | 클라이언트가 계속 연결되어 있는지 확인 | ||||||||||||||||||
upgrade | 클라이언트가 HTTP 업그레이드 요청 | ||||||||||||||||||
clientError | 클라이언트에서 오류발생 | ||||||||||||||||||
Response (객체) : 사용자의 요청에 따라 응답하는 객체. 값을 이용해 Redirect, 쿠키생성 등을 할 수 있다. (여러가지로 응용가능) 상태코드: 1xx (처리중) , 2xx (성공) , 3xx Redirct , 4xx (클라이언트 오류), 5xx (서버 오류)
Request (객체) : 클라이언트의 요청에 대한 정보. 어떤 방식으로 데이터 요청했는지에 ᄄᆞ라 다른 응답할 수 있고, 사용한 브라우저 언어에 따라 다국어 페이지 지원 가능. (응용가능) |
클러스터링 모듈 : 모든 CPU 코어별로 클러스터링하여 업무를 분담하여 수행.
비동기 방식의 코드 작성
-선형시퀀스형태
: 순서가 보장되어야 하는 경우. 중첩콜백을 통해 콜백안의 콜백을 이용하여 순서를 보장
-코드 병렬화
: 콜백 함수 안에 작업을 완료하는 기준을 삼아서 모든 결과값을 통합하여 종료
-코드 재사용
: 하나의 함수에 결과값계산 , 콜백을 하여, 콜백을 다른 함수에 넘겨주어 병렬작업을 하는 방법.
노드에서의 상속
기본적인 상속 방법 | Util.inherits() 메서드 상속 |
|
> Bar가 Foo를 상속 받음을 의미 |
npm으로 확장 모듈 이용하기
npm : 노드의 기본 모듈은 낮은 수준의 기본적인 API만 제공하므로, 개발자가 기능을 더 빠르고 효율적으로 편리하게 개발할 수 있도록 지원해주는 노드의 모듈 패키지 관리 도구.
Window, 우분투 모드 최신 버전의 노드 설치시에 이미 설치되어있다.
설치 여부 확인시 - cmd -> npm -v 로 확인할 수 있다.
만약 설치가 안되있다면, 혹 직접 설치하여 사용하고 싶다면 노드 설치후
리눅스 버전 -> curl 명령어로 내려받아 설치.
curl 설치가 안되있다면 < sudo apt-get install curl > 로 설치.
/usr/local 아래 설치되기 때문에 권한을 설정해준다.
sudo chown -R $USER /usr/local
curl https://npmjs.org/install.sh > install.sh 로 파일을 내려받고
sudo sh install.sh 로 실행. It worked 메시지가 창에 보인다면 정상 설치 완료.
확장모듈
- 필요한 모듈을 간단한 방법으로 설치할 수 있다. < 글로벌 or 로컬 방식 >
http://npmjs.org/에서 모듈 검색 및 모듈 상세내용을 알아볼 수 있다.
(혹은 npm serarch [모듈명] , npm info [모듈명] 명령어로도 가능)
글로벌 설치 ( 전역설치 ) | ||||||||
sudo npm install [모듈명] -g <리눅스> npm install [모듈명] -g <윈도우> 한꺼번에 설치시 모듈명, 모듈명, ... npm list -g 설치된 모듈 목록 확인 npm install [모듈명@버전] 특정버전의 확장모듈 설치시 npm update [모듈명] -g 업데이트 npm uninstall [모듈명] -g 삭제
| ||||||||
로컬 설치 | ||||||||
현재 Dir 에 패키지를 설치. 노드 모듈은 ./node_modules에 설치, 실행 관련 파일은 ./node_modules/bin/ 에 설치되며, 매뉴얼 페이지는 설치되지 않는다. -g 옵션 없이 설치하면 로컬로 설치된다. |
package.json
- 배포할 모듈 정보를 담고자 위해 만들어졌지만, 노드로 작성한 App도 package.json 파일을 사용하여 관리할 수 있다. (사용하는 확장 모듈에 대한 의존성 관리가 가능해 편리)
npm init 명령 npm install -save 모듈 정보 추가가능 |
http://programmingsummaries.tistory.com/385
http://alexband.tistory.com/10 > 참조
웹 애플리케이션 개발 확장 모듈
1. nodemon (node monitor) - 노드가 실행하는 파일이 속한 디렉터리를 감시하고 잇다가 파일이 수정되면 자동으로 노드 애플리케이션을 재시작하는 확장모듈. 소스 코드 수정때마다 새로 시작할 필요 x | |
설치 | |
sudo npm install nodemon -g | |
사용방법 | |
nodemon [프로젝트명].js | |
supervisor - nodemon과 유사한 모듈 | |
설치 | |
sudo npm install supervisor -g | |
사용방법 | |
supervisor [프로젝트명].js | |
2. express - 경량화 웹 개발 프레임워크. 웹 서비스, 웹 애플리케이션 개발에 널리쓰임. http모듈을 이용하여 웹 서버 구축, 데이터를 표시하는 방식을 좀 더 추상화시켜 웹 서비스, 애플리케이션 개발을 편리하도록 다양한 API 제공 | |
설치 | |
sudo npm install express -g | |
프로젝트 만들기 ( 이클립스 ver ) | |
New -> node.js Express Project <까지하면 express 프로젝트 완성 > -> (package.json) Run As -> Run Configurations -> Refrsh 하면 확장 모듈들이 설치된 것을 확인할 수 있다. | |
app.js 소스 (express 프로젝트 설치시 옵션으로 주어진다) | |
|
|
| 포트설정 - 정해진 포트값 없으면 3000 뷰 디렉터리 - 화면의 출력을 담당하는 뷰 계층을 구성하는 파일들을 연결하는 부분 뷰 엔진 - 기본 엔진 이름 정의. ejs, jade ... 라우터설정 - 사용자의 요청에 따라 어떻게 응답할지 결정하는 것. 라우터는 별도의 모듈로 정의하는 것이 일반적. 해당 모듈로 정의된 객체를 app(프로젝트)객체에 연결 정적 디렉터리 설정 - 디렉터리 구조를 URL에 반영하여 쉽게 접근 가능한 정적 디렉터리 설정. 클라이언트 측의 자바스크립트, css, 이미지파일등 같은 리소스를 설정한 디렉터리에 두어 사용한다.
|
페이지 라우팅 - express 에서의 라우팅은 클라이언트로부터 요청받은 URL과 뷰를 매칭시키는 것. (특정한 URL에 대해 특정한 View로 연결하는 것) | |
| ./ : rootpage. GET방식으로 들어오는 경로를 연결하여 페이지를 넘겨주는.
req에 따른 res가 필요한 경우 함수를 작성하여 동작하도록 구현한다. |
웹 애플리케이션 프로젝트 생성 | |
|
|
Jade - express 화면을 구성하기 위한 뷰 템플릿 엔진. (ejs 도있다) Haml(HTML을 위한 경량화 마크업 언어, 콘텐츠를 동적으로 표현하는 언어) 의 영향을 받은 노드용 뷰 템플릿 엔진. | |
태그 표현방법 html head body -> 코드가 단순, 가독성이 좋아지고 구조가 명확해진다. 들여쓰기 (인덴팅)을 통해 계층 구조를 표현하므로, 들여쓰기 단위를 통일해야한다. 태그 ID표현 - #[ID] > 고유한 이름 부여 태그 클래스 표현 - .[클래스이름] > 클래스이름 부여 >> # or . 부여시 자동으로 <div>태그 로 렌더링 된다. 태그의 속성 표현 (style = " --- ") , (type="--", "--") >> 괄호로 표현하고, 여러개의 속성시 ‘,’를 사용 | |
콘텐츠 표현하기 - 태그 서술이 끝나면 띄어쓰기 후 표현하고자하는 텍스트 기술. ex) div#divisionElement1 Hello Jade! div#divsionElement1 | Hello | Jade >>같은 표현방법 동적 콘텐츠 표현 - 서버에서 가공한 data를 Jade에 만든 틀에 맞춰 출력할 수 있다. #{fieldname} 으로 Data를 전달해주면 되지만, 만약 HTML태그가 포함되어있는 경우에는 뷰에 HTML내용이 나올수 있으므로, !{fieldNamde}으로 출력하면 된다. 자바스크립트와 CSS의 표현 > 여러줄로 표현해야 할 경우가 많으나, Jade에서 <script> , <style> 태그는 세로선을 사용하지 않고도 여러 줄 구성된 코드 기술을 지원함. ‘|’ 안써도 된다는 말
| |
주석 처리 // , //- 로 주석처리. 들여쓰기를 통해서 블록단위로 주석처리가능. |
Socket.IO - 웹 브라우저, 모바일 장치를 지원하는 실시간 웹 애플리케이션 지원 라이브러리 자바스크립트로 구현되어있고, 실시간 웹을 구현할 수 있는 기술 > 비동기 통신을 위한 Lib. 이벤트 기반의 처리에 의존 |
|
기타 유용한 확장 모듈
1. forever 확장모듈 < 노드 실행 프로세스 유지 >
- 애플리케이션이 잘못된 요청이나 실행 도중 오류 때문에 중지되더라도 재시작을 통해 계속 실행할 수 있도록 유지해주는 유용한 모듈
설치 |
> sudo npm install forever -g cmd > npm install forever -g |
사용방법 > 지속적 서비스를 제공하고자하는 Application |
forever start [파일명].js forever 모듈을 통해 실행 중인 프로세스 목록 > forever list 특정 프로세스 중지 ( stop 인자 , 프로세스 목록을 통해 확인한 PID ) > forever stop [PID] |
개발자용 API |
var forever = require('forever'); 을 통해 확장모듈을 로드하여 사용가능 forever.start(_dirname+'/app.js'); 모듈로 실행하는 방법 애플리케이션 데몬으로 실행 (데몬으로 실행시 터미널 종료하더라도 계속 실행 가능) forever.startDaemon(_dirname+'/app.js', { 'env' : { 'NODE_ENV': 'production' }, 'spawnWith': { env: process.env } }); forever.stopAll(); forever로 실행된 App 모두 종료하기 * 리눅스 명령어 > nohup을 노드 애플리케이션을 백그라운드로 실행가능. hang-up signal 발생시에도 스크립트의 동작이 멈추지 않는다 $ nohup node ./server.js & |
2. commander 확장 모듈 < 노드 명령줄 도구 개발 >
- 노드를 이용하여 명령줄 도구(Command Line Interface) 형태의 애플리케이션을 편리하게 개발할 수 있도록 도와주는 확장 모듈. ( 명령줄 도구를 만들 수 있는)
설치 |
$ sudo npm install commander -g > npm install commander -g |
옵션 파싱 - 명령줄로 입력된 옵션을 자동으로 파싱하는 기능. option() 메서드를 통해 정의되고, 정의한 옵션을 통해서 자동으로 도움말 메시지도 만들어진다. |
지식을 공유합시다 !
다른 방법, 비슷한 방법, 본문 내에 의문점/문제점 댓글로
달아주시고 함께 성장합시다 ^^
'SCRIPT > NODE JS' 카테고리의 다른 글
노드js _ excel4node (0) | 2017.03.31 |
---|---|
노드js __ npmbox 설치 및 사용법 (8) | 2017.03.28 |
노드JS_이클립스 연동하기 (0) | 2017.03.22 |
노드JS_ package.json 파일로 확장모듈 설치하기 ( Eclipse ) (0) | 2017.03.22 |
노드JS_ json이란 ? (0) | 2017.03.22 |