프로토콜 어댑터 예제

넥사크로 모듈 디벨로퍼에서 작성된 프로토콜 어댑터 예제를 소개합니다. 예시로 작성된 코드이며, 코드의 적합성을 검증하지는 않았습니다.

JSON 데이터 처리

JSON 데이터를 받아서 SSV 형태로 변환해주는 예제입니다.

1

Protocol Adapter로 새로운 오브젝트를 생성합니다. 오브젝트 id는 "JSONRecvAdp"로 설정합니다.

2

아래와 같이 코드를 수정합니다.

initialize 함수에서 상수값을 설정하고 decrypt에서 JSON 데이터를 SSV 형태로 변환해줍니다.

nexacro.JSONAdp.prototype.initialize = function()		
{
	this._rs_ = String.fromCharCode(30); //Record Separator
	this._us_ = String.fromCharCode(31); //Unit Separator
};

nexacro.JSONAdp.prototype.decrypt = function(strUrl, strData)		
{	
	var oJsonData = JSON.parse(strData);
	// Stream Header
	var ssvData = "SSV:" + oJsonData.codepage + this._rs_;

	// Variables
	var arrObj = oJsonData.parameters;
	var arrKey = Object.keys(arrObj);
	if(arrKey)
	{
		for(var i = 0; i < arrKey.length; i++)
		{
			if(i>0)
				ssvData +=this._rs_;
			ssvData += arrKey[i] + "=" + arrObj[arrKey[i]];
		}
		ssvData +=this._rs_;
	}

	// Datasets
	for(var i = 0; i < oJsonData.datasets.length; i++)
	{
		var dataset = oJsonData.datasets[i];
		// Dataset Header
		ssvData += "Dataset:" + dataset.ds_id + this._rs_;

		// Const Column Infos
		arrObj = dataset.ds_colinfo.constcolumn;
		arrKey = Object.keys(arrObj);
		if(arrKey)
		{
			ssvData += "_Const_"+this._us_;
			for(var j = 0; j < arrKey.length; j++)
			{
				if(j>0)
					ssvData +=this._us_;
				ssvData += arrKey[j] + "=" + arrObj[arrKey[j]];
			}
			ssvData += this._rs_;
		}

		// Column Infos
		var column = dataset.ds_colinfo.column;
		for(var j = 0; j < column.length; j++)
		{
			var cols = column[j];
			if(j == 0)
			{
				if(cols.id == "_RowType_")
				{
					ssvData += cols.id;
				}
				else
				{
					ssvData += "_RowType_";
					ssvData += this._us_ + cols.id+ ":" + cols.type + "(" + cols.size +")";
				}
			}
			else
			{
				ssvData += this._us_ + cols.id+ ":" + cols.type + "(" + cols.size +")";
			}
		}
		ssvData += this._rs_;

		// Records
		var row = dataset.ds_rows.row;
		for(var j = 0; j < row.length; j++)
		{
			var recode = row[j];
			arrKey = Object.keys(recode);

			if(arrKey[0] == "_RowType_")
			{
				ssvData += "N";
				var nCol = 1;
			}
			else
			{
				ssvData += "N";
				var nCol = 0;
			}
			for(; nCol < arrKey.length; nCol++)
			{
				if(recode[arrKey[nCol]] == null)
				{
					ssvData += this._us_ + "";
				}
				else
				{
					ssvData += this._us_ + recode[arrKey[nCol]];
				}
			}
			ssvData += this._rs_;
		}
		// Null Record
		ssvData += this._rs_;
	}
	trace(ssvData);
	return ssvData;
};

3

메뉴[Deploy > Deploy Package]를 선택해 Deploy Wizard를 실행합니다.

4

[Deploy] 버튼을 클릭해 모듈 설치 파일을 배포합니다.

5

넥사크로 스튜디오에 모듈을 설치하고 프로토콜 어댑터를 추가합니다.

6

Dataset 오브젝트를 추가하고 아래와 같이 설정합니다.

