118
Operational Transformation in Node.js (기반 협업 소프트웨어는 Node.js) 홍영택 (사이냅소프트, 노사모) 121120화요일

Operational Transformation in node.js

Embed Size (px)

DESCRIPTION

play.node(http://nodeconf.kr/2012/)에서 이야기. 협업 기반 소프트웨어에 node.js가 잘 어울린다. \(^_^)/ 노사모~

Citation preview

Page 1: Operational Transformation in node.js

Operational Transformationin Node.js

(웹 기반 협업 소프트웨어는 Node.js)

홍영택 (사이냅소프트, 노사모)

12년 11월 20일 화요일

Page 2: Operational Transformation in node.js

Operational Transformationin Node.js

(웹 기반 협업 소프트웨어는 Node.js)

홍영택 (사이냅소프트, 노사모)

12년 11월 20일 화요일

Page 3: Operational Transformation in node.js

Operational Transformationin Node.js

(웹 기반 협업 소프트웨어는 Node.js)

홍영택 (사이냅소프트, 노사모)

12년 11월 20일 화요일

Page 4: Operational Transformation in node.js

About Me

Javascript

12년 11월 20일 화요일

Page 5: Operational Transformation in node.js

12년 11월 20일 화요일

Page 6: Operational Transformation in node.js

12년 11월 20일 화요일

Page 7: Operational Transformation in node.js

12년 11월 20일 화요일

Page 8: Operational Transformation in node.js

NAVER Office

12년 11월 20일 화요일

Page 9: Operational Transformation in node.js

지난 3년간의 삽질로~

12년 11월 20일 화요일

Page 10: Operational Transformation in node.js

NAVER Office

2012.9.25 오픈12년 11월 20일 화요일

Page 11: Operational Transformation in node.js

그게 무슨 웹오피스야!!!

12년 11월 20일 화요일

Page 12: Operational Transformation in node.js

12년 11월 20일 화요일

Page 13: Operational Transformation in node.js

12년 11월 20일 화요일

Page 14: Operational Transformation in node.js

나도 ‘Fan’이야

12년 11월 20일 화요일

Page 15: Operational Transformation in node.js

이게 웹 오피스야~!!!

12년 11월 20일 화요일

Page 16: Operational Transformation in node.js

그래����������� ������������������  동시편집����������� ������������������  만들자-!

12년 11월 20일 화요일

Page 17: Operational Transformation in node.js

편집기 만들기

12년 11월 20일 화요일

Page 18: Operational Transformation in node.js

입력

출력

12년 11월 20일 화요일

Page 19: Operational Transformation in node.js

이벤트 핸들러

12년 11월 20일 화요일

Page 20: Operational Transformation in node.js

이벤트 핸들러

12년 11월 20일 화요일

Page 21: Operational Transformation in node.js

도큐먼트 모델

이벤트 핸들러

12년 11월 20일 화요일

Page 22: Operational Transformation in node.js

도큐먼트 모델

렌더러

이벤트 핸들러

12년 11월 20일 화요일

Page 23: Operational Transformation in node.js

도큐먼트 모델

렌더러

이벤트 핸들러

코드가 많아

12년 11월 20일 화요일

Page 24: Operational Transformation in node.js

도큐먼트 모델

렌더러

‘가’이벤트 핸들러

12년 11월 20일 화요일

Page 25: Operational Transformation in node.js

도큐먼트 모델

렌더러

‘가’ doc.addText(‘가’)

이벤트 핸들러

12년 11월 20일 화요일

Page 26: Operational Transformation in node.js

도큐먼트 모델

렌더러

‘가’ doc.addText(‘가’)

renderer.paint(para)

이벤트 핸들러

12년 11월 20일 화요일

Page 27: Operational Transformation in node.js

도큐먼트 모델

렌더러

‘가’ doc.addText(‘가’)

renderer.paint(para)

<P>가</P>{HTML}

이벤트 핸들러

12년 11월 20일 화요일

Page 28: Operational Transformation in node.js

입력 처리기

도큐먼트 모델

렌더러

12년 11월 20일 화요일

Page 29: Operational Transformation in node.js

‘node cookbook’번역중...

학기말 과제 작성중...

난 그냥 들어와 봤어...

12년 11월 20일 화요일

Page 30: Operational Transformation in node.js

‘node cookbook’번역중...

나도 껴줘~!!!

12년 11월 20일 화요일

Page 31: Operational Transformation in node.js

12년 11월 20일 화요일

Page 32: Operational Transformation in node.js

‘가’

12년 11월 20일 화요일

Page 33: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

12년 11월 20일 화요일

Page 34: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

update(doc)

12년 11월 20일 화요일

Page 35: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

update(doc)

change(doc)

12년 11월 20일 화요일

Page 36: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

update(doc)

change(doc)

renderer.paint(doc)

renderer.paint(para)

12년 11월 20일 화요일

Page 37: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

<P>가</P>{HTML}

update(doc)

change(doc)

renderer.paint(doc)<P>가</P>{HTML}

renderer.paint(para)

12년 11월 20일 화요일

Page 38: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

<P>가</P>{HTML}

update(doc)

change(doc)

renderer.paint(doc)<P>가</P>{HTML}

renderer.paint(para)

동일한 결과~!!!

12년 11월 20일 화요일

Page 39: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

<P>가</P>{HTML}

update(doc)

change(doc)

renderer.paint(doc)<P>가</P>{HTML}

renderer.paint(para)

하지만 문서를 전송해서느리다~!!!

12년 11월 20일 화요일

Page 40: Operational Transformation in node.js

‘가’

‘나’

12년 11월 20일 화요일

Page 41: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

‘나’doc.addText(‘나’)

12년 11월 20일 화요일

Page 42: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

update(doc)

‘나’doc.addText(‘나’)

update(doc)

12년 11월 20일 화요일

Page 43: Operational Transformation in node.js

‘가’ doc.addText(‘가’)

update(doc)

‘나’doc.addText(‘나’)

update(doc)

Conflict!동시편집은 무리

12년 11월 20일 화요일

Page 44: Operational Transformation in node.js

•문서 전체 전송으로 Network 사용량이 많음

•따라서 느림

12년 11월 20일 화요일

Page 45: Operational Transformation in node.js

스타크래프트 마린부대는이동중 모든 좌표를 전송할까?

•문서 전체 전송으로 Network 사용량이 많음

•따라서 느림

12년 11월 20일 화요일

Page 46: Operational Transformation in node.js

•문서 전체 전송으로 Network 사용량이 많음

•따라서 느림

•Conflict 발생

12년 11월 20일 화요일

Page 47: Operational Transformation in node.js

OT(Operational����������� ������������������  Transformation)

12년 11월 20일 화요일

Page 48: Operational Transformation in node.js

OT����������� ������������������  (wikipedia)

• Operational transformation(OT) is a technology for supporting a range of collaboration functionalities in advanced collaborative software systems.

12년 11월 20일 화요일

Page 49: Operational Transformation in node.js

OT����������� ������������������  (wikipedia)

• Operational transformation(OT) is a technology for supporting a range of collaboration functionalities in advanced collaborative software systems.

12년 11월 20일 화요일

Page 50: Operational Transformation in node.js

replicated����������� ������������������  architecture����������� ������������������  for����������� ������������������  shared����������� ������������������  documents

12년 11월 20일 화요일

Page 51: Operational Transformation in node.js

replicated����������� ������������������  architecture����������� ������������������  for����������� ������������������  shared����������� ������������������  documents

Operation 실행

12년 11월 20일 화요일

Page 52: Operational Transformation in node.js

replicated����������� ������������������  architecture����������� ������������������  for����������� ������������������  shared����������� ������������������  documents

Operation 전송

12년 11월 20일 화요일

Page 53: Operational Transformation in node.js

replicated����������� ������������������  architecture����������� ������������������  for����������� ������������������  shared����������� ������������������  documents

Operation 변환

12년 11월 20일 화요일

Page 54: Operational Transformation in node.js

replicated����������� ������������������  architecture����������� ������������������  for����������� ������������������  shared����������� ������������������  documents

Operation 실행

12년 11월 20일 화요일

Page 55: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

12년 11월 20일 화요일

Page 56: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’)

