SlideShare a Scribd company logo
1 of 38
Download to read offline
3장  노드의  기본  모듈




                                     아꿈사
            http://cafe.naver.com/architect1  

                                     황윤희
                   yoonheecode@gmail.com
3.1  전역  객체
3.2  유틸리티
3.3  이벤트
3.4  버퍼
3.5  스트림
3.6  파일시스템
3.7  경로
3.8  네트워크
3.9  HTTP와  HTTPS
3.10  URL과  쿼리  문자열
3.11  자식  프로세스
3.12  클러스터
3.13  TCP를  이용한  채팅  예제
3.1  전역  객체
   소스 어느 곳에서나 접근할 수 있는 객체

   클라이언트 자바스크립트의 최상위 객체: window

   node.js의 최상위 객체: global

   node의 전역 변수: __filename, __dirname
   node의 전역 함수: require(), setTimeout()
   node의 전역 객체: console, exports, process, Buffer
3.1  전역  객체  :  전역  변수
   __filename : 현재 코드의 파일 경로
   __dirname : 현재 코드의 폴더 경로

   [사용 예]

         console.log(‘filename : ‘, __filename);
         console.log(‘dirname : ‘, __dirname);
3.1  전역  객체  :  전역  함수
   setTimeout(callback, delay)
     delay시간이 지난 다음 callback 실행
     (그러나 정확한 실행을 보장하는 것은 아니고... ‘가능한한’ 이라고...)


   require()
     사용할 모듈을 불러온다.
3.1  전역  객체  :  process  (1)
    프로세스 정보를 담고 있는 전역 객체로
    실행시간, 메모리 사용률, 워킹 디렉토리 등의 정보를 알 수 있다.
    표준 입력, 표준 출력과 관련된 함수 제공

    EventEmitter의 instance

    Event: exit - 프로세스가 종료되는 시점에 발생

    [사용 예]

          process.on('exit', function(){
              process.nextTick(function(){
                  console.log('이건 실행이 안될꺼야.');
              });
              console.log('Good Bye');
          });
3.1  전역  객체  :  process  (2)
    try-catch로 예외 처리 가능

    Event: uncaughtException - 예상치 못한 예외 처리

    [사용 예]

          process.on('uncaughtException', function(err){
              console.log('예외: '+err);
          });

          setTimeout(function(){
              console.log('이 코드는 실행됩니다.');
          }, 2000);

          // 존재하지 않는 함수 실행
          nonExistentFunction();
          console.log('이 코드는 실행되지 않습니다.');
3.1  전역  객체  :  process  (3)
    process.nextTick(callback)

    CPU 연산이 많이 필요한 작업을 비동기로 실행할 수 있게 함

    callback을 이벤트 큐에 등록
    싱글 스레드가 현재 작업 완료 후 다음 이벤트 처리시 실행

    setTimeout() 보다 효율적

   [사용 예]


          function onNextTick(){
             console.log('nextTick으로 호출되었다.');
          }
          process.nextTick(onNextTick);
          console.log('이 메세지가 먼저 출력된다.');
3.1  전역  객체  :  Buffer  (1)
    자바스크립트는 유니코드에 적합 but 바이너리 데이터는 잘 다루지 못함.
    TCP 스트림이나 파일 스트림을 사용하려면 Octet Stream을 다룰수 있어야.
    옥텟 : 8비트로 이루어진 단위

    Buffer 클래스 : 바이너리 데이터를 다루기 위한 것.
                옥텟 스트림을 다루는 함수를 제공.

    raw 데이터는 Buffer 클래스의 객체에 저장.
    Buffer는 정수의 배열. (각 정수는 V8 힙 메모리 밖 로우 메모리에 할당된 주소를 가리킴.)

    자바스크립트 문자열과 버퍼 사이에 변환을 하려면         인코딩을 지정해야.
    ascii        7비트 ASCII 데이터
    utf8         멀티바이트로 인코딩된 유니코드
    ucs2         2바이트 little endian으로 인코딩된 유니코드
    base64       Base64 문자열 인코딩
    hex          각 바이트를 2개의 16진수로 인코딩
3.1  전역  객체  :  Buffer  (2)
   버퍼 생성 : new Buffer, 생성시 반드시 인코딩 방법 지정.

   buffer.write(string, offset=0, length=buffer.length-offset, encoding=‘utf8’)
     버퍼의 오프셋 위치에 string 작성.

   buffer.toString(encoding, start=0, end=buffer.length)
     start부터 end까지의 버퍼를 문자열로 변환.

   buffer[index]
     index 위치의 옥텟을 가져오거나 설정. 범위 0~255

   buffer.isBuffer() : 객체가 버퍼 타입인지 검사.

   buffer.length : 버퍼 객체의 메모리의 크기. 버퍼에 저장된 내용의 길이와 다름.

   buffer.copy : 버퍼 복사

   buffer.slice() : 버퍼 잘라냄.
3.2  유틸리티  :  util

   유틸리티성 함수가 포함된 유틸리티 기본 모듈
   require(‘util’) 로 불러온다

   util.format() : 문자열을 포매팅한다.
     %s : string
     %d : number (integer, float)
     %j : JSON
     %% : % 출력
