X-PUSH는 실시간으로 정보나 메시지를 전달할 수 있는 Server push 기술을 사용하는 제품입니다. 넥사크로는 X-PUSH 서버에서 전송하는 메시지를 처리할 수 있는 XPush 오브젝트를 제공합니다. 간단한 설정만으로 메시지를 요청하고 처리할 수 있습니다. 이번 장에서는 넥사크로 스튜디오에서 XPush 오브젝트를 등록하고 메시지를 처리하는 앱을 구현하는 과정을 살펴봅니다.
프로젝트에서 사용할 XPush 오브젝트 등록하기
XPush 오브젝트는 기본 오브젝트로 등록되어 있지 않습니다. Project Explorer 창에서 XPush 오브젝트를 등록한 후 사용할 수 있습니다.
1
메뉴[File > New > Project]를 선택하고 새로운 프로젝트를 생성합니다.
2
Project Explorer 창에서 [TypeDefinition > Objects] 항목을 선택합니다. Module을 추가할 수 있는 창이 나타납니다.
3
Modules 항목에서 [+] 버튼을 클릭합니다. 파일 탐색기가 나타나면 "Push.json" 파일을 선택합니다.
4
Modules 목록에 Push.json 항목이 추가된 것을 확인하고 nexacro.XPush 항목 옆에 있는 [+] 버튼을 클릭해 XPush 오브젝트를 Objects 목록에 추가합니다.
5
Objects 목록에 XPush 오브젝트가 추가된 것을 확인하고 [OK] 버튼을 클릭해 창을 닫습니다. XPush 오브젝트를 추가하면서 변경된 설정을 반영하기 위해 프로젝트를 새로 로딩합니다.
실시간 메시지를 Grid 컴포넌트에 표시하기
XPush 오브젝트를 추가해서 X-PUSH 서버에서 실시간으로 전송되는 메시지를 수신하고 수신된 메시지를 Grid 컴포넌트에 표시합니다.
실시간 메시지를 수신하기 위해서는 X-PUSH 서버가 동작하고 있으며 메시지 공급자(Message Provider) 서비스가 실행된 상태여야 합니다. 메시지 전송은 run_provider_demo_Push.bat 파일 실행 시 전송하며 실행을 멈출 때까지 계속 전송합니다.
1
메뉴[File > New > Form]를 선택하고 새로운 Form 화면을 생성합니다.
2
Form 화면에 Grid 컴포넌트와 Dataset 오브젝트를 추가합니다.
3
Dataset Editor에서 Dataset 오브젝트의 컬럼 속성을 아래와 같이 설정하고 Grid 컴포넌트에 바인딩합니다.
Dataset 오브젝트의 컬럼 속성은 layouturl 속성값으로 지정하는 메시지 레이아웃 XML 파일에 정의된 id 값이 같아야 합니다.
... <message type="OPDT"> <field id="id" type="string" size="9"/> <field id="content" type="string" size="255"/> </message> ...
4
컴포넌트 툴바에서 XPush 오브젝트를 확인하고 마우스 드래그앤드롭 동작으로 Form 화면에 XPush 오브젝트를 추가합니다. XPush 오브젝트는 Dataset 오브젝트처럼 Invisible Object 영역에 추가됩니다.
5
XPush 오브젝트를 선택하고 속성창에서 layouturl, iplist 속성값을 지정합니다. layouturl 속성값은 정의된 메시지 레이아웃 XML 파일의 URL값을 지정하거나 로컬 위치의 파일을 지정할 수 있습니다. iplist 속성값은 X-PUSH 서버 IP와 PORT 값을 지정합니다.
iplist 속성값은 TCP 통신(NRE)과 HTTP 통신(웹브라우저) 중 하나를 선택할 수 있습니다.
TCP 통신 방식을 지정하는 경우에는 PORT 번호를 10081로 지정합니다.
HTTP 통신 방식을 지정하는 경우에는 PORT 번호를 10080으로 지정합니다.
NRE와 웹브라우저 모두 서비스해야 하는 경우에는 iplist 속성값에 두 가지 PORT 설정을 모두 지정해야 합니다.
iplist="http://localhost:10080, localhost:10081"
6
Form 오브젝트의 onload 이벤트 함수를 아래와 같이 추가합니다. onload 이벤트 함수에서는 X-PUSH 서버에 연결을 시도합니다.
this.Form_Work_onload = function(obj:nexacro.Form,e:nexacro.LoadEventInfo) { this.XPush00.connect("user00", "password"); };
7
XPush 오브젝트의 onsuccess 이벤트 함수를 아래와 같이 추가합니다. 연결이 성공한 경우에 메시지 수신을 위해 subscribe 메소드를 실행합니다. 실시간으로 메시지를 수신해서 Dataset 오브젝트에 메시지 데이터를 추가합니다. 추가된 메시지는 Grid 컴포넌트를 통해 표시됩니다.
this.XPush00_onsuccess = function(obj:nexacro.XPush,e:nexacro.XPushEventInfo) { if(e.action == nexacro.XPushAction.AUTH) // 0 { this.XPush00.subscribe("OPDT", "ALL", this, this.Dataset00, "append", "fn_PushCallback"); } }; this.fn_PushCallback = function(Row,ChangeColumn,AllColumn,Type,ActionType) { trace(Row,ChangeColumn,AllColumn,Type,ActionType); }
8
XPush 오브젝트의 onerror 이벤트 함수를 아래와 같이 추가합니다. 연결이 실패한 경우에는 원인을 확인할 수 있습니다.
this.XPush00_onerror = function(obj:nexacro.XPush,e:nexacro.XPushErrorEventInfo) { trace(e.errormsg, e.statuscode); };
9
앱을 실행하면 onload 이벤트 함수 내에서 X-PUSH 서버에 연결하고 전송되는 메시지를 수신하기 시작합니다. 실시간으로 수신된 메시지가 Grid 컴포넌트에 표시되는 것을 확인합니다.
신뢰성 메시지 처리하기
Form 화면을 생성하고 XPush 오브젝트를 초기화하는 과정은 실시간 메시지를 Grid 컴포넌트에 표시하기와 같습니다. onload 이벤트 함수에서 달라지는 부분부터 설명합니다.
신뢰성 메시지를 수신하기 위해서는 X-PUSH 서버가 동작하고 있으며 메시지 공급자(Message Provider) 서비스가 실행된 상태여야 합니다. 메시지 전송은 run_provider_demo_Reli.bat 파일 실행 시 하나의 메시지를 전송합니다.
신뢰성 메시지 수신을 위해 토픽 등록하기
신뢰성 메시지(Reliable messaging)는 사용자에게 메시지를 전달하는 것을 보장하는 것을 의미합니다. 실시간 메시지는 메시지를 전송하고 사용자가 메시지를 수신했는지 여부를 확인하지 않습니다. 마치 라디오 방송처럼 계속 메시지를 전달하고 사용자가 이를 수신하는 것입니다. 하지만 신뢰성 메시지는 특정 사용자에게 보내는 음성 메시지와 비슷합니다. 메시지를 전송하는 시점에 확인하지 못했더라도 나중에 확인할 수 있도록 보장하는 것입니다.
신뢰성 메시지를 처리하기 위해서는 어떤 사용자가 어떤 메시지를 수신할 것인지 미리 약속되어 있어야 합니다. 토픽 등록하기를 통해 데이터베이스에 관련 정보를 등록합니다.
1
Form 오브젝트의 onload 이벤트 함수를 아래와 같이 추가합니다. onload 이벤트 함수에서는 X-PUSH 서버에 연결을 시도합니다.
this.Form_Work_onload = function(obj:nexacro.Form,e:nexacro.LoadEventInfo) { this.XPush00.connect("user00", "password"); }
2
XPush 오브젝트의 onsuccess 이벤트 함수를 아래와 같이 추가합니다. 연결이 성공한 경우에 메시지 수신을 위해 subscribe 메소드를 실행합니다. 실시간으로 메시지를 수신해서 Dataset 오브젝트에 메시지 데이터를 추가합니다. 추가된 메시지는 Grid 컴포넌트를 통해 표시됩니다.
this.XPush00_onsuccess = function(obj:nexacro.XPush,e:nexacro.XPushEventInfo) { if(e.action == nexacro.XPushAction.AUTH) // 0 { this.XPush00.subscribe("NOTI", "ALL", this, this.Dataset00, "append", "fn_PushCallback"); } };
3
Form 화면에 Button 컴포넌트를 추가하고 Button 컴포넌트의 onclick 이벤트 함수를 아래와 같이 추가합니다. connect 메소드 실행 시 사용한 userid로 토픽을 등록합니다. 토픽 등록은 한 번만 실행합니다.
this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { this.XPush00.registerTopic("NOTI", "ALL"); };
4
XPush 오브젝트의 onerror 이벤트 함수를 아래와 같이 추가합니다. 토픽 등록이 실패하거나 이미 등록된 토픽이 있는 경우에는 실패 원인을 확인할 수 있습니다.
this.XPush00_onerror = function(obj:nexacro.XPush,e:nexacro.XPushErrorEventInfo) { trace(e.errormsg, e.statuscode); };
5
토픽이 등록되면 신뢰성 메시지를 수신할 수 있습니다. 데이터베이스 T_TOPIC 테이블에서 등록된 토픽을 확인할 수 있습니다.
신뢰성 메시지 수신하기
앱이 실행되지 않은 상태에서 메시지가 전송되면 해당 메시지는 데이터베이스 T_USER_MESSAGE 테이블에 저장됩니다. MESSAGE_STATE 컬럼값이 0이면 사용자에게 메시지가 전달되지 않은 상태입니다.
1
Form 화면에 Button 컴포넌트를 추가하고 Button 컴포넌트의 onclick 이벤트 함수를 아래와 같이 추가합니다. connect 메소드 실행 시 사용한 userid로 미수신된 메시지가 있는지 확인하고 메시지를 수신합니다. 서버에서 미수신된 메시지를 전송하고 나면 MESSAGE_STATE 컬럼값이 1로 변경됩니다.
this.Button01_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { this.XPush00.requestMessage("NOTI", "ALL"); };
2
requestMessage 메소드는 별도의 콜백함수를 지정하지 않고 subscribe 메소드 실행 시 지정한 콜백함수를 사용합니다. requestMessage 메소드를 실행해 미수신된 메시지를 수신하면 sendResponse 메소드를 실행해 해당 메시지 수신에 대한 응답을 보낼 수 있습니다. 서버에서 응답을 수신하면 MESSAGE_STATE 컬럼값이 2로 변경됩니다.
this.fn_PushCallback = function(Row,ChangeColumn,AllColumn,Type,ActionType,MessageId) { trace(Row,ChangeColumn,AllColumn,Type,ActionType,MessageId); if(ActionType=="RELI") this.XPush00.sendResponse(MessageId); }
등록된 토픽 취소하기
더 이상 해당 메시지를 수신할 필요가 없다면 등록된 토픽을 취소해주어야 합니다. unregisterTopic 메소드를 사용해 등록된 토픽을 취소할 수 있습니다.
1
Form 화면에 Button 컴포넌트를 추가하고 Button 컴포넌트의 onclick 이벤트 함수를 아래와 같이 추가합니다. connect 메소드 실행 시 사용한 userid로 토픽을 등록한 토픽을 취소합니다.
this.Button02_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { this.XPush00.unregisterTopic("NOTI", "ALL"); };
2
등록된 토픽을 취소하면 신뢰성 메시지를 수신할 수 없습니다. 데이터베이스 T_TOPIC 테이블에서 등록된 토픽 항목 중 ACTIVE 컬럼값이 "N"으로 변경된 것을 확인할 수 있습니다.