“APPL”

12년 11월 20일 화요일

Page 57: Operational Transformation in node.js

O1 = INS(1, ‘P’)

12년 11월 20일 화요일

Page 58: Operational Transformation in node.js

O1 = INS(1, ‘P’)

INSERT : 삽입

12년 11월 20일 화요일

Page 59: Operational Transformation in node.js

O1 = INS(1, ‘P’)

글자의 삽입 위치

삽입 문자

12년 11월 20일 화요일

Page 60: Operational Transformation in node.js

“APL” ?

O1 = INS(1, ‘P’)

12년 11월 20일 화요일

Page 61: Operational Transformation in node.js

“APL” “APPL”

O1 = INS(1, ‘P’)

12년 11월 20일 화요일

Page 62: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’)

“APPL”

12년 11월 20일 화요일

Page 63: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

“APLE”“APPL”

12년 11월 20일 화요일

Page 64: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1 = INS(1, ‘P’)

“APPLE”

“APLE”“APPL”

12년 11월 20일 화요일

Page 65: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1 = INS(1, ‘P’)O2 = INS(3, ‘E’)

“APPLE”“APPEL”

“APLE”“APPL”

12년 11월 20일 화요일

Page 66: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1 = INS(1, ‘P’)O2 = INS(3, ‘E’)