7

화면 내 Grid, Button 컴포넌트를 추가하고 Dataset 오브젝트를 Grid 컴포넌트에 바인딩해줍니다.

8

Button 컴포넌트의 onclick 이벤트 핸들러 함수를 아래와 같이 작성합니다.

JSON 데이터를 SSV 형태로 변환해서 처리할 것이기 때문에 nDataType 파라미터는 2(SSV)로 설정합니다.

this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    this.transaction("srv00", "JSONRecvAdp://127.0.0.1:4098/test.json", "","Dataset00=dsJson","","fnCallback", true, 2);
};

this.fnCallback = function(id, code, message)
{
    trace("Error["+code+"]:"+message);
}

9

Output 폴더에 JSON 파일(test.json)을 아래와 같이 작성합니다.

{
	"datatype": "JSON",
	"codepage": "utf-8",
	"parameters": {
		"ErrorCode": "0",
		"ErrorMsg": "OK"
	},
	"datasets": [
		{
			"ds_id": "dsJson",
			"ds_colinfo": {
				"constcolumn": {
					"ConstColumn0": "nexacro"
				},
				"column": [
					{
						"id": "Column0",
						"type": "STRING",
						"size": "256"
					},
					{
						"id": "Column1",
						"type": "DATE",
						"size": "256"
					}
				]
			},
			"ds_rows": {
				"row": [
					{
						"Column0": "3",
						"Column1": "20201124"
					},
					{
						"Column0": "4",
						"Column1": "20200122"
					}
				]
			}
		}
	]
}

10

QuickView(Ctrl + F6)로 웹브라우저에서 실행 후 버튼 클릭 시 JSON 파일에서 설정한 데이터가 반영되는 것을 확인합니다.

웹브라우저 콘솔창에서 SSV 데이터로 변환된 문자열과 성공 메시지를 확인할 수 있습니다.

대칭키 암호화, 복호화 처리 (crypto-js)

오픈소스 crypto-js를 사용한 예제입니다. 프로토콜 어댑터 적용 시 암호화, 복호화를 적용합니다.

crypto-js에 대해서는 아래 링크를 참고하세요.

https://code.google.com/archive/p/crypto-js/

아래 샘플에서는 CryptoJS v3.1.2 버전을 사용했습니다.

crypto-js를 포함한 모듈 배포시에는 라이선스 고지가 포함되어야 합니다.

https://code.google.com/archive/p/crypto-js/wikis/License.wiki

1

Protocol Adapter로 새로운 오브젝트를 생성합니다. 오브젝트 id는 "cryptojsAdp"로 설정합니다.

2

아래와 같이 코드를 수정합니다.

initialize 함수에서 대칭키("nexacro platform")와 initialization vector(초기화 벡터)값을 설정합니다. encrypt, decrypt에서는 암호화, 복호화 처리를 하고 원본 데이터와 변환된 데이터를 trace 메소드로 표시합니다.

nexacro.cryptojsAdp.prototype.initialize = function()		
{	
	this._key = CryptoJS.enc.Utf8.parse("nexacro platform");
	this._iv = CryptoJS.enc.Utf8.parse(1234567812345678);
};	

nexacro.cryptojsAdp.prototype.encrypt = function(strUrl, strData)		
{	
	var encrypted = CryptoJS.AES.encrypt(strData, this._key, { 
		iv: this._iv,
		mode:CryptoJS.mode.CBC,
		padding:CryptoJS.pad.ZeroPadding
	});
	trace("strData: "+strData);
	trace("encrypted.toString(): "+encrypted.toString());
	return encrypted.toString();
};	
		
nexacro.cryptojsAdp.prototype.decrypt = function(strUrl, strData)		
{	
	var decrypted = CryptoJS.AES.decrypt(strData, this._key, {
		iv:this._iv,
		padding:CryptoJS.pad.ZeroPadding
	}); 
	trace("strData: "+strData);
	trace("decrypted: "+decrypted.toString(CryptoJS.enc.Utf8));		
	return decrypted.toString(CryptoJS.enc.Utf8);
};

