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