3.3  이벤트  :  Events  (1)
    노드는 이벤트 루프 기반. 많은 객체가 이벤트 발생시킴

    require(‘event’) 로 불러온다

    이벤트 발생 : emit
    실행되는 함수 : listener

    객체에 이벤트 추가
     emitter.addListener(eventName, listener)
     emitter.on(eventName, listener)


          server.on(‘connection’, function(stream) {
             console.log(‘서버에 연결됐습니다’);
          });
3.3  이벤트  :  Events  (2)
     한 번만 실행해야 하는 리스너
      emitter.once(eventName, listener)

     지정한 이벤트에서 전달한 리스너 제거
      emitter.removeListener(eventName, listener)

     연결된 모든 리스너 제거
      emitter.removeAllListener([eventName])

     등록된 리스터가 10개 이상이면 경고 메시지 출력

     리스너 개수 제한 늘리기
      emitter.setMaxListeners(n)

     등록된 리스너 배열
      emitter.listeners(event)

     강제로 이벤트를 발생시킴
      emitter.emit(eventName, [arg1], [arg2]...)
3.4  버퍼  :  Buffer


    3.1 전역객체에서 함께 다룸
3.5  스트림  :  stream  -  Readable  Stream  (1)
    스트림을 다루는 모드 객체의 추상 인터페이스.
    Readable Stream과 Writable Stream이 있다.

    Readable Stream
    Event: data
      새로운 데이터가 들어왔을 때 발생.
      기본적으로 Buffer 사용. setEncoding() 사용되면 문자열 사용.

    Event: end
      EOF나 FIN을 받았을 때 발생.

    Event: error
      데이터를 받는 동안 에러가 있을때 발생.

    Event: close
      사용하는 파일 디스크립터가 닫혔을 때 발생.
3.5  스트림  :  stream  -  Readable  Stream  (2)
    stream.readable
      스트림이 읽을 수 있는 상태인지.

    stream.setEncoding()
      data 이벤트가 Buffer 대신 문자열을 사용하게 한다.
      utf8, ascii, base64 사용 가능.

    stream.pause()
      들어오는 data 이벤트를 멈춘다.

    stream.resume()
      pause()로 멈춘 data 이벤트를 재개.

    stream.destroy()
      사용하는 파일 디스크립터를 닫는다.

    stream.destroySoon()
      큐에 있는 내용을 모두 소비한 다음에 파일 디스크립터를 닫는다.

    stream.pipe()
      읽어 들인 내용을 지정된 쓰기 스트림에 연결.
3.5  스트림  :  stream  -  Writable  Stream  (1)

    Writable Stream
    Event: drain
      write() 가 false를 돌려준 후 스트림이 다시 쓸 수 있는 상태가 되었음을 알림.

    Event: error
      스트림에 에러가 생기면 발생.

    Event: close
      사용하는 파일 디스크립터가 닫히면 발생.

    Event: pipe
      Readable Stream의 pipe() 로 스트림이 전달됐을 때 발생
3.5  스트림  :  stream  -  Writable  Stream  (2)

    stream.writable
      스트림이 쓰기 가능한 상태인지.

    stream.write(string, encoding=‘utf8’)
      string 문자열을 encoding 해 스트림에 쓴다.
      버퍼를 쓰려면 stream.write(buffer)

    stream.end()
      EOF나 FIN으로 스트림을 종료.
      종료전에 큐에 있는 데이터를 모두 내보냄.

    stream.destroy()
      사용중인 파일 디스크립터를 닫는다.

    stream.destroySoon()
      큐에 있는 데이터를 모두 소비한 후 파일 디스크립터를 닫는다.
3.6  파일시스템  :  fs
    require(‘fs’) 로 불러온다.

    대부분 함수는 동기 함수 제공. 접미사 Sync가 붙어있음.

    fs.rename() : 파일명을 바꾼다.
    fs.stat() : 파일의 정보를 확인한다.
    fs.writeFile() : 파일의 내용을 작성한다.
    fs.readFile() : 파일의 내용을 읽는다.
    fs.watchFile() : 파일의 변경사항을 감시한다.
    fs.unlink() : 파일을 삭제한다.
    fs.rmdir() : 디렉토리를 삭제한다.
    fs.realpath() : 파일의 절대경로를 가져온다.
    ......
3.7  경로  :  path
    경로에 관련된 모듈. require(‘path’) 로 불러온다.


    path.normalize() : 전달받은 문자열을 수정해서 올바른 경로로 수정.
    path.join() : 전달받은 경로를 이어 붙인다.
    path.resolve() : 전달받은 경로의 절대 경로를 돌려준다.
    path.relative(from,to) : from에서 to까지의 상대경로를 출력한다.
    path.dirname() : 전달받은 경로의 디렉토리 명을 돌려준다.
    path.basename() : 전달받은 경로의 마지막 부분을 돌려준다.
    path.extname() : 전달받은 파일병의 확장자를 돌려준다.
    path.exists() : 파일의 존재 여부를 확인한다.
3.8  네트워크  :  net
    비동기 네트워크를 다루는 클래스. require(‘net’)으로 불러온다.


     var net = require('net');

     function onListen(){
         console.log('서버가 %d포트로 연결됐습니다.', server.address().port);
     }
     function onConnectClose(){
         console.log('연결이 종료됐습니다.');
     }
     function onConnectResult(socket){
         console.log('서버에 연결되었습니다.');
         socket.on('end', onConnectClose);
         socket.write('Hellorn');
     }

     var server = net.createServer(onConnectResult);
     server.listen(8124, onListen);
