본문 바로가기

nodejs

[nodejs] [아웃사이더]님 책3장 노드의 기본모듈 정리

3장 노드의 기본모듈 (1,2장은 그냥 읽기만 했음 설치는 아래 링크 참조)

http://godpage.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%AC-1004%EC%97%90%EC%84%9C-nodejs%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0 

- 개인적으로 여러버전을 사용하려고 할때 환경변수의 패스를 수정하는게 아니라 심볼릭 링크를 만들어서 연결하는게 편한것 같음. 책에는 안나와 있지만..- 

process : 노드js의 프로세스에 관한 모듈 

nextTick : CPU연산이 많은 작업을 비동기로 실행할수 있도록 도와주는 메서드란다.
nextTick에 등록된 함수는 바로 실행하지 않고 이벤트 큐에 등록한다.
싱글스레드가 현재 작업을 완료하고 나서 다음 이벤트 처리때 처리함

process.nextTic(function() {
    console.log("nextTick으로 호출됐심다");
});

이벤트 (nodejs는 이벤트 루프 기반 - 비동기 콜백방식 이라고 하는게 더 알아먹기 쉬울라나?)

- 그러고 보니 책에는 Object를 전부 객체라고 이야기를 해놨네..흠.. 맞는듯 틀린듯 -  

발생하는 이벤트는 모두 events.EventEmitter(이벤트 발생기 - 이벤트 던지는 넘? )의 객체임
require('events').EventEmitter로 접근
listener 리스너 - 이벤트 발생시 실행되는 함수

관련 함수 
emitter.on(event, listener) or emitter.addListener(event, listener)
emitter.once(event, listener) - 한번만 실행해야하는 리스너
emitter.removeListener(event, listener)
emitter.removeAllListeners([event]) - event지정안하면 다 삭제
emitter.emit(event, [arg1], [arg2], ...) - 이벤트 발생시키기 > 글치...이름대로구만

스트림 - 모든 스트림을 다루는 객체의 추상 인터페이스(추상?!)
 - 읽기 쓰기 둘다가능 (그래서 아래 2개의 모듈이 존재)

Readable Stream
    data - 데이터가 들어올때 읽음
    stream.pipe(destination, [options]) - 스트림에서 읽어들인 내용을 destination으로 지정된 쓰기 스트림에 연결

Writable Stream
    
파일시스템 - 음 이거는 잘 봐둬야 될듯 (근데 귀찮...;)

fs.rename(original, newfile, [callback]) - 당연히 파일명 변경
fs.stat(path, [callback]) - 파일에 관한 여러가지 정보
fs.writeFile(파일명, 데이타, 인코딩, [콜백])
   - 음..머 파일 쓰기. 없으면 만들고 있으면 덮어쓴다. 데이타에 있는 문자열을 파일로 작성함 
fs.watchFile(파일명, [옵션들], 리스너) - 파일의 변경사항 감시.. 호 이런거 첨봄. 
fs.createReadStream(패스, [옵션들]) - 위에나온 Readable Stream을 리턴해준다.
fs.createWriteStream (패스, [옵션들]) - 글치.. 당연히 이것도 있어야지. 당연히 Writable Stream을 리턴합니당.

경로(PATH 말하는거임 - 敬老 가 아님다)

path.normalize(path) - /usr/local/node 이런거 잘 틀리기 쉬우니 알아서 고쳐준다.
     (슬래시두개 라든가, 윈도우에서는 \를 쓴다든가하는 - 그럼 util에다 넣지..싶었으나 저거하나땜에 util쓰면 귀찮긋징..ㅎ)
path.join([path1], [path2], [...]) - 그냥 패스를 이어 붙여줌
path.resolve([from ..], to) - 전달 받은 경로의 절대경로를 반환
path.dirname(path) - 유닉스에 dirname이라는게 있다. 머냐면 디렉토리명만 짤라서 보내주는거임.
                              궁금하면 dirname을 구글에서 찾으세여.
path.basename(path, [ext]) - 이거는 디렉토리는 짤라내고 파일명만 반환. ext에 있는 문자열도 짤라냄.
path.extname(path) - 요거는 확장자만 돌려줌
path.exists(p, [callback]) - 파일이 있는지 확인하는 함수

네트워크 - 비동기 네트워크를 다루는 클래스다.

- 흐미 내가 못하는 거다. - 

net.createServer([options], [connectionListener]) - TCP서버를 생성한다. connectionListener에 지정한 콜백함수는
        connection(서버에 요청이 들어올때 마다 생성됨)이벤트에 자동으로 연결된다. 
        allowHalfOpen : 한쪽에서 연결을 종료하면 반대쪽도 종료할것인지 정하는거 디폴트는 false
        이거는 예제를 한번 해봐야 될것 같은데 
        http://nodejs.org/api/net.html#net_net_createserver_options_connectionlistener 여기있는걸 함 해보자. 
        포트로 붙는거말고 소켓으로 붙는게 있는데, 이거 재밌음....(처음 알아서..?! 역시 모르니 글이 길어 지는구나..)
        암튼 아래에 적을 server객체를 만들기위해 쓰는넘

net.Server
server.listen(port, [host], [listeningListener]) - 지정한 port, host로 들어온 컨넥션을 받을 수 있게 함.
        서버가 바운드 (올라간다라고 표현들 한다.)될 때 listening이벤트가 발생하는데,
        listeningListener를 콜백으로 등록해놨으면 그게 listening 이벤트 리스너에 추가된다.
        (머... 그냥 실행된다라고 하지.. - 근데 정확하게는 적어놓은게 맞다. 공돌이식 으로 생각하자. )
