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