3.8  네트워크  :  net.Server  (1)
    생성된 TCP 서버는 net.Server 클래스의 객체이며,
                       새로운 연결을 받기 위한 net.Socket의 객체

    server.listen()
      특정 호스트와 포트로부터 연결을 받기 시작.
      port로 전달한 포트에 서버가 바인딩되면 listening 이벤트 발생

    server.address()
      호스트와 포트에 대한 정보

    server.pause()
      파라미터의 밀리초만큼 서버가 새로운 요청을 받지 않는다.

    server.close()
      서버가 더 이상 새로운 요청을 받지 않는다.
      close 이벤트 발생

    server.maxConnections
      서버가 최대로 받아들일 수 있는 연결수 지정

    server.connections
      현재 서버의 동시 연결 수
3.8  네트워크  :  net.Server  (2)
    Event: listening
     server.listen()이 호출돼고 서버가 바운딩 되면 발생.

    Event: connection
     새로운 연결이 생기면 발생.
     콜백함수의 파라미터 socket은 연결된 소켓, net.Socket의 객체.

    Event: close
     서버가 닫혔을 때 발생.

    Event: error
     서버에 에러가 생겼을 때 발생.
     error 이벤트가 발생한 뒤에는 close 이벤트가 발생한다.
3.8  네트워크  :  net.Socket  (1)
    서버에서 connection 이벤트가 발생하면 콜백함수로 소켓 전달.
    socket.setEncoding()
      소켓으로 받는 데이터의 인코딩 지정 (ascii, utf-8, base64)

    socket.write()
      소켓에 데이터를 보낸다.

    socket.end()
      소켓을 종료한다.

    socket.pause()
      소켓에서 데이터 읽는 것을 멈춤. data 이벤트 발생을 막음.

    socket.resume()
      다시 데이터를 받을 때 실행.

    socket.remoteAddress
      접속한 클라이언트의 원격 IP를 돌려줌.

    socket.bufferSize
      현재 버퍼에 있는 캐릭터의 크기. 인코딩되기 전의 문자 크기.
3.8  네트워크  :  net.Socket  (2)
    Event: connect
      소켓 연결이 이뤄졌을 때 발생.

    Event: data
      소켓에서 데이터를 받았을 때 발생.

    Event: end
      소켓으로 FIN 패킷을 받았을 때 발생.

    Event: drain
      쓰기 버퍼가 비워졌을 때 발생.

    Event: error
      에러가 생겼을 때 발생.
      에러 발생 뒤 이어서 close 이벤트가 발생.

    Event: close
      소켓이 완전히 닫혔을 때 발생.
3.9  HTTP와  HTTPS  :  http.Server
   HTTP : require(‘http’)
   HTTPS : require(‘https’)
           TLS/SSL 모듈에 기반, HTTP 모듈과 사용법이 거의 동일

   http.createServer() : HTTP 서버 생성

   http.Server 의 이벤트
   Event: request
     요청이 들어올 때마다 발생.
     콜백함수의 파라미터 request는 http.ServerRequest의 객체.
     콜백함수의 파라미터 response는 http.ServerResponse의 객체.

   Event: connection
     새로운 TCP 스트림이 생성되면 발생하는 이벤트.
     콜백함수의 파라미터 socket은 net.Socket의 객체.

   Event: close
     서버가 닫힐 때 발생.
3.9  HTTP와  HTTPS  :  http.ServerRequest
   HTTP 요청의 객체.

   Event: data
    메시지 바디의 일부를 받으면 발생.


   Event: end
    요청이 종료될 때 요청당 딱 한번만 발생.
    end 이벤트 후에는 더 이상 data 이벤트가 발생하지 않는다.


   request.method : HTTP 메소드를 돌려줌. (GET/POST)
   request.url : 요청의 URL
   request.headers : 헤더 정보
   request.httpVersion : HTTP 요청의 버전
   request.setEncoding() : 요청바디의 인코딩 설정.
                          utf8이나 binary 사용. null 이면 Buffer객체 사용
   request.pause()/request.resume() : 요청에서 이벤트 발생을 멈추거나 재개.
3.9  HTTP와  HTTPS  :  http.ServerResponse

   HTTP 응답 객체. Writable Stream.

   response.writeHead() : 응답 헤더 지정.

   response.write() : 응답바디의 chunk 데이터를 보냄.

   response.end() : 응답 종료.
    data를 지정하면 write(data) 실행 후 end()를 실행.
3.10  URL과  쿼리  문자열  :  URL

    require(‘url’)로 불러온다.

    url.parse()
      받은 URL 문자열을 호스트명, 쿼리 문자열, 경로 등으로 파싱한 객체로 돌려준다.

    url.format()
      URL 객체를 다시 URL 문자열로 만든다.
3.10  URL과  쿼리  문자열  :  querystring

   URL에서 ? 뒤에 붙는 값. require(‘querystring’)으로 불러온다.

   querystring.stringify()
      JSON 객체의 키와 값을 이용해 쿼리 문자열로 만든다.

   querystring.parse()
     쿼리 문자열을 다시 JSON 객체로 변환한다.
