부록 B.프로토콜 어댑터 예제

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

B.1JSON 데이터 처리

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 데이터로 변환된 문자열과 성공 메시지를 확인할 수 있습니다.

B.2대칭키 암호화, 복호화 처리 (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>