프로토콜 어댑터

넥사크로플랫폼에서 제공하는 데이터 처리는 데이터 자체를 변환해 처리하지는 않습니다. 기본 프로토콜인 HTTP를 사용해 요청과 응답을 처리합니다. 하지만 사용자 환경에 따라 데이터를 암호화해서 통신하거나 원하는 형식으로 변환해 처리하는 과정을 필요로 할 수 있습니다.

프로토콜 어댑터는 다른 데이터 구조를 필요로 하는 관계를 서로 연결해 원하는 형태로 동작하게 만드는 도구입니다. 간단한 설정만으로 원하는 기능을 쉽게 만들 수 있습니다.

프로토콜 어댑터

프로토콜, 모듈, 서비스 항목은 프로젝트 폴더에 있는 default_typedef.xml 파일을 직접 등록하거나 프로젝트 탐색창에서 TypeDefinition 항목을 두 번 클릭해 열리는 [Edit TypeDefinition]창에서 해당 항목을 추가할 수 있습니다.

모듈(Module) 등록

프로젝트 폴더에 있는 default_typedef.xml 파일을 직접 수정하거나 [Edit TypeDefinition > Modules]창에서 해당 항목을 추가합니다.

등록할 모듈과 스크립트는 넥사크로 스튜디오에서 Base Lib Path로 지정된 경로 아래 [component] 폴더 하위 경로에 파일이 있어야 합니다.

기본 설정은 넥사크로플랫폼 설치 경로 아래 nexacro14lib 폴더입니다.

Base Lib Path는 [Tools >Options > Environment > Build > Base Lib Path]에서 다른 경로로 변경할 수 있습니다.

모듈은 아래와 같은 형태로 JSON 파일을 작성합니다. 'scripts' 항목에 지정된 자바스크립트 경로는 [Base Lib Path > component] 폴더 아래 해당 폴더와 스크립트 파일이 있어야 합니다.

{
"name": "Xecure",
"version": "14.0.0.0",
"description": "nexacro platform XecureAdp Protocol Library",
"license": "",
"scripts": [
"Xecure/Xecure.js", 
]
}
//@ sourceURL=Xecure.json
<Module url="Xecure.json"/>

프로토콜(Protocol) 등록

프로젝트 폴더에 있는 default_typedef.xml 파일을 직접 수정하거나 [Edit TypeDefinition >Objects]창에서 해당 항목을 추가합니다.

<Component type="Protocol" id="Xecure" classname="nexacro.XecureAdp"/>

프로토콜로 등록되는 클래스에 정의된 인터페이스를 해당 시점에 맞게 호출하는 방식으로 동작합니다. 프레임워크 내부에서 동작하는 방식은 아래와 같습니다.

  1. nexacro.ProtocolAdp를 상속받은 클래스로 작성합니다.

    등록된 프로토콜이 처음 호출되는 시점에 ProtocolAdptor 오브젝트를 생성합니다. 해당 오브젝트는 애플리케이션이 종료되기전까지 통신이 호출되는 시점에 사용됩니다.

var _pXecureAdp = nexacro._createPrototype(nexacro.ProtocolAdp);	
nexacro.XecureAdp.prototype = _pXecureAdp;
  1. 오브젝트가 생성되는 시점에 initialize 함수가 호출됩니다.

_pXecureAdp.initialize = function ()			
{	
	trace("_pXecureAdp.initialize");
};
  1. 오브젝트가 삭제되는 시점에 finalize 함수가 호출됩니다.

    애플리케이션이 내려가는 시점에 호출됩니다.

_pXecureAdp.finalize = function ()			
{			
	trace("_pXecureAdp.finalize");	
};
  1. 프로토콜 어댑터 버전 정보를 제공합니다. 이 함수가 없으면 "1.0"으로 인식합니다. getHTTPHeader() 함수를 사용하기 위해서는 반드시 이 함수가 있어야 하며 "1.1" 이상의 값을 가져야 합니다. version() 함수가 없거나 값이 "1.1"보다 작으면 getHTTPHeader() 함수를 처리하지 않습니다.