3.11  자식  프로세스  :  child_process  (1)

    require(‘child_process’).spawn() 이나
    require(‘child_process’).fork() 로 자식 프로세스 생성.

    require(‘child_process’).spawn(command, args, option)
     command를 사용하는 자식 프로세스 생성.
     option {cwd:undefined, env:process.env, setsid:false}
             cwd - 생성된 프로세스가 실행되는 디렉토리 지정
             env - 새 프로세스가 접근할 수 있는 환경 변수 지정
             setsid - true이면 서브프로세스를 새로운 세션으로 생성


    생성된 자식 프로세스는 세 가지 스트림 사용.
    child.stdin, child.stdout, child.stderr
3.11  자식  프로세스  :  child_process  (2)

    child_process.exec(command, option, callback)
      command를 실행하고 결과를 돌려준다.


    child_process.execFile()
      파일을 실행


    child.Kill()
      자식 프로세스 종료
3.12  클러스터  :  cluster  (1)

    싱글 스레드여서 CPU 계산양이 많은 부분에서 취약한 부분을 해결.
    다중 프로세스의 로드밸런싱을 통합해 클러스터 모듈로 제공.

    require(‘cluster’) 로 불러온다.



    마스터 프로세스만 호출할 수 있고, CPU 개수만큼 워커 프로세스 생성
    cluster.fork()
3.12  클러스터  :  cluster  (2)
        var cluster = require('cluster');
        var http = require('http');
        var numCPUs = require('os').cpus().length;

        if (cluster.isMaster)
        {
            // CPU 개수만큼 워커 생성 ... 마스터 프로세스만 부를수 있다.
            for (var i=0; i<numCPUs; i++) {
                 cluster.fork();
            }
            // 프로세스가 종료할 때, death 이벤트 발생할때 프로세스 아이디 출력하도록 함.
             cluster.on('death', function(worker) {
                  console.log('worker '+worker.pid+' died');
             });
        } else {
            // 워커프로세스는 HTTP 서버를 생성한다.
            http.Server(function(req,res) {
                  res.writeHead(200);
                  res.end("hello worldn");
            }).listen(8000);
        }
3.12  클러스터  :  cluster  (3)
    워커 프로세스에서 마스터 프로세스로 메시지를 전달. 전체 요청수를 기록하는 예


          var cluster = require('cluster');
          var http = require('http');
          var numReqs = 0;

          if (cluster.isMaster) {
            // 마스터 프로세스는 워커 생성
            for (var i=0; i<2; i++) {
               var worker = cluster.fork();

               // message 이벤트 리스너에 notifyRequest 전달되면 요청수 증가
               worker.on('message', function(msg) {
                   if (msg.cmd && msg.cmd == 'notifyRequest') {
                       numReqs++;
                   }
               });
            }
            ......
3.12  클러스터  :  cluster  (4)

              ......
              // 1000ms 간격으로 요청수를 찍어준다.
              setInterval(function() {
                 console.log("numReqs =", numReqs);
              }, 1000);

          } else {
              // 워커 프로세스는 HTTP 서버를 생성한다.
              http.Server(function(req, res) {
                 res.writeHead(200);
                 res.end("hello world ..... messagen");
                 // 마스터 프로세스로 메시지를 보낸다.
                 process.send({ cmd: 'notyfyRequest'});
              }).listen(8000);
          }
3.13  TCP를  이용한  채팅  예제
끝.

More Related Content

What's hot

Zookeeper 활용 nifi clustering
Zookeeper 활용 nifi clusteringZookeeper 활용 nifi clustering
Zookeeper 활용 nifi clusteringNoahKIM36
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210Yong Joon Moon
 