server.address() - 서버호스트와 포트정보 
server.pause(밀리세컨드) - 말그대로다 밀리초만큼 서버.멈춤이다. DoS공격 같은거에 좋단다. 

- 책에는 net.Server가 가지고 있는 이벤트에 대해서도 나와있는데 그냥 넘어간다. 궁금하면 책을사자. - 

net.Socket - TCP나 UNIX의 소켓을 추상화한 오브젝트이다. - 그래야 자바스크립트에서 쓰지 ㅎ- 

- 찾아보니 소켓은 아이피랑 포트를 합친걸 소켓이라하네. 그러나 여기서는 자바스크립트 객체겠지여.-

서버에서 connection이벤트가 발생하면 콜백 함수(예제에서는 createServer에 connectionListener를 지정한 곳으로 소켓이 전달 됨.  c 라고 변수명을 적은곳 )로 소켓이 전달된다. 

socket.write(data, [encoding], [callback]) - 소켓에 데이터 전달.
socket.end(data, [encoding]) - 소켓 종료. FIN을 보내서 소켓을 닫으므로 서버쪽에서는 데이터 보낼 수 있다. 
socket.pause() - 소켓에서 데이터를 읽는 것을 멈추어 data이벤트가 발생하지 않게한다. 
socket.resume() - 다시 데이터받기.
socket.remoteAddress - 접속한 클라이언트의 원격 IP를 리턴함.
socket.bufferSize - 소켓에 쓰기위해 현재 버퍼에 있는 캐릭터 문자의 크기를 알수 있음. 인코딩되기 전의 크기이니 주의!

HTTP와 HTTPS  

HTTP - http의 서버, 클라이언트가 사용해야 하는 모듈 
HTTPS - http위에 TLS/SSL 을 얹어서 보안을 강화한거 http랑 거의 비슷. (그래서 패쓰 ㅎㅎㅎ)

아래의 3가지 이벤트가 사용가능하다. 
request - 요청이 들어올 때 발생
connection - TCP 스트림이 생성되면 발생
close - 서버가 닫힐 때 발생

http.createServer([requestListener]) - http 서버 생성.
        requestListener는 function(request, response) { blar..blar..} 요런 형식으로 되어있어야됨.
        server.listen(port, [host], [listeningListener]) 를 실행하면 서버가 바운드됨.
        이거도 예제를 해봐야 되는데...없어서 그냥 간단히 만들었음.
        아래 예제대로 만들면 nodejs로 웹서버를 띄울수 있음. 
        그리고 웹브라우저에서 localhost:8124로 들어가보면 'you connected local webserver'라고 뜰꺼임

http.ServerReqeust - EventEmitter의 객체 
        아래 2가지 이벤트가 사용가능하다.
        data  - 콜백함수 function(chunk) {}
        end - 요청이 종료될 때 발생하는 이벤트
        request.mothod - HTTP 메서드를 리턴 
        request.header - 헤더정보
        request.httpVersion - HTTP 버전
        request.setEncoding(encoding=utf8) - 인코딩설정
        request.pause() 
        request.resume()

http.ServerResponse - Writable Stream 객체이다. 
        response.writeHead(statusCode, [reasonPhrase], [headers]) - 응답 헤더 지정
        response.write(chunk, encoding='utf8') - 응답 바디에 청크를 보냄
        response.end([data], [encoding]) - 응답 종료        

var http = require('http');
var net = require('net');

// Craete a HTTP server
var server = http.createServer(function (req, res){
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('you connected local webserver');
});

// Running Server
server.listen(8124, function(){
console.log("server running!");
});

URL과 쿼리 문자열 - 이건...머지?   URL에 대한 모듈 

url
url.parse(urlstr, parseQueryString=false, slashesDenoteHost=false)
        - URL문자열을 호스트명이나 쿼리 문자열, 경로등으로 파싱한 객체를 리턴 
        parseQueryString은 쿼리문자열을 추가로 파싱할건지 지정 디폴트 false
        slashesDenoteHost은 / 가 호스트를 나타내는지 지정
url.format(urlObj) - url객체를 URL문자열로 변경.

querystring - 이 녀석은 자주 쓸듯
querystring.stringify(obj, sep='&', eq='=') - JSON객체의 키와 값을 이용해 쿼리문자열로 만듦.
        sep는 구분자 &, eq는 키와 값을 연결하는 녀석인 = 
querystring.parse(str, sep='&', eq='=') - 쿼리문자열을 JSON객체로 변환

Child Process - 이거 너무 멋진 모듈임!

- 콘솔의 command의 자식 프로세스구만 이걸로 콘솔 명령어를 nodejs에서! - 
child.stdin, child.stdout, child.stderr의 세가지 스트림을 사용 - 오 직이네 -  

require('child_process').spawn(command, args=[], [options]) - command를 사용하는 자식프로세스 생성
child_process.exec(command, [options], function(error, stdout, stderr) {} ) - command를 사용하고 결과를 리턴 

클러스터 - CPU계산량이 많은 경우 클러스터링으로 해결하는데, 그거 할려면 요걸쓰세염.

- 다중 프로세스의 로드밸런싱을 통합해 클러스터 모듈로 제공한다고 함.

cluster.isMaster - 마스터 프로세스인지
cluster.isWorker - 워커 프로세스인지 

아래에 있는 예제를 참고 하는게 도움이 될듯함다.
http://nodejs.org/api/cluster.html 


아...이것 말고도 많은데 일단 책에 있는거 요약해서 올립니다. 
지금 nodejs 공부중이니 혹시 질문을 올려주시면, 열~~~~~~~심히 찾아서 알려드리겠슴다.