_pXecureHttp.version = function ()
{
      return "1.1";
};
  1. HTTP 통신 헤더 정보를 제공합니다. _httpheaders는 HTTP 헤더 정보를 담고있는 배열 객체입니다.

_pXecureHttp.getHTTPHeader = function ()
 {
   return this._httpheaders;
 };
  1. 내부에서 실제 통신이 호출되기 전에 encrypt 함수가 호출됩니다.

    통신이 발생하기 전에 전송할 데이터를 암호화하거나 원하는 형태로 변환합니다.

_pXecureAdp.encrypt= function(url, data)
{
        trace("encrypt url=" + url + ";data=" + data);
        return data;
};

encrypt 함수는 요청 방식(Request Method)이 POST 방식일 때만 호출됩니다.

transaction이나 load 메소드 사용 시 GlobalVariables와 관련된 별도 설정이 없다면 POST 방식으로 동작합니다.

  1. 내부에서 실제 통신이 끝난 후에 decrypt 함수가 호출됩니다.

    수신한 데이터를 복호화하거나 원하는 형태로 변환합니다.

_pXecureAdp.decrypt = function (url, data)
{
        trace("decrypt url=" + url + ";data=" + data);
        return data;
};

프로토콜로 등록되는 클래스의 전체 코드는 아래와 같습니다. 사용 환경에 따라 실제 코드는 수정해 사용해야 합니다.

if (!nexacro.XecureAdp)
{
    nexacro.XecureAdp  = function ()
    {
        
    };
        
    var _pXecureAdp = nexacro._createPrototype(nexacro.ProtocolAdp);
    nexacro.XecureAdp.prototype = _pXecureAdp;

    _pXecureAdp._type = "nexacroXecureAdp";
    _pXecureAdp._type_name = "XecureAdp";
    _pXecureHttp._httpheaders = [];
    _pXecureHttp._httpheaders.push({ id: "X-Requested-With", value: "XMLHttpRequest"});
    _pXecureHttp._httpheaders.push({ id: "Accept", value: "application/json, text/json, */*"});
    _pXecureHttp._httpheaders.push({ id: "Content-Type", value: "application/json"});


    _pXecureHttp.version = function ()
    {
        return "1.1";
    };

    _pXecureHttp.getHTTPHeader = function ()
    {
      return this._httpheaders;
    };

    _pXecureAdp.encrypt= function(url, data)
    {
        trace("encrypt url=" + url + ";data=" + data);
        return data;
    };

    _pXecureAdp.decrypt = function (url, data)
    {
        trace("decrypt url=" + url + ";data=" + data);
        return data;
    };

    _pXecureAdp.initialize = function ()
    {
        
       trace("_pXecureAdp.initialize");
    };

    _pXecureAdp.finalize = function ()
    {
	 trace("_pXecureAdp.finalize");
    };

    delete _pXecureAdp;
}

서비스 등록

프로젝트 폴더에 있는 default_typedef.xml 파일을 직접 수정하거나 [Edit TypeDefinition > Services]창에서 해당 항목을 추가합니다.

<Service prefixid="xecuredata" type="js" url="Xecure://localhost/" version="0" communicationversion="0"/>

서비스 그룹으로 등록된 폼을 프로토콜 어댑터를 통해 호출하려면 서비스 그룹 등록 시 url을 아래와 같이 등록하고 사용할 수 있습니다.

<Service prefixid="Base" type="form" url="Xecure://localhost/Base" version="0" communicationversion="0"/>
this.Div00.set_url('Base:test.xfdl');

데이터 호출

등록한 서비스를 호출하게 되면 해당 프로토콜을 거쳐 통신이 진행됩니다.

application.transaction("MyService01", "xecuredata::test.js", "dsIn=dsIn:A","dsOut=dsIn","a=b","fnCallback");

