1.스트림 : 데이터의 전송 흐름
콘솔 입력/출력
파일 읽기/쓰기
서버/클라이언트 - 데이터 전송
1)스트림 모듈
스트림을 다루기 위한 추상 인터페이스
다양한 스트림을 같은 인터페이스로 다룰 수 있다
2)스트림 종류
읽기 스트림 : Readable Stream
쓰기 스트림 : Writable Stream
읽기/쓰기 : Duplex
변환 : Transform
3)Readable Stream
읽기 스트림 : Readable
모드 : flowing, paused
flowing mode
데이터를 자동으로 읽는 모드
전달되는 데이터를 다루지 않으면 데이터 유실
paused mode
데이터가 도착하면 대기
read() 함수로 데이터 읽기
(1)Readable 메소드
읽기
readable.read([size])
readable.setEncoding(encoding)
중지/재개
readable.pause()
readable.resume()
파이프
readable.pipe(destination[, options])
readable.unpipe([destination]
(2)Readable 이벤트
readable : 읽기 가능한 상태
data : 읽을 수 있는 데이터 도착
end : 더 이상 읽을 데이터가 없는 상태
close : 스트림이 닫힌 상태
error : 에러
(3)flowing mode
data 이벤트 구현
pipe 연결
resume() 호출
4)스트림에서 읽기
(1)파일 스트림에서 읽기 : flowing mode
var is = fs.createReadStream(file);
is.on('readable', function() {
console.log('== READABLE EVENT');
});
is.on('data', function(chunk) {
console.log('== DATA EVENT');
console.log(chunk.toString());
});
// end 이벤트
is.on('end', function() {
console.log('== END EVENT');
});
(2)파일 스트림에서 읽기 : paused mode
var is = fs.createReadStream(file);
// 'data' 이벤트가 없으면 paused mode
is.on('readable', function() {
console.log('== READABLE EVENT');
// 10바이트씩 읽기
while( chunk = is.read(10) ) {
console.log('chunk : ', chunk.toString());
}
});
5)Writable Stream
-Writable Stream : 데이터 출력
ex)
http 클라이언트의 요청
http서버의 응답
파일 쓰기 스트림
tcp 소켓
(1)메소드
-데이터 쓰기, 인코딩
writable.setDefaultEncoding(encoding)
writable.write(chunk[, encoding][, callback])
-스트림 닫기
writable.end([chunk][, encoding][, callback])
-버퍼
writable.cork()
writable.uncork()
(2)이벤트
drain : 출력 스트림에 남은 데이터를 모두 보낸 이벤트
error : 에러
finish : 모든 데이터를 쓴 이벤트
pipe : 읽기 스트림과 연결(pipe)된 이벤트
unpipe : 연결(pipe) 해제 이벤트
6)출력 스트림에 쓰기
- 파일 기반의 출력 스트림에 쓰기
var os = fs.createWriteStream(‘output.txt’);
os.on('finish', function() {
console.log('== FINISH EVENT');
});
os.write('1234\n');
os.write('5678\n');
os.end(‘9\n'); // finish event
- 표준 입출력 스트림
process.stdin : 콘솔 입력
process.stdout : 콘솔 출력
- 스트림 연결과 해제 ( Readable )
readable.pipe(destination[, options])
readable.unpipe([destination])
- 연결 이벤트 ( Writable )
pipe
unpipe
- 스트림 연결
입력 스트림 : stdin
출력 스트림 : 파일
스트림 연결
var is = process.stdin;
var os = fs.createWriteStream(‘output.txt’);
os.on('pipe', function(src) {
console.log('pipe event');
});
// exit 입력이 오면 파이프 연결 해제
is.on('data', function(data) {
if ( data.trim() == 'exit' ) {
is.unpipe(os);
}
});
is.pipe(os);
2. URL 다루기
네트워킹
네트워킹의 시작
서버 주소
서버에서 요청 위치
서버에서 리소스의 위치
URL : Uniform Resource Locator
http://nodejs.org/api/
http://nodejs.org/api/http.html
http://nodejs.org/api/http.html#http_event_connect
URL 구성 요소
프로토콜(Protocol)
호스트(Host)
포트번호(Post)
경로(Path)
쿼리(Query)
프래그먼트(Fragment)
URL 모듈
var url = require(‘url');
URL 모듈
url.parse(urlStr[, parseQueryString][, slashesDenoteHost])
urlStr : URL 문자열
parseQueryString : 쿼리 문자열 파싱, 기본값 false
slashesDenoteHost : //로 시작하는 주소의 경우, 호스트 인식 여부.
기본값 false
URL 분석하기
URL 분석하기
var urlStr = 'http://idols.com/q?group=EXID&name=하니&since=';
var parsed = url.parse(urlStr);
결과
host: ‘idols.com’,
search: '?group=EXID&name=하니&since=',
query: group=EXID&name=하니&since=,
pathname: ‘/q',
path: '/q?group=EXID&name=하니&since=',
URL과 쿼리 문자열
쿼리 문자열(query string)
이름=값&이름=값 형태로 정보 전달
http://idols.com/q?group=EXID&name=하니&since=
URL 모듈로 쿼리 문자열 파싱
url.parse(‘http:/...’, true);
URL 분석하기
URL 분석하기
var urlStr = 'http://idols.com/q?group=EXID&name=하니&since=';
var parsed = url.parse(urlStr, true);
var query = parsed.query;
결과
query.group // EXID
query.name // 하니
query.since //
URL 만들기
URL 만들기
url.format(urlObj)
URL 변환
url.resolve(from, to)
URL 만들기
URL 만들기 : format
protocol : 프로토콜
host : 서버 호스트 주소
pathname : 경로
search : 쿼리 스트링
auth : 인증 정보
URL 만들기
var urlObj = {
protocol : 'http',
host : 'idols.com',
pathname : 'schedule/radio',
search : 'time=9pm&day=monday'
}
var urlStr = url.format(urlObj);
// http://idols.com/schedule/radio?time=9pm&day=monday
URL 인코딩
URL에 허용되는 문자
알파벳, 숫자, 하이픈, 언더스코어, 점, 틸드
URL 인코딩하기
https://www.google.com/search?q=아이폰
https://www.google.com/search?q=%EC%95%84%EC%9D%B4%ED
%8F%B0
써드 파티 모듈
urlencode
3. 쿼리 스트링
쿼리 문자열
쿼리 문자열은 URL외에도 사용
쿼리 문자열(query string)
name1=value1&name2=value2&name3=&name4=
HTTP 메시지 바디로 정보를 전달할 때도 사용
URL과 쿼리 문자열
querystring 모듈
var querystring = require(‘querystring’);
쿼리 문자열 분석하기
querystring.parse(str[, sep][, eq][, options])
sep, eq : 쿼리 구분자와 = 기호
querystring 모듈
var querystring = require(‘querystring');
var str = 'group=EXID&name=하니&since=';
var parsed = querystring.parse(str);
parsed.group // EXID
parsed.name // 하니
parsed.since // ‘’
parsed.last // undefined
쿼리 스트링 중 배열
쿼리 스트링의 배열
group=걸스데이&member=혜리&member=유라&member=민아
쿼리 문자열 만들기
querystring.stringify(obj[, sep][, eq][, options])
sep, eq : 쿼리 구분자와 = 기호
인코딩 자동
쿼리 문자열 만들기
var queryObj = {
name : 'IU',
best : '좋은날'
};
var queryStr = querystring.stringify(queryObj);
// name=IU&best=%EC%A2%8B%EC%9D%80%EB%82%A0
클러스터
클러스터(Cluster)
여러 시스템을 하나로 묶어서 사용하는 기술
개별 시스템 내에서 클러스터
멀티 프로세스
멀티 코어
클러스터(Cluster)
Node.js 애플리케이션 : 1개의 싱글 쓰레드
멀티 코어 시스템의 장점을 살리기 - 클러스터
Node.js 클러스터
클러스터 사용시 포트 공유 - 서버 작성 편리
클러스터(Cluster)
클러스터링 : 마스터와 워커 프로세스
마스터
메인 프로세스
워커 생성
워커
보조 프로세스
마스터가 생성
클러스터 모듈
클러스터 모듈
var cluster = require(‘cluster’);
클러스터 생성(마스터)
cluster.fork()
구분하기
cluster.isMaster
cluster.isWorker
클러스터 생성과 동작
클러스터링을 사용하는 대략적인 구조
마스터 - 워커 생성
if ( cluster.isMaster ) {
// 마스터 코드
cluster.fork();
}
else {
// 워커 코드
}
클러스터 이벤트
클러스터의 이벤트
fork : 워커 생성 이벤트
online : 워커 생성 후 동작하는 이벤트
listening : 워커에 작성한 서버의 listen 이벤트
disconnect : 워커 연결 종료
exit : 워커 프로세스 종료
워커의 이벤트
fomessage : 메세지 이벤트
disconnect : 워커 연결 종료
워커
워커 접근
// 워커 접근
cluster.worker
워커 식별자
// 워커 id
worker.id
워커 종료
워커 종료
worker.kill([signal=‘SIGTERM'])
클러스터 생성과 동작
클러스터를 사용하는 대략적인 구조
if (cluster.isMaster) {
cluster.fork();
cluster.on('online', function (worker) {
// 워커 생성 후 실행
console.log('Worker #' + worker.id + ' is Online’);
});
cluster.on('exit', function (worker, code, signal) {
// 워커 종료 이벤트
console.log('Worker #' + worker.id + ' exit');
});
}
else {
var worker = cluster.worker;
// 워커 종료
worker.kill();
}
서버 클러스터
서버에 클러스터 적용
if (cluster.isMaster) {
cluster.fork();
} else {
http.createServer(function(req, res) {
// 서버 코드
}).listen(8000);
}
클러스터링 기능 지원 프로세스 모듈
pm2
데이터 전달
마스터가 워커에게 데이터 전달
worker.send(data)
워커의 데이터 이벤트
worker.on(‘message’, function(data) {
});
워커가 마스터에게 데이터 전달
process.send(data)
마스터에서의 데이터 이벤트
var worker = cluster.fork();
worker.on(‘message’, function(data) {
});
데이터 전달
if (cluster.isMaster) {
var worker = cluster.fork();
worker.on('message', function(message) {
console.log('Master received : ', message);
});
cluster.on('online', function (worker) {
worker.send({message:'Hello Worker'});
});
} else {
var worker = cluster.worker;
worker.on('message', function(message) {
process.send({message:'Fine thank you!'});
});
}
마스터와 워커 분리
별도의 파일로 분리하기
cluster.setupMaster([settings])
exec : 워커 파일
args : 실행 파라미터
마스터 - fork
cluster.setupMaster({
exec:'worker.js'
});
cluster.fork();
'Web development > Backend & Server' 카테고리의 다른 글
[NODE.JS]Node 간단하게 살펴보기 1 (0) | 2018.02.22 |
---|---|
[NODE.JS]NODE.JS 5일차 (0) | 2018.01.08 |
[NODE.JS]NODE.JS 3일차 (0) | 2018.01.04 |
[NODE.JS]NODE.JS 2일차 (0) | 2018.01.02 |
[Node.js]Node.js 1일차 (0) | 2017.12.31 |