기본 콘텐츠로 건너뛰기

라벨이 DDP인 게시물 표시

Meteor DDP 완전분석 - All about DDP

한번은 정리해야지 하는 생각으로 Websocket 모니터를 열고 DDP를 하나하나 각개 격파해보려고 한다. 클라이언트에서 요청별로 서버 응답 내용을 정리해보았다. 로그인 없을 때 접속 14:07:20.485   {'msg':'connect','version':'1','support':['1','pre2','pre1']} 14:07:20.486 a {'server_id':'0'} 14:07:20.634 a {'msg':'connected','session':'wqr3vuoJSYXvHLKyR'} 정해진 JSON을 단순하게 전송하고 { msg: connected } 를 받는다. 단순! meteor_autoupdate_clientVersions 요청 14:07:20.486   {'msg':'sub','id':' nhyS7NmraDAk8Y5Nc ','name':'meteor_autoupdate_clientVersions','params':[]} 14:07:20.636 a {'msg':'added','collection':'meteor_autoupdate_clientVersions','id':'HgGFXuNFEw4TeHb7S','fields':{'current':true}} 14:07:20.639 a {'msg':'added','collection':'meteor_autoupdate_clientVersions','id':'version','fields...

Meteor DDP subscribe 처리 시 주의할 점

Meteor에서 logout 시 독특한 패턴으로 websocket이 날아오기 때문에 주의해야한다. 먼저 logout을 보내면 ["{\"msg\":\"method\",\"method\":\"logout\",\"params\":[],\"id\":\"3\"}"] 가입 되있던 모든 publish에 영향 받는 collection이 removed 된다. a["{\"msg\":\"removed\",\"collection\":\"users\",\"id\":\"ySWmTt329QeLQZTEc\"}"] 80 23:56:26.494 ......... a["{\"msg\":\"ready\",\"subs\":[\"CPSzK3DsirQq4fSmo\",\"87ojrAZZKFwu9LTeH\",\"5ynAG9oTZg7i3DMCs\",\"KZBaQRzyPiF33BoLz\",\"w3JwjFeWaFmxXiiaL\",\"ZM9oXYRjZ7cfSxvMY\",\"Q7XAmPJC35NjLdBYL\"]}"] 189 23:56:26.529 정체불명의 subs 가 array로 뭉텅 날아오고 a["{\"msg\":\"updated\",\"methods\":[\"3\"]}"] 46 23:56:26.530 logout method 에 대한 updated 와 a["{\"msg\":\"res...

Meteor DDP 요점 정리

준비 ddp 라이브러리 추가 $ meteor add ddp 외부 DDP 연결 extDDP = DDP.connect("http://externalhost.com:4100"); Collection 연결 Posts = new Mongo.Collection('posts', extDDP); 2,3 과정은 client 에서 가장 먼저 실행되도록 client/lib 디렉토리 안에 넣는 것을 추천 기존 연결을 외부 DDP로 대치 Meteor.connection = extDDP; ex) 활용예 Meteor.connection = extDDP; Meteor.loginWithPassword(login.valiu, password.value); Meteor.startup 같은 곳에서 사용하면 좋음. 만일 login을 그냥 사용하려면 expDDP.call('login', .... ); 형태로 사용하여야함. Subscribe 사용 onCreated 시점에 this.subscribe 대신 DDP 객체의 subscribe를 사용 Template.postView.onCreated(function() {   extDDP.subscribe("getPosts", { searchWord: 'blahblah' }); }); Helper 사용 3번처럼 했다면 그냥 똑같이 사용 Tempalte.postView.helpers({   "posts": function() {     return Posts.find({});   } }); Method 사용 Template.postInput.events({   "submit": function(e) {     expDDP.call('addPost', inputText.value', function(error, result) {      /* do something */     });     e.preventDefa...

microservice 기반 meteor application 설계 /w DDP

특정 업무가 장애가 일어나도 전체가 다운되지 않는 서비스를 Meteor 로 만들 수 있지 않을까 라는 생각을 하고 있었는데 실제로 한번 해보았다. 로긴 서버와 N개의 업무서버가 하나의 DB를 바라보고 클라이언트에서 로긴 서버에 계정생성/접속 후 토큰을 꺼내와서 나머지 서버에 접속하는 그림을 그려보았다. 업무 서버의 경우 웹앱에서 접근 문제가 있기 때문에 CORS를 열어준다. Meteor.startup ->   WebApp.rawConnectHandlers.use (req, res, next)->     res.setHeader "Access-Control-Allow-Origin", "*"     next() iOS/Android 앱의 경우는 사실 상관이 없지만 webApp인 경우엔 꼭 필요. 반대로 webApp 인 경우는 client 폴더에만 작업하면 되는데 가장 먼저 실행하는 파일(ex. client/lib) 에 DDP와 Collection 연결하는 부분을 만들어 준다. # global namespace @ddps =   loginDDP : DDP.connect "http://localhost:4100"   chatDDP : DDP.connect "http://localhost:4200" # models @Chats = new Mongo.Collection 'chats', ddps.chatDDP 그리고 Meteor App 이 시작하는 시점에 아래와 같이 구성한다. Meteor.startup ->   Meteor.connetion = ddps.loginDDP   Tracker.autorun ->     if Meteor.user()?       unless Meteor.loggingIn()         con...

Android 에서 DDP 라이브러리를 사용하자.

Meteor는 자체적으로 Cordova 를 통한 iOS/Android 앱을 지원한다. 하지만, Hybrid 앱은 역시 Native에 비해 예측 못할 변수가 많고 성능도 그다지 좋지 않다. DDP를 사용하여 Native Android 앱과 Meteor 서버를 연결해보자. 새 프로젝트를 만들고 File/Project Structure (cmd+;) 으로 들어가서 하단 +를 누르면 Library Dependency File Dependency Module Dependency 세개 나온다. Choose Library Dependency 창에서 ddp 하고 엔터쳐보자. 지금 현재는 3개 정도 나오는데 com.keysolutions:android-ddp-client:1.0.2.0 이걸 써서 할거다. 선택하고 OK 해서 추가하자. activity_main.xml 에 버튼 하나 만들고  AndroidManifest.xml 에     <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 이 두 개의 permission 이 있는지 확인하자. 없으면 추가. <application>이랑 나란히 놓으면 된다. 준비 해야할 class 는 일단 두개인데 하나는 어플리케이션 전체에서 DDP 연결을 책임질 MyApplication (Application을 상속받은 클래스)와 DDP에서 subscription 처리를 해줄 LoginDDPState(DDPStateSingleton을 상속받은 클래스)이다. 물론 이름은 임의로 정했다. 먼저 MyApplication.java 를 보자 package com.appsoul...

Tracker+DDP+Mithril=Success!

Mithril 을 좀 보고 있다. 무엇보다 가볍고 (12kb) 성능이 어마어마( http://matt-esch.github.io/mercury-perf/ )하고 디자인 사상도 매우 깔끔해서 마음에 들었다. 그래서 혹시 Meteor랑 같이 쓸 방법은 없을까 해서 뒤적거려 보았더니 http://lhorie.github.io/mithril-blog/mithril-and-meteor.html 아주 좋은 글이 있더라. Mithril을 Meteor에서 사용하면서 Reactivity를 구현하기 위해 Deps(현재는 Tracker)객체를 controller에 붙이고 unload 될때 computation을 멈추는 것까지 아주 깔끔하게 구현해 놓았다. 만든이가  https://github.com/meteor/meteor/wiki/Tracker-Manual  의 내용을 잘 숙지하고 있는 것 같다. React에서 getMetadata + Mixins를 사용하는 방법보다 더 납득이 가는 방식이었다. 그렇다면, 꼭 Meteor를 전부쓰지 않더라도 Mithril에서 Tracker package만 사용하고 DDP를 엮는 것만으로도 굉장히 가볍고 강력한 클라이언트쪽 Reactive Programming 구현을 할 수 있겠다 싶었다 DDP서버로만 Meteor를 사용해도 되고 PythonDDP, GoDDP 같은 것들이 있으니까 node.js를 사용하지 않아도 별 상관이 없다. 강력하다! GDG모임에서 React+Meteor Lightning Talk 발표를 하면서 조금 React를 공부해서 그런지 생각이 정리가 잘 되어서 쉽게 검증해볼 수 있었는데. 먼저 필요한 라이브러리들을 모아보았다. 1. Meteor Tracker Package https://github.com/meteor/meteor/tree/devel/packages/tracker 2. Meteor Javascript DDP (/w promise)  https://...

REST없이 DDP로 외부 Meteor 서버 데이터 끌어오기

Meteor는 Web Application이지만 기존 HTTP 통신을 최초에 자원을 읽어올때 한번만 사용하고 그 이후로는 DDP(Distributed Data Protocol  https://www.meteor.com/ddp )를 이용하여 자료교환을 합니다. Meteor 작동방식( http://meteorhacks.com ) DDP를 Websocket을 위한 REST라고 이야기하기엔 결정적으로 다른 차이점 하나가 있다. HTTP의 경우는 요청(Request)을 하면 응답(Response)를 주는 방식으로 연결이 유지가 되지 않는 반면, DDP 는 기본적으로 Connection을 한번 맺으면 클라이언트와 계속 연결을 유지하면서 실시간 송수신을 주고 받는다. DDP는 WebSocket을 사용하고 SockJS를 사용하여 XMLHttpRequest 로 대체하기도 한다. 어떤 식으로 전송/수신을 하는지 Chrome의 Developer Tools를 통해 WebSockets 흐름을 한번 살펴보자. DDP Websocket 캡쳐화면 Meteor에서 클라이언트/서버간 통신하는 내용을 살펴보면 의외로 별게 없는데 Random.id()로 생성한 id값과 msg 종류. name 이름과 나머지 인자값들이 전부다. 클라이언트쪽에서 보면  1. 연결 요청(connect)한다. {   "msg":"connect",   "version":"pre2",   "support": ["pre2","pre1"] } 2. subscribe 한다. {   "msg":"sub",   "id":" j9jDEAyCxPnNELqGE ", /* 이 id로 ready를 받는다 */   "name":"...

Meteor 에서 외부 Application으로 DDP 인증 (2) : SRP 교환

DDP로 인증을 하려면 네트웍상에 평문으로 보내지 않기 위해 SRP(Secure Remote Password) 라는 프로토콜로 변환한다. https://github.com/meteor/meteor/tree/devel/packages/srp package.js 를 보면 biginteger 와 sha256 을 사용한다. 구현해야할 부분은  https://github.com/meteor/meteor/blob/devel/packages/accounts-password/password_client.js#L10 이 곳 참조. password 를 가지고 다음과 같이.     s = new srp.Client password     request = s.startExchange()     if typeof selector == 'string'       selector =         if ~selector.indexof("@")         then username: selector         else email: selector     request.user = selector beginPasswordExchange 를 시작하는 부분의 인자는 request 자체를 사용. request 내용은 A를 키로 하는 SRP 암호문과 user를 키로하는 사용자명이 되겠다. method 쏴준다. A에 srp로 암호화한 문자를 사용. { msg: 'method',   method: 'beginPasswordExchange',   params:    [ { A: '439284960ce6bc7c163262b5629a467cd06bb982432615ec526a1ed204d2f76a1a2...

Meteor 와 다른 언어/플랫폼과의 통신 수단인 DDP

Meteor 0.6.x 대부터 DDP 라는게 생겼는데 이걸로 Meteor application 과 다른 application 사이에 통신을 할 수 있는 인터페이스가 생겼다. Mobile 에서도 예외는 없는데 가령 websocket으로 직접 meteor 서버랑 붙어서 데이터를 교환하는게 가능. 이게 참 매우매우 강력하면서도 단순한 것이. collection에 subscribe 하는 것과 method 를 호출하는 것만으로 다른 언어에서도 meteor application처럼 쾌적하게 자료 교환을 할 수가 있다 :) DDP Spec. https://github.com/meteor/meteor/blob/master/packages/livedata/DDP.md 언어별 클라이언트 Node.js : https://github.com/alansikora/node-ddpclient Objective-C : https://github.com/alansikora/objective-c_ddp-client Ruby : https://github.com/tmeasday/ruby-ddp-client Java : https://github.com/kutrumbo/java-ddp-client Python : https://github.com/meteor/meteor/tree/master/examples/unfinished/python-ddp-client  (얘는 왜;;;) .NET : https://github.com/sonyarouje/DDPClient.NET