데이터 처리에 대한 전체적인 흐름을 정리하면 아래와 같습니다.

  1. 해당 프로토콜로 데이터 호출

    Application.transaction(), Dataset.load(), Div.set_url();

  2. 프로토콜 초기화

    initialize

  3. 전송 데이터 변환

    encrypt

  4. 서버 호출

    변환된 데이터를 지정된 서버로 전송합니다.

  5. 서버 응답

  6. 수신 데이터 변환

    decrypt

  7. 콜백 함수 또는 데이터 처리

    호출 유형에 따라 데이터를 처리합니다.

PluginElement

데이터 처리 시 암호화와 같은 추가적인 보안이 필요한 경우에는 스크립트로 처리하지 않고 외부 플러그인을 설정해야 합니다. 이런 경우에는 PluginElement를 사용해 외부 플러그인을 적용할 수 있습니다.

외부 플러그인 적용은 해당 솔루션에서 제공하는 규칙에 따라 추가적인 코드를 필요로 할 수 있습니다. 아래 설명은 일반적으로 PluginElement를 사용하는 가이드를 제공합니다.

아래 설명은 웹 구간 암호화 처리를 위해 제큐어웹(XecureWeb)을 적용하는 경우에 대한 설명입니다.

참고로 작성된 예제로 일부 내용이 누락됐을 수 있습니다.

런타임 버전을 사용하는 경우 외부 플러그인은 애플리케이션 최초 실행 시 설치 웹페이지를 불러와 설치하는 형태를 권장합니다.

설치 시 문제가 발생했을 때 웹브라우저를 통해 설치해야 플러그인 문제인지 넥사크로플랫폼 문제인지 확인할 수 있습니다.

프로토콜(Protocol) 클래스 코드

PluginElement를 사용할 때 프로토콜 어댑터를 사용하는 방식은 같고 프로토콜로 등록되는 클래스 코드만 일부 변경합니다.

  1. 오브젝트가 생성되는 시점에 initialize 함수가 호출됩니다.

    내부에서 사용하는 플러그인은 nexacro.PluginElement를 사용할 수 있습니다.

    Parent_element 없이 생성해 프레임워크 내부 hidden 영역에 추가해 화면에 나타나지는 않습니다.

_pXecureAdp.initialize = function ()	
{	
	trace("_pXecureAdp.initialize");
	var parent_elem = null;
	this.xecure = new nexacro.PluginElement();
	this.xecure.setElementClassId("{7E9FDB80-5316-11D4-B02C-00C04F0CD404}");
	this.xecure.create();  
};
  1. 오브젝트가 삭제되는 시점에 finalize 함수가 호출됩니다.

    애플리케이션이 내려가는 시점에 호출됩니다.

_pXecureAdp.finalize = function ()			
{			
	this.xecure.destroy();			
	delete this.xecure;			
};
  1. 내부에서 실제 통신이 호출되기 전에 encrypt 함수가 호출됩니다.

    통신이 발생하기 전에 전송할 데이터를 암호화합니다.

_pXecureAdp.encrypt= function(url, data)			
{			
	return data;			
};
  1. 내부에서 실제 통신이 끝난 후에 decrypt 함수가 호출됩니다.

    수신한 데이터를 복호화합니다.

_pXecureAdp.decrypt = function (url, data)			
{			
	return data;			
};
  1. 통신 시 사용할 프로토콜은 getUsingProtocol 함수에서 반환합니다.

    기본값으로 설정된 프로토콜은 http입니다.

_pXecureAdp.getUsingProtocol = function (url)			
{			
	return "http"; 
};
  1. 통신 시 추가로 쿠키에 들어갈 정보는 getCommunicationHeaders 함수에서 반환합니다.

_pXecureAdp.getCommunicationHeaders = function (url)			
{			
	var headers = [];		
	headers.push({id:"test", value:"test1"});		
	return headers;		
};