3

User Folder를 추가합니다.

4

User Folder의 이름을 "CryptoJS v3.1.2"로 변경합니다.

5

User Folder를 선택하고 컨텍스트 메뉴에서 [Import Files] 항목을 선택합니다.

6

탐색기에서 아래 2개 파일을 선택해 User Folder에 추가합니다.

CryptoJS v3.1.2
+ rollups > aes.js
+ components > pad-zeropadding-min.js

7

메뉴[Deploy > Deploy Package]를 선택해 Deploy Wizard를 실행합니다.

8

[Next] 버튼을 클릭해 JSON 편집 화면으로 이동합니다.

9

scripts 항목에 userfolder에 추가한 js 파일을 추가합니다.

{
	"name": "cryptojsAdp",
	"moduletype": "protocoladaptor",
	"objInfo": [
	    "cryptojsAdp/_metainfo_/cryptojsAdp.info"
	],
	"scripts": [
    	"cryptojsAdp/CryptoJS v3.1.2/aes.js",
		"cryptojsAdp/CryptoJS v3.1.2/pad-zeropadding-min.js",
	    "cryptojsAdp/cryptojsAdp.js"
	],
	"userfolder": [
	    "cryptojsAdp/CryptoJS v3.1.2"
	]
}

편집한 JSON 스크립트는 저장되지 않습니다. 배포시에 직접 수정해야 합니다.

10

[Deploy] 버튼을 클릭해 모듈 설치 파일을 배포합니다.

11

넥사크로 스튜디오에 모듈을 설치하고 프로토콜 어댑터를 추가합니다.

12

화면 내 transaction 스크립트를 아래와 같이 작성합니다.

this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    this.transaction("srv00", "cryptojsAdp://127.0.0.1:4098/test.xml", "","dsOut=Dataset00","value=a","fnCallback");
};

this.fnCallback = function(id, code, message)
{
    trace("Error["+code+"]:"+message);
}

13

QuickView(Ctrl + F6)로 웹브라우저에서 실행 후 버튼 클릭 시 데이터가 암호화되고 복호화되는 것을 확인합니다.

기능 확인을 위해 test.xml 파일에는 요청값을 암호화한 문자열을 반환하도록 했습니다. 예제에서는 요청값을 다시 복호화해서 반환합니다.

strData: <?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.nexacroplatform.com/platform/dataset">
    <Parameters>
        <Parameter id="value">a</Parameter>
    </Parameters>
</Root>

encrypted.toString(): 3TlyqNLXxHG8CN1MMIb3vAO/KGkU1OSAFl1wuMvAtEfq6jS6Vp95xvFLhCH/KKrSr5svsoRf1zi8lYmuQ0QMecYIPS+gz9KjeVCdwZ1F9/n/BQIrhN2ahuVDlQevU0+1fwirvXakwR6whvDPPY4ecgDgv7c3kCRVpxjYQk3AKJnZcKTwscCmfolfx9JzHmhq8R6SQKS9C8YJ/ju8j+VI2ZstQCoLU9JaJ0ATZbwGCmE=

strData: 3TlyqNLXxHG8CN1MMIb3vAO/KGkU1OSAFl1wuMvAtEfq6jS6Vp95xvFLhCH/KKrSr5svsoRf1zi8lYmuQ0QMecYIPS+gz9KjeVCdwZ1F9/n/BQIrhN2ahuVDlQevU0+1fwirvXakwR6whvDPPY4ecgDgv7c3kCRVpxjYQk3AKJnZcKTwscCmfolfx9JzHmhq8R6SQKS9C8YJ/ju8j+VI2ZstQCoLU9JaJ0ATZbwGCmE=


decrypted.toString(CryptoJS.enc.Utf8): <?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.nexacroplatform.com/platform/dataset">
    <Parameters>
        <Parameter id="value">a</Parameter>
    </Parameters>
</Root>