(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafka(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafkaNoahKIM36
 
도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespaceSam Kim
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편Sam Kim
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은jieun kim
 
android_thread
android_threadandroid_thread
android_threadhandfoot
 
Python socket programming
Python socket programmingPython socket programming
Python socket programmingTae Young Lee
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractFermat Jade
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttpNAVER D2
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programmingihpark92
 
도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편Sam Kim
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀ssuser0c2478
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguideSukjin Yun
 
10 동기및비동기장치io
10 동기및비동기장치io10 동기및비동기장치io
10 동기및비동기장치iossuser3fb17c
 
Openstack Instance Resize
Openstack Instance ResizeOpenstack Instance Resize
Openstack Instance Resizeymtech
 

What's hot (20)

Zookeeper 활용 nifi clustering
Zookeeper 활용 nifi clusteringZookeeper 활용 nifi clustering
Zookeeper 활용 nifi clustering
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210
 
(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafka(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafka
 
도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
 
android_thread
android_threadandroid_thread
android_thread
 
Python socket programming
Python socket programmingPython socket programming
Python socket programming
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
 
04 프로세스
04 프로세스04 프로세스
04 프로세스
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart Contract
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programming
 
도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguide
 
10 동기및비동기장치io
10 동기및비동기장치io10 동기및비동기장치io
10 동기및비동기장치io
 
Openstack Instance Resize
Openstack Instance ResizeOpenstack Instance Resize
Openstack Instance Resize
 

Viewers also liked

xUnitTestPattern/chapter17
xUnitTestPattern/chapter17xUnitTestPattern/chapter17
xUnitTestPattern/chapter17Yoon Hee Hwang
 
그녀가언어를익히는방법
그녀가언어를익히는방법그녀가언어를익히는방법
그녀가언어를익히는방법Yoon Hee Hwang
 
[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장sung ki choi
 
Timing wheels
Timing wheelsTiming wheels
Timing wheelssupperniu
 
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.sung ki choi
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장sung ki choi
 
[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장sung ki choi
 
트위터 봇 개발 후기
트위터 봇 개발 후기트위터 봇 개발 후기
트위터 봇 개발 후기종빈 오
 
ApprenticeshipPatterns/Chapter3
ApprenticeshipPatterns/Chapter3ApprenticeshipPatterns/Chapter3
ApprenticeshipPatterns/Chapter3Yoon Hee Hwang
 

Viewers also liked (10)

xUnitTestPattern/chapter17
xUnitTestPattern/chapter17xUnitTestPattern/chapter17
xUnitTestPattern/chapter17
 
그녀가언어를익히는방법
그녀가언어를익히는방법그녀가언어를익히는방법
그녀가언어를익히는방법
 
[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장
 
Timing wheels
Timing wheelsTiming wheels
Timing wheels
 
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장
 
[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장
 
트위터 봇 개발 후기
트위터 봇 개발 후기트위터 봇 개발 후기
트위터 봇 개발 후기
 
ApprenticeshipPatterns/Chapter3
ApprenticeshipPatterns/Chapter3ApprenticeshipPatterns/Chapter3
ApprenticeshipPatterns/Chapter3
 

Similar to Nodejs_chapter3

리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Linux programming study
Linux programming studyLinux programming study
Linux programming studyYunseok Lee
 
Mastering ethereum(smart contract)
Mastering ethereum(smart contract)Mastering ethereum(smart contract)
Mastering ethereum(smart contract)제호 송
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리Seungyong Lee
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platformJay JH Park
 
TCP echo 서버 및 클라이언트 예제 스터디
TCP echo 서버 및 클라이언트 예제 스터디TCP echo 서버 및 클라이언트 예제 스터디
TCP echo 서버 및 클라이언트 예제 스터디quxn6
 
중급 소켓프로그래밍
중급 소켓프로그래밍중급 소켓프로그래밍
중급 소켓프로그래밍quxn6
 
10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스유석 남
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver진상 문
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreihpark92
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivityJinKyoungHeo
 
10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스웅식 전
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 

Similar to Nodejs_chapter3 (20)

리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
 
Linux programming study
Linux programming studyLinux programming study
Linux programming study
 
Mastering ethereum(smart contract)
Mastering ethereum(smart contract)Mastering ethereum(smart contract)
Mastering ethereum(smart contract)
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
Tcp summary
Tcp summaryTcp summary
Tcp summary
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platform
 
TCP echo 서버 및 클라이언트 예제 스터디
TCP echo 서버 및 클라이언트 예제 스터디TCP echo 서버 및 클라이언트 예제 스터디
TCP echo 서버 및 클라이언트 예제 스터디
 
중급 소켓프로그래밍
중급 소켓프로그래밍중급 소켓프로그래밍
중급 소켓프로그래밍
 
10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
ice_grad
ice_gradice_grad
ice_grad
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 

Nodejs_chapter3

  • 1. 3장  노드의  기본  모듈 아꿈사 http://cafe.naver.com/architect1   황윤희 yoonheecode@gmail.com
  • 2. 3.1  전역  객체 3.2  유틸리티 3.3  이벤트 3.4  버퍼 3.5  스트림 3.6  파일시스템 3.7  경로 3.8  네트워크 3.9  HTTP와  HTTPS 3.10  URL과  쿼리  문자열 3.11  자식  프로세스 3.12  클러스터 3.13  TCP를  이용한  채팅  예제
  • 3. 3.1  전역  객체 소스 어느 곳에서나 접근할 수 있는 객체 클라이언트 자바스크립트의 최상위 객체: window node.js의 최상위 객체: global node의 전역 변수: __filename, __dirname node의 전역 함수: require(), setTimeout() node의 전역 객체: console, exports, process, Buffer
  • 4. 3.1  전역  객체  :  전역  변수 __filename : 현재 코드의 파일 경로 __dirname : 현재 코드의 폴더 경로 [사용 예] console.log(‘filename : ‘, __filename); console.log(‘dirname : ‘, __dirname);
  • 5. 3.1  전역  객체  :  전역  함수 setTimeout(callback, delay) delay시간이 지난 다음 callback 실행 (그러나 정확한 실행을 보장하는 것은 아니고... ‘가능한한’ 이라고...) require() 사용할 모듈을 불러온다.
  • 6. 3.1  전역  객체  :  process  (1) 프로세스 정보를 담고 있는 전역 객체로 실행시간, 메모리 사용률, 워킹 디렉토리 등의 정보를 알 수 있다. 표준 입력, 표준 출력과 관련된 함수 제공 EventEmitter의 instance Event: exit - 프로세스가 종료되는 시점에 발생 [사용 예] process.on('exit', function(){ process.nextTick(function(){ console.log('이건 실행이 안될꺼야.'); }); console.log('Good Bye'); });
  • 7. 3.1  전역  객체  :  process  (2) try-catch로 예외 처리 가능 Event: uncaughtException - 예상치 못한 예외 처리 [사용 예] process.on('uncaughtException', function(err){ console.log('예외: '+err); }); setTimeout(function(){ console.log('이 코드는 실행됩니다.'); }, 2000); // 존재하지 않는 함수 실행 nonExistentFunction(); console.log('이 코드는 실행되지 않습니다.');
  • 8. 3.1  전역  객체  :  process  (3) process.nextTick(callback) CPU 연산이 많이 필요한 작업을 비동기로 실행할 수 있게 함 callback을 이벤트 큐에 등록 싱글 스레드가 현재 작업 완료 후 다음 이벤트 처리시 실행 setTimeout() 보다 효율적 [사용 예] function onNextTick(){ console.log('nextTick으로 호출되었다.'); } process.nextTick(onNextTick); console.log('이 메세지가 먼저 출력된다.');
  • 9. 3.1  전역  객체  :  Buffer  (1) 자바스크립트는 유니코드에 적합 but 바이너리 데이터는 잘 다루지 못함. TCP 스트림이나 파일 스트림을 사용하려면 Octet Stream을 다룰수 있어야. 옥텟 : 8비트로 이루어진 단위 Buffer 클래스 : 바이너리 데이터를 다루기 위한 것. 옥텟 스트림을 다루는 함수를 제공. raw 데이터는 Buffer 클래스의 객체에 저장. Buffer는 정수의 배열. (각 정수는 V8 힙 메모리 밖 로우 메모리에 할당된 주소를 가리킴.) 자바스크립트 문자열과 버퍼 사이에 변환을 하려면 인코딩을 지정해야. ascii 7비트 ASCII 데이터 utf8 멀티바이트로 인코딩된 유니코드 ucs2 2바이트 little endian으로 인코딩된 유니코드 base64 Base64 문자열 인코딩 hex 각 바이트를 2개의 16진수로 인코딩
  • 10. 3.1  전역  객체  :  Buffer  (2) 버퍼 생성 : new Buffer, 생성시 반드시 인코딩 방법 지정. buffer.write(string, offset=0, length=buffer.length-offset, encoding=‘utf8’) 버퍼의 오프셋 위치에 string 작성. buffer.toString(encoding, start=0, end=buffer.length) start부터 end까지의 버퍼를 문자열로 변환. buffer[index] index 위치의 옥텟을 가져오거나 설정. 범위 0~255 buffer.isBuffer() : 객체가 버퍼 타입인지 검사. buffer.length : 버퍼 객체의 메모리의 크기. 버퍼에 저장된 내용의 길이와 다름. buffer.copy : 버퍼 복사 buffer.slice() : 버퍼 잘라냄.
  • 11. 3.2  유틸리티  :  util 유틸리티성 함수가 포함된 유틸리티 기본 모듈 require(‘util’) 로 불러온다 util.format() : 문자열을 포매팅한다. %s : string %d : number (integer, float) %j : JSON %% : % 출력
  • 12. 3.3  이벤트  :  Events  (1) 노드는 이벤트 루프 기반. 많은 객체가 이벤트 발생시킴 require(‘event’) 로 불러온다 이벤트 발생 : emit 실행되는 함수 : listener 객체에 이벤트 추가 emitter.addListener(eventName, listener) emitter.on(eventName, listener) server.on(‘connection’, function(stream) { console.log(‘서버에 연결됐습니다’); });
  • 13. 3.3  이벤트  :  Events  (2) 한 번만 실행해야 하는 리스너 emitter.once(eventName, listener) 지정한 이벤트에서 전달한 리스너 제거 emitter.removeListener(eventName, listener) 연결된 모든 리스너 제거 emitter.removeAllListener([eventName]) 등록된 리스터가 10개 이상이면 경고 메시지 출력 리스너 개수 제한 늘리기 emitter.setMaxListeners(n) 등록된 리스너 배열 emitter.listeners(event) 강제로 이벤트를 발생시킴 emitter.emit(eventName, [arg1], [arg2]...)
  • 14. 3.4  버퍼  :  Buffer 3.1 전역객체에서 함께 다룸
  • 15. 3.5  스트림  :  stream  -  Readable  Stream  (1) 스트림을 다루는 모드 객체의 추상 인터페이스. Readable Stream과 Writable Stream이 있다. Readable Stream Event: data 새로운 데이터가 들어왔을 때 발생. 기본적으로 Buffer 사용. setEncoding() 사용되면 문자열 사용. Event: end EOF나 FIN을 받았을 때 발생. Event: error 데이터를 받는 동안 에러가 있을때 발생. Event: close 사용하는 파일 디스크립터가 닫혔을 때 발생.
  • 16. 3.5  스트림  :  stream  -  Readable  Stream  (2) stream.readable 스트림이 읽을 수 있는 상태인지. stream.setEncoding() data 이벤트가 Buffer 대신 문자열을 사용하게 한다. utf8, ascii, base64 사용 가능. stream.pause() 들어오는 data 이벤트를 멈춘다. stream.resume() pause()로 멈춘 data 이벤트를 재개. stream.destroy() 사용하는 파일 디스크립터를 닫는다. stream.destroySoon() 큐에 있는 내용을 모두 소비한 다음에 파일 디스크립터를 닫는다. stream.pipe() 읽어 들인 내용을 지정된 쓰기 스트림에 연결.
  • 17. 3.5  스트림  :  stream  -  Writable  Stream  (1) Writable Stream Event: drain write() 가 false를 돌려준 후 스트림이 다시 쓸 수 있는 상태가 되었음을 알림. Event: error 스트림에 에러가 생기면 발생. Event: close 사용하는 파일 디스크립터가 닫히면 발생. Event: pipe Readable Stream의 pipe() 로 스트림이 전달됐을 때 발생
  • 18. 3.5  스트림  :  stream  -  Writable  Stream  (2) stream.writable 스트림이 쓰기 가능한 상태인지. stream.write(string, encoding=‘utf8’) string 문자열을 encoding 해 스트림에 쓴다. 버퍼를 쓰려면 stream.write(buffer) stream.end() EOF나 FIN으로 스트림을 종료. 종료전에 큐에 있는 데이터를 모두 내보냄. stream.destroy() 사용중인 파일 디스크립터를 닫는다. stream.destroySoon() 큐에 있는 데이터를 모두 소비한 후 파일 디스크립터를 닫는다.
  • 19. 3.6  파일시스템  :  fs require(‘fs’) 로 불러온다. 대부분 함수는 동기 함수 제공. 접미사 Sync가 붙어있음. fs.rename() : 파일명을 바꾼다. fs.stat() : 파일의 정보를 확인한다. fs.writeFile() : 파일의 내용을 작성한다. fs.readFile() : 파일의 내용을 읽는다. fs.watchFile() : 파일의 변경사항을 감시한다. fs.unlink() : 파일을 삭제한다. fs.rmdir() : 디렉토리를 삭제한다. fs.realpath() : 파일의 절대경로를 가져온다. ......
  • 20. 3.7  경로  :  path 경로에 관련된 모듈. require(‘path’) 로 불러온다. path.normalize() : 전달받은 문자열을 수정해서 올바른 경로로 수정. path.join() : 전달받은 경로를 이어 붙인다. path.resolve() : 전달받은 경로의 절대 경로를 돌려준다. path.relative(from,to) : from에서 to까지의 상대경로를 출력한다. path.dirname() : 전달받은 경로의 디렉토리 명을 돌려준다. path.basename() : 전달받은 경로의 마지막 부분을 돌려준다. path.extname() : 전달받은 파일병의 확장자를 돌려준다. path.exists() : 파일의 존재 여부를 확인한다.
  • 21. 3.8  네트워크  :  net 비동기 네트워크를 다루는 클래스. require(‘net’)으로 불러온다. var net = require('net'); function onListen(){ console.log('서버가 %d포트로 연결됐습니다.', server.address().port); } function onConnectClose(){ console.log('연결이 종료됐습니다.'); } function onConnectResult(socket){ console.log('서버에 연결되었습니다.'); socket.on('end', onConnectClose); socket.write('Hellorn'); } var server = net.createServer(onConnectResult); server.listen(8124, onListen);
  • 22. 3.8  네트워크  :  net.Server  (1) 생성된 TCP 서버는 net.Server 클래스의 객체이며, 새로운 연결을 받기 위한 net.Socket의 객체 server.listen() 특정 호스트와 포트로부터 연결을 받기 시작. port로 전달한 포트에 서버가 바인딩되면 listening 이벤트 발생 server.address() 호스트와 포트에 대한 정보 server.pause() 파라미터의 밀리초만큼 서버가 새로운 요청을 받지 않는다. server.close() 서버가 더 이상 새로운 요청을 받지 않는다. close 이벤트 발생 server.maxConnections 서버가 최대로 받아들일 수 있는 연결수 지정 server.connections 현재 서버의 동시 연결 수
  • 23. 3.8  네트워크  :  net.Server  (2) Event: listening server.listen()이 호출돼고 서버가 바운딩 되면 발생. Event: connection 새로운 연결이 생기면 발생. 콜백함수의 파라미터 socket은 연결된 소켓, net.Socket의 객체. Event: close 서버가 닫혔을 때 발생. Event: error 서버에 에러가 생겼을 때 발생. error 이벤트가 발생한 뒤에는 close 이벤트가 발생한다.
  • 24. 3.8  네트워크  :  net.Socket  (1) 서버에서 connection 이벤트가 발생하면 콜백함수로 소켓 전달. socket.setEncoding() 소켓으로 받는 데이터의 인코딩 지정 (ascii, utf-8, base64) socket.write() 소켓에 데이터를 보낸다. socket.end() 소켓을 종료한다. socket.pause() 소켓에서 데이터 읽는 것을 멈춤. data 이벤트 발생을 막음. socket.resume() 다시 데이터를 받을 때 실행. socket.remoteAddress 접속한 클라이언트의 원격 IP를 돌려줌. socket.bufferSize 현재 버퍼에 있는 캐릭터의 크기. 인코딩되기 전의 문자 크기.
  • 25. 3.8  네트워크  :  net.Socket  (2) Event: connect 소켓 연결이 이뤄졌을 때 발생. Event: data 소켓에서 데이터를 받았을 때 발생. Event: end 소켓으로 FIN 패킷을 받았을 때 발생. Event: drain 쓰기 버퍼가 비워졌을 때 발생. Event: error 에러가 생겼을 때 발생. 에러 발생 뒤 이어서 close 이벤트가 발생. Event: close 소켓이 완전히 닫혔을 때 발생.
  • 26. 3.9  HTTP와  HTTPS  :  http.Server HTTP : require(‘http’) HTTPS : require(‘https’) TLS/SSL 모듈에 기반, HTTP 모듈과 사용법이 거의 동일 http.createServer() : HTTP 서버 생성 http.Server 의 이벤트 Event: request 요청이 들어올 때마다 발생. 콜백함수의 파라미터 request는 http.ServerRequest의 객체. 콜백함수의 파라미터 response는 http.ServerResponse의 객체. Event: connection 새로운 TCP 스트림이 생성되면 발생하는 이벤트. 콜백함수의 파라미터 socket은 net.Socket의 객체. Event: close 서버가 닫힐 때 발생.
  • 27. 3.9  HTTP와  HTTPS  :  http.ServerRequest HTTP 요청의 객체. Event: data 메시지 바디의 일부를 받으면 발생. Event: end 요청이 종료될 때 요청당 딱 한번만 발생. end 이벤트 후에는 더 이상 data 이벤트가 발생하지 않는다. request.method : HTTP 메소드를 돌려줌. (GET/POST) request.url : 요청의 URL request.headers : 헤더 정보 request.httpVersion : HTTP 요청의 버전 request.setEncoding() : 요청바디의 인코딩 설정. utf8이나 binary 사용. null 이면 Buffer객체 사용 request.pause()/request.resume() : 요청에서 이벤트 발생을 멈추거나 재개.
  • 28. 3.9  HTTP와  HTTPS  :  http.ServerResponse HTTP 응답 객체. Writable Stream. response.writeHead() : 응답 헤더 지정. response.write() : 응답바디의 chunk 데이터를 보냄. response.end() : 응답 종료. data를 지정하면 write(data) 실행 후 end()를 실행.
  • 29. 3.10  URL과  쿼리  문자열  :  URL require(‘url’)로 불러온다. url.parse() 받은 URL 문자열을 호스트명, 쿼리 문자열, 경로 등으로 파싱한 객체로 돌려준다. url.format() URL 객체를 다시 URL 문자열로 만든다.
  • 30. 3.10  URL과  쿼리  문자열  :  querystring URL에서 ? 뒤에 붙는 값. require(‘querystring’)으로 불러온다. querystring.stringify() JSON 객체의 키와 값을 이용해 쿼리 문자열로 만든다. querystring.parse() 쿼리 문자열을 다시 JSON 객체로 변환한다.
  • 31. 3.11  자식  프로세스  :  child_process  (1) require(‘child_process’).spawn() 이나 require(‘child_process’).fork() 로 자식 프로세스 생성. require(‘child_process’).spawn(command, args, option) command를 사용하는 자식 프로세스 생성. option {cwd:undefined, env:process.env, setsid:false} cwd - 생성된 프로세스가 실행되는 디렉토리 지정 env - 새 프로세스가 접근할 수 있는 환경 변수 지정 setsid - true이면 서브프로세스를 새로운 세션으로 생성 생성된 자식 프로세스는 세 가지 스트림 사용. child.stdin, child.stdout, child.stderr
  • 32. 3.11  자식  프로세스  :  child_process  (2) child_process.exec(command, option, callback) command를 실행하고 결과를 돌려준다. child_process.execFile() 파일을 실행 child.Kill() 자식 프로세스 종료
  • 33. 3.12  클러스터  :  cluster  (1) 싱글 스레드여서 CPU 계산양이 많은 부분에서 취약한 부분을 해결. 다중 프로세스의 로드밸런싱을 통합해 클러스터 모듈로 제공. require(‘cluster’) 로 불러온다. 마스터 프로세스만 호출할 수 있고, CPU 개수만큼 워커 프로세스 생성 cluster.fork()
  • 34. 3.12  클러스터  :  cluster  (2) var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // CPU 개수만큼 워커 생성 ... 마스터 프로세스만 부를수 있다. for (var i=0; i<numCPUs; i++) { cluster.fork(); } // 프로세스가 종료할 때, death 이벤트 발생할때 프로세스 아이디 출력하도록 함. cluster.on('death', function(worker) { console.log('worker '+worker.pid+' died'); }); } else { // 워커프로세스는 HTTP 서버를 생성한다. http.Server(function(req,res) { res.writeHead(200); res.end("hello worldn"); }).listen(8000); }
  • 35. 3.12  클러스터  :  cluster  (3) 워커 프로세스에서 마스터 프로세스로 메시지를 전달. 전체 요청수를 기록하는 예 var cluster = require('cluster'); var http = require('http'); var numReqs = 0; if (cluster.isMaster) { // 마스터 프로세스는 워커 생성 for (var i=0; i<2; i++) { var worker = cluster.fork(); // message 이벤트 리스너에 notifyRequest 전달되면 요청수 증가 worker.on('message', function(msg) { if (msg.cmd && msg.cmd == 'notifyRequest') { numReqs++; } }); } ......
  • 36. 3.12  클러스터  :  cluster  (4) ...... // 1000ms 간격으로 요청수를 찍어준다. setInterval(function() { console.log("numReqs =", numReqs); }, 1000); } else { // 워커 프로세스는 HTTP 서버를 생성한다. http.Server(function(req, res) { res.writeHead(200); res.end("hello world ..... messagen"); // 마스터 프로세스로 메시지를 보낸다. process.send({ cmd: 'notyfyRequest'}); }).listen(8000); }
  • 37. 3.13  TCP를  이용한  채팅  예제
  • 38. 끝.