본문 바로가기
기타 도서 리뷰/노드제이에스 프로그래밍

노드제이에스 프로그래밍 - 변정훈, 에이콘

by java개발자 2015. 9. 7.

노드제이에스 프로그래밍 - 변정훈, 에이콘

 

2장 노드 프로그래밍 시작
    js 파일 하나가 모듈이다.
    기본적으로 모듈간 접근이 불가하다.
    예외적으로 모듈간 접근을 하기 위해 module.exports 에 객체를 공유시키고, require('sample.js')로 해당 모듈을 불러올 수 있다.
    module.exports = {}, exports = {} 같은 방식이다.
    callback 함수는 비동기다. 싱글스레드이므로 현재 스레드가 동작중이면, 아무리 callback이라 하더라도 대기해야 한다.
    웹브라우저별로 동작하는 방식이 다르지만, Transfer-Encoding을 chunked로 하면, res.write('text') 로 할때마다 res를 날린다. res.end('text') 가 마지막 res이다.

    (그런데 크롬에서는 일반방식으로 동작된다.)

    require()를 사용할 때 파일명이 ./ 나 ../로 시작하면 상대 경로로 자바스크립트 파일을 찾는다. 
    ./나 ../로 시작하지 않으면 기본 모듈이나 확장 모듈에서 찾는다.(임의 js는 찾지 못함)

 

3장 노드의 기본 모듈
    기본 모듈 : 노드에 포함된 모듈
    확장 모듈 : 추가로 설치해서 사용하는 모듈

 

4장 npm을 이용한 위존성 확장 모듈 관리
    노드 0.6.3 버전부터 npm이 노드에 포함되어서 따로 설치할 필요 없음.
    글로벌 설치 : npm  install nodemon@0.5.7 -g
        > 커맨드 라인에서 사용하는 경우

        > 설치 장소 : C:\Users\Administrator\AppData\Roaming\npm
    로컬 설치 : (프로젝트의 ROOT폴더) npm  install express
        > 소스에서 사용하는 확장모듈 require(...)

       > 설치 장소 : 프로젝트 내 node_modules 폴더 하위에...
    버전별 설치 : npm install express@2.5.2
    nodemon : 자바의 핫디플로이 효과를 가져온다.
        > 사용법 : nodemon app.js 로 실행.
    *간편한 방법 : 
        1.프로젝트의 ROOT폴더에 package.json을 만들어서 해당하는 모듈의 버전을 기록
        2.프로젝트의 ROOT폴더에서 npm install 을 실행하면, 자동으로 모든 모듈을 다운로드 해줌.
         {
             "name": "application-name"
            , "version": "0.0.1"
            , "private": true
            , "dependencies": {
               "express": "2.5.2"
              , "jade": "0.9.1"
              , "mysql":"0.9.5"
           }
      }

3.반대로, npm init 을 하면, 현재 설치된 확장모듈 리스트를 package.json 파일로 만들어줌.

 

    설치된 로컬 확장모듈 확인하기 : 프로젝트의 ROOT폴더에서 npm  list 명령어 실행
    

    설치된 글로벌 확장 모듈 확인하기 : 아무대서나... npm   list -g 실행

 

 

*테스트 버전 정보

node.js : 0.6.6

express : 2.5.2

jade : 0.9.1

mysql : 0.9.5

socket.io : 0.9.2

 

 

7장 리얼타임 웹사이트를 위한 Socket.IO

 

1회 전송
  socket.send - 전송코드명 : message
                 수신할 때 message 라는 코드명으로만 받아야 한다.
                 json 전송시 socket.json.send 이용
                 전송성공 여부를 직접 알 수 있음. 
  socket.emit - 전송코드명 : 정하기 나름 (다양하게...)
                 수신할 때 정했던 이름으로 받으면 된다.
                 json 전송시 그냥 보내면 됨.
                 전송성공 여부를 수신측에서 실행해줘야 알 수 있음.(수신측에서 파라메터를 던질 수 있음)
타이머를 이용해서 여러번 보낼 수 있음
              socket.volatile.emit
이웃에게 보낼 수 있음(서버쪽에서만 가능함)
              socket.broadcast.send
              socket.broadcast.emit
              socket.braodcast.volatile.send
              socket.broadcast.volatile.emit

 

네임스페이스

하나의 페이지에서 여러개의 네임스페이스를 만들어서 소켓통신을 작업별로 분류할 수 있다.

방 기능

socket.join('some room');    //방 들어가기

socket.leave('some room');        //방 나가기

 

네임스페이스 안에서, broadcast - send, emit을 할때 임의의 사용자를 선택할 수 있다.

//나 제외

socket.broadcast.to('룸 이름').emit

socket.broadcast.to('룸 이름').send

 

//네임스페이스와 별개로 모든 사용자에게 보내기(나 포함)

io.socket.send

io.socket.emit

 

//나포함

io.sockets.in("방이름').send

io.sockets.in("방이름').emit

 

 

8장 익스프레스와 Socket.IO를 이용한 SImple Chat 예제

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
    "express": "2.5.2"
  , "jade": "0.18"
  , "socket.io": "0.9.2"
  }
}


 

jade 버전이 낮으면, ????? 확실하지 않다. 소스에 오타가 많아서-__-;;

*.jade 파일내의

다음 문법에서 에러난다. room is not defined....

  ul
    each room in roomList
      li=room