Inspired World

Primus로 하는 실시간 웹앱 개발 본문

Node.js

Primus로 하는 실시간 웹앱 개발

InspiredJW 2014. 4. 25. 19:46

Primus 인가 ?

Socket.io 라는 유명한 Node.js 모듈을 들어보신 적이 있으실 겁니다.


Socket.io는 푸쉬 알림이나 실시간으로 업데이트가 필요한 콘텐츠를 가진 서비스들이 많이 사용하고 있습니다.


문제는 Socket.io가 심각한 버그 및 메모리 누수가 있고, 활발히 개발되지 않고 있다는 점입니다.




Socket.io에서 SockJSEngine.io와 같은 다른 라이브러리로 변경하고 싶을 때, 새로운 API를 공부해야하고 기존에 작성되었던 코드를 재작성해야하며, 또 기존 Socket.io 에서 자체 제공하던 기능들이 없을 경우에는 직접 구현을 해야합니다.


Primus라는 이 모듈이 구세주입니다. 이 모듈은 SockJS, Engine.io, BrowserChannel, Socket.io 모듈 위에서 wrapper로써 사용됩니다.


PrimusSocket.io 처럼 room, multiplex, emit, cluster 같은 기능을 자체적으로 지원하지는 않지만, Primus 플러그인으로써 지원하고 있습니다. 어떤 라이브러리를 사용하더라도 Primus와 Primus 플러그인을 사용하면 일관성있으면서도 손쉽게 라이브러리 변경이 가능합니다.


저는 Engine.ioSockJS를 Primus의 transformer로써 사용해봤습니다.


제 경험으로 이 조합들은 매우 안정적이었으며, 활발히 개발되는 모듈들이기 때문에 버그가 생기더라도 패치가 될 수 있을 여지가 많습니다.


설치

다른 transformer를 설치할 수도 있지만 제가 보여드릴 예제에선 SockJS. 를 사용하겠습니다.


Primus` 와 SockJS 를 Node.js 서버에 설치하기
npm install primus sockjs --save


Node.js 에서 설정해주기
var app = express();
var server = require('http').createServer(app);
var Primus = require('primus');

var primus = new Primus(server, { transformer: 'SockJS' });

server.listen(process.env.PORT || 80);


클라이언트 라이브러리 가져오기

위 파일의 맨 끝에 이 라인을 추가한 후 실행해주세요.

primus.save(__dirname +'/primus.js');

primus.js라는 파일이 프로젝트 디렉토리에 생겼을 겁니다.


그 파일을 웹서버에서 정적 파일용으로 사용하는 디렉토리에 넣어준 후, 브라우저에서 사용하세요.

<script src="/lib/primus.js"></script>


브라우저에서 서버로 접속하기
var primus = Primus.connect(url, { options });


사용 방법

Primus 를 사용할 때 한 가치 규칙만 생각하세요.

모든 보내는 데이터는 write이고, 모든 보낸 데이터는 data라는 이벤트를 통해서 받을 수 있다


사용자 A 가 다른 접속자 (여기선 사용자 B 밖에 없음)에게 “ping”이라고 메시지를 보내면, 사용자 B가 다른 접속자 (사용자 A)에게 “pong”이라고 메시지를 보내는 예제를 보여드리겠습니다.


Node.js 서버
primus.on('connection', function(spark) {
  console.log('client ' + spark.id + ' has connected to the server');

  spark.on('data', function(data) {
    spark.write(data);
  });
});


사용자 A
primus.write('ping');

primus.on('data', function(data) {
  console.log(data);
});


사용자 B
primus.on('data', function(data) {
  console.log('ping');
  primus.write('pong');
});


플러그인

저는 현재 제 프로젝트에서 primus-cluster, primus-rooms, primus-express-session 등의 플러그인을 사용하고 있습니다.


Community Plugins 에서 플러그인을 한번 둘러보시고 필요한 플러그인을 설치해서 사용하세요.


oOBc5EbnNAdxCfJoEGS1x24yQESpuCukvcK2KRb5XCY,


Comments