“APPLE”“APPEL”

“APLE”“APPL”

APPEL ≠ APPLE

12년 11월 20일 화요일

Page 67: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

12년 11월 20일 화요일

Page 68: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’)

“APPL”

12년 11월 20일 화요일

Page 69: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

“APLE”“APPL”

12년 11월 20일 화요일

Page 70: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1’ = INS(1, ‘P’)

“APPLE”

“APLE”“APPL”

12년 11월 20일 화요일

Page 71: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1’ = INS(1, ‘P’)O2’ = INS(4, ‘E’)

“APPLE”“APPLE”

“APLE”“APPL”

12년 11월 20일 화요일

Page 72: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1’ = INS(1, ‘P’)O2’ = INS(4, ‘E’)

“APPLE”“APPLE”

“APLE”“APPL”

O2’ : index++

12년 11월 20일 화요일

Page 73: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1’ = INS(1, ‘P’)O2’ = INS(4, ‘E’)

“APPLE”“APPLE”

“APLE”“APPL”

APPLE = APPLE

12년 11월 20일 화요일

Page 74: Operational Transformation in node.js

OT Basics

Time

Client 1 Client 2“APL” “APL”

O1 = INS(1, ‘P’) O2 = INS(3, ‘E’)

O1’ = INS(1, ‘P’)O2’ = INS(4, ‘E’)

“APPLE”“APPLE”

“APLE”“APPL”

APPLE = APPLE

12년 11월 20일 화요일

Page 75: Operational Transformation in node.js

O1'⋅O2 = O2'⋅O1

where

(O1', O2') = transform(O1, O2)

OT Basics

12년 11월 20일 화요일

Page 76: Operational Transformation in node.js

•문서 전체 전송으로 Network 사용량이 많음

•느림

•Conflict 발생

12년 11월 20일 화요일

Page 77: Operational Transformation in node.js

12년 11월 20일 화요일

Page 78: Operational Transformation in node.js

12년 11월 20일 화요일

Page 79: Operational Transformation in node.js

12년 11월 20일 화요일

Page 80: Operational Transformation in node.js

12년 11월 20일 화요일

Page 81: Operational Transformation in node.js

12년 11월 20일 화요일

Page 82: Operational Transformation in node.js

OTServer

OTClient

12년 11월 20일 화요일

Page 83: Operational Transformation in node.js

OTServer

OTClient

Operation만 전송

12년 11월 20일 화요일

Page 84: Operational Transformation in node.js

문제����������� ������������������  없나요?

12년 11월 20일 화요일

Page 85: Operational Transformation in node.js

OTServer

OTClient

12년 11월 20일 화요일

Page 86: Operational Transformation in node.js

OTServer

OTClient

12년 11월 20일 화요일

Page 87: Operational Transformation in node.js

var document = { insertText : function(){ ... }, deleteText : function(){ ... }, updateStyle : function(){ ... }, ...};

class Document { public Document(){ ... } public void insertText(){ ... } public void deleteText(){ ... } public void updateStyle(){ ... } ...};

비슷하게 생겼는데쉽게 포팅 가능?

12년 11월 20일 화요일

Page 88: Operational Transformation in node.js

Javascript는 Java와 완전히 달라

- 더글라스 크락포드(JSON inventor)

12년 11월 20일 화요일

Page 89: Operational Transformation in node.js

자바스크립트

“C 언어의 옷을 입은 LISP”

- 더글라스 크락포드

함수 = 일급 객체

클로져

12년 11월 20일 화요일

Page 90: Operational Transformation in node.js

도큐먼트 모델

렌더러

이벤트 핸들러

코드가 많아

12년 11월 20일 화요일

Page 91: Operational Transformation in node.js

문제의 본질은 중복

12년 11월 20일 화요일

Page 92: Operational Transformation in node.js

•문서 전체 전송으로 Network 사용량이 많음

•느림

•Conflict 발생

•Document Model 중복코드

12년 11월 20일 화요일

Page 93: Operational Transformation in node.js

한편...

12년 11월 20일 화요일

Page 94: Operational Transformation in node.js

이벤트 기반의 논 블러킹 I/O작은 서버

- 라이언 달(Node.js 창시자)

12년 11월 20일 화요일

Page 95: Operational Transformation in node.js

C? 루아? 하스켈?

12년 11월 20일 화요일

Page 96: Operational Transformation in node.js

Javascript !!!

12년 11월 20일 화요일

Page 97: Operational Transformation in node.js

12년 11월 20일 화요일

Page 98: Operational Transformation in node.js

Javascript가서버에서

돌아간다 ㅠㅠ

12년 11월 20일 화요일

Page 99: Operational Transformation in node.js

var document = { insertText : function(){ ... }, deleteText : function(){ ... }, updateStyle : function(){ ... },...};

class Document { public Document(){ ... } public void insertText(){ ... } public void deleteText(){ ... } public void updateStyle(){ ... }...};

12년 11월 20일 화요일

Page 100: Operational Transformation in node.js

OTServer

OTClient

같은 코드

12년 11월 20일 화요일

Page 101: Operational Transformation in node.js

•문서 전체 전송으로 Network 사용량이 많음

•느림

•Conflict 발생

•Document Model 중복코드

12년 11월 20일 화요일

Page 102: Operational Transformation in node.js

One����������� ������������������  more����������� ������������������  thing...

R.I.P.����������� ������������������  Jobs

12년 11월 20일 화요일

Page 103: Operational Transformation in node.js

JSON POJO

OR-MAPPINGJSON to POJOPOJO to JSON

Server RDBBrowser

Table

12년 11월 20일 화요일

Page 104: Operational Transformation in node.js

우린 왜? 이유없이 데이터 형변환을 하고 있을까?

문서에 무결성이 왠말이냐ㅠㅠ

12년 11월 20일 화요일

Page 105: Operational Transformation in node.js

•문서 전체 전송으로 Network 사용량이 많음

•느림

•Conflict 발생

• Javascript, Java 중복코드

•불필요한 데이터 형변환

12년 11월 20일 화요일

Page 106: Operational Transformation in node.js

OR-MAPPINGJSON to POJOPOJO to JSON

Server NoSQL

JSON JSON

Browser

Document

12년 11월 20일 화요일

Page 107: Operational Transformation in node.js

cradlenano mongoskin

Interfacing with Databases

가벼운 API

강력함 API

깨끗한 API

12년 11월 20일 화요일

Page 108: Operational Transformation in node.js

•문서 전체 전송으로 Network 사용량이 많음

•느림

•Conflict 발생

• Javascript, Java 중복코드

•불필요한 데이터 형변환

12년 11월 20일 화요일

Page 109: Operational Transformation in node.js

기술 > 서비스 기술 < 서비스

결론

12년 11월 20일 화요일

Page 110: Operational Transformation in node.js

Single Page App은 node.js로 수렴

웹 기반

협업

12년 11월 20일 화요일

Page 111: Operational Transformation in node.js

FAQ

12년 11월 20일 화요일

Page 112: Operational Transformation in node.js

FAQQ) 서버측과 클라이언트측 코드를 통합할때 호환성 문제는 없나요?

12년 11월 20일 화요일

Page 113: Operational Transformation in node.js

FAQQ) 서버측과 클라이언트측 코드를 통합할때 호환성 문제는 없나요?

A) 노드는 ECMA 5의 기본적인 메소드를 가지고 있습니다.IE8 같은 구형 브라우저는 ECMA 5의 일부 메소드만 지원합니다.

교집합을 찾으셔야 원할하게 코딩할 수 있습니다.

http://kangax.github.com/es5-compat-table/

12년 11월 20일 화요일

Page 114: Operational Transformation in node.js

FAQQ) 동시편집을 위한 Node.js에 OT 모듈이 있나요?

12년 11월 20일 화요일

Page 115: Operational Transformation in node.js

동시편집ShareJS

http://synapoffice.com/

12년 11월 20일 화요일

Page 116: Operational Transformation in node.js

동시편집

connect

socket.io-client

ShareJS

12년 11월 20일 화요일

Page 118: Operational Transformation in node.js

감사합니다.

12년 11월 20일 화요일