1.MiPlatform을 이용하여 Application개발시 고려사항

해당 문서의 내용은 MiPlatform을 이용하여 Application 개발시 기본적으로 알고 있어야 할 지식을 정리하였습니다. 따라서 고객사의 상황에 따라 설정값 등 구현방법은 달라질 수 있으므로 개발시 참고용으로 사용하시기 바랍니다.

1.1StartXML

1.1.1StartXML확장자를 .xml이 아니라, JSP, ASP형태로 변경방법

마이플랫폼 StartXML의 확장자는 변경이 가능합니다. 즉 출력되는 결과물 형태라 StartXML포멧으로만 제공되면 사용이 가능합니다
(jsp, asp형태로 구현가능)

마이플랫폼엔진에서 Startxml의 path를 잘라서 파싱하는 함수 내부에서 구분자로 '\' , '/' , '=' , '&' , '?'을 사용하고 있습니다.


startxml에서 jsp뒤에 ?,= 부분에서 먼저 파싱하고 리턴되는 관계로 기타 다른 path가 설정이 안되는 문제가 있는것으로 확인되나, 파싱을 처리하는 함수 내부는 다양한 곳에서 호출되고 사용되어 지고 있는 부분이어서 수정할수 없습니다.


startxml에서 파일명 뒤에 '\' , '/' , '=' , '&' , '?'을 사용해서 내용을 추가하여 사용할수없습니다.

마이플랫폼 StartXML의 확장자는 변경이 가능한가?

1.1.2Application에서 사용하는 StartXML경로를 얻는 방법

Application의 StartXML경로를 구하는 방법은 아래와 같습니다.

사용 예)
alert(global.startxml);
해당 결과는 PID에서 실행한 경우와 웹서버(서버)에 올려 실행시 결과가 다르게 나옵니다. 
(실제 StartXML경로가 출력됩니다.)

Cache StartXML경로를 얻을 수 있나요?

1.1.3StartXML경로 확인

MiPlatform실행경로 즉 StartXML의 위치정보를 확인하는 방법입니다

// StartXml 경로 찾기
function GetStartXmlPath()
{
    var i, len, start_xml, c;
    start_xml = global.StartXml;
    len = Length(start_xml);
    for( i = len-1 ; i >= 0 ; i-- )
    {
        c = CharAt(start_xml, i);
        if( c == "\\" || c == "/" ) break;
        }
    return substr(start_xml, 0, i) + c;
}
StartXML을 일반 PC에서 실행할 경우에는 탐색기 경로가 나오며, 웹을 통해 접근시에는 웹경로를 얻을 수 있습니다.

MiPlatform의 StartXML경로를 알 수 있나요

1.2MiPlatform에서 환경변수 참조 순서

MiPlatform에서 사용하여 개발을 하다 보면 환경변수에 따 결과가 다르게 표현될 수 있습니다.

예를 들어 해당 폼의 CodePage설정 또는 Language,  Font등을 참조를 하게 되는데 이때 
참조하는 순서는 다음과 같습니다. 

1) 폼이 속한 Application Group 
2) Global 
3) PC의 사용자 제어판의 환경세팅값 참조 
 
위의 3가지 상위단계를 거쳐 최종 설정내용을 참조하게 됩니다.

MiPlatform에서 변수 및 환경정보 참조방법

1.3소스 컴파일

왜 컴파일을 사용해야 하는가?

  1. 마이플랫폼으로 개발된 각 화면은 XML파일로 만들어지며, 실제 서비스 시에는 WebServer 또는 WAS(Web Application Server)의 특정 위치에 저장되어 End-User가 화면을 요청할 경우, 해당 XML파일이 클라이언트로 전송되고, 마이플랫폼 엔진이 이를 해석해 Browser에 Viewing하는 일련의 과정을 거치게 됩니다.

  1. XML파일을 CompiledXML로 변경하여 서비스할 수 있는데, 이로 인해 아래 두 가지 효과를 가져와 서버와 클라이언트 양쪽에 모두 유리합니다.

테스트 결과 일반적인 XML소스의 0.7~0.8배 정도의 압축률을 보였습니다.

MiPlatform 소스는 반드시 컴파일을 해야 하나요?

1.4마이플랫폼을 소스 컴파일(Compiled XML)방법

마이플랫폼으로 개발된 Application을 운영시 소스 1차 보안 및 사이즈를 최소화 하기 위해 방법으로 컴파일 작업이가능합니다. 

컴파일시 주의사항 및 작업방법을 기술합니다.

1.4.1작성된 Application 소스 컴파일을 권장하는 이유

MiPlatform으로 개발된 화면 및 스크립트를 작성하게 되면 XML과 자바스크립트 형태로 소스가 생성됩니다. 

이때 웹브라우저를 통해 접근시 소스가 보이게 됩니다.

그림 1-120120430_175418744_compile_1

위와 같이 URL로 접근시 소스가 보이는 문제가 있을 수 있습니다. 
(해당 소스는 마이플랫폼 구조를 알아야 소스 파악을 할 수는 있으나, 해당 소스 노출시 문제가 발생할 수 있는 부분에 대한 사전 보안 작업이라 할 수 있겠습니다.)

1.4.2소스 최적화

소스를 컴파일하게 되는 경우 바이너리 압축형태의 소스가 컴파일 되므로 컴파일 작업을 하지 않았을 때 보다 최대 약 60~ 80% 가량 사이즈가 작게 됩니다.

1.4.3소스 컴파일 전 사이즈 및 소스형태

그림 1-220120430_175448732_compile_2

1.4.4소스 컴파일 후 사이즈 및 소스형태

그림 1-320120430_175502423_compile_3

1.4.5소스 컴파일 방법 (전체 프로젝트)

1단계 : 컴파일 하고자 하는 Project를 오픈합니다.

그림 1-420120430_175524985_compile_4

2단계 : Project 오픈 후 PID메뉴 중 Save the Project as Compiled XML 메뉴를 선택합니다

그림 1-520120430_175544041_compile_5

3단계 : 컴파일된 소스를 저장할 폴더(생성)를 선택한다.

그림 1-620120430_175645652_compile_6

4단계 : 폴더를 선택하게 되면 현재 오픈한 Project의 모든 소스에 대한 폴더정보가 표시됩니다.

그림 1-720120430_175709199_compile_7

5단계 : OK버튼을 누르게 되면 하단과 같이 Output창에 컴파일 진행상태가 표시되며 작업이 완료되면 확인창이 오픈됩니다.

그림 1-820120430_175736007_compile_8

6단계 : 최종 컴파일 작업이 완성된 결과는 탐색기를 통해 확인이 가능합니다.

1.4.6소스 컴파일 방법 (개별화면)

1단계 : 오픈된 Project Explorer에서 컴파일 하고자 하는 소스를 선택합니다.

그림 1-920120430_175811256_compile_10

2단계 : 선택된 소스에서 마우스 우 클릭을 통해 Save As를 선택하면 아래와 같은 컴파일 옵션을 선택할 수 있습니다.

그림 1-1020120430_175837235_compile_11

저장시 동일한 이름으로 저장하는 경우 기존 원본소스를 덮어쓸 수 있으니 반드시 다른 이름으로 지정하여 저장을 합니다.

3단계 : 저장이 완료된 이 후 해당 폴더의 컴파일된 결과를 확인할 수 있습니다.

그림 1-1120120430_175931050_compile_12

MiPlatform 소스를 한번 컴파일 한 후에는 원본 소스를 반드시 따로 관리 하셔야 합니다.

즉 한번 컴파일 된 소스는 원복되지 않습니다.

Application 소스 컴파일 방법

화면 소스 컴파일 방법

1.5세션처리(SESSION)

1.5.1마이플랫폼 세션기능 설명

마이플랫폼은 별도의 세션정보를 관리하지 않습니다. 
다만 흔히 말하는 JAVA의 세션정보를 공유하고자 한다면 다음과 같이 설정하여 서비스 호출시 값 전달이 가능합니다.

설정방법 : Global 변수를 Share Type으로 선언합니다.

그림 1-1220120430_132227301_session

반드시 Type이 Share로 선언되어야 합니다. 
Share이 아닌 Global인 경우 서비스 호출시 값 전달이 되지 않습니다.

JSESSIONID에 값 초기 세팅방법

  1. 포탈 홈페이지에서 JSESSIONID를 마이플랫폼으로 전달해 주는 경우에는 디폴트를 MiPlatform에서 부터전달이 가능하다.

  2. 서비스를 호출하게 되면 처음 서버쪽에서 JSESSIONID를 부여됩니다.

예) 포탈 홈페이지에서 MiPlatform을 실행하는 경우 (index.html) : MiInstall 추가필요 
MiInstaller.GlobalVal = "JSESSIONID=<%=session.getId()%>";
 
(IE에서 전용브라우져로 세션을 공유하기 위해서 사용하는 설정입니다.)

서비스쪽 세션변수(JSESSIONID)명이 일치해야 합니다.

세션변수면은 기본적으로 JSESSIONID를 많이 사용하지만 상황에 따라 다를 수 있음

JSESSIONID는 어떻게 공유하나요?

웹에서 세션을 마이플랫폼에 JSESSIONID 에 자동으로 넣어주고싶습니다.

1.6업데이터(MiUpdater) 종류 및 차이점

마이플랫폼의 업데이터 종류와 차이점에 대해 기술합니다.

1.6.1업데이터(Updater) 종류

MiPlatform은 버전별 310, 310L, 311, 320, 330로 업데이터를 제공합니다. 
MiPlatform 320버전에서는 3가지의 Type을 제공하고 있습니다. 

각 버전은 고객사별로 선택하여 사용이 가능합니다. 

또한 고객사에서 여러 개의 프로젝트를 진행하는 경우 프로젝트별로, 320, 321등 각각 사용을 할 수 있습니다.

업데이터(Updater) 버전별 차이

표 1-1버전별 차이

버전

간략설명

비고

31x

320 기본 업데이터 기능과 동일


320

가장 기본적인 업데이터 기능

보안문제 발견 execute 명령어 실행가능 (320버전까지만 제공)

321

320버전에 execute명령어 실행기능 제거

보안문제 발견 UpdateUrl를 외부 Url 연결가능

(악용될 수 있으므로 Domain 주소와 UpdateUrl 정보 주소가 동일한 경우에만 정상으로 인식하도록 지적)

MiInstaller.MakeShortCut("%system%MiUpdater321.exe", 중략..)

실행파일명 보이지 않토록 변경요청 ->MU

예) MiInstaller.MakeShortCut("MU", 중략 …)

322

320, 321 문제사항을 모두 반영한 버전


331

321버전과 동일


332

322버전과 동일


참고사항

MiUpdater320 : 가장 기본으로 나온 파일이며 base가 되나 각 보안상의 문제로 다음 버전이 나왔습니다.

MiUpdater321 : 320의 업데이터 내부에 execute라는 함수가 있어 해당 함수를 이용하여 사용자의 PC 로컬에 있는 파일을 실행 시킬 수 있는 결점을 보완한 버전입니다.
Ex) Mipupdater321.execute(filePath) : 파일이 실행 되어 버림
MiUpdater322 : MiUpdater321의 결점을 보완하였습니다. 
결점은 Updater를 사용하여 updaterurl이나 접속 Domain의 url을 다른 사이트의 url로 입력하여 
사용할 수 있으며 해킹 사이트로 연결시 문제가 될 수 있는 소지가 있습니다. 
MiInstlr ActiveX 웹 페이지의 URL 경로의 Domain 값이 UpdateURL의 Domain값과 같아야 합니다.

Updater 321과 322의 차이점

업데이터 320과 321을 같이 쓸수 없나요?

Updater321 과 updater322의 차이 및 배포

1.7TraceLog(로그)

TraceMode는 프로그램 개발시 개발자의 디버깅을 돕기 위해 제공되는 기능으로 
Syntex오류 및 개발자가 정의한 Log내용을 확인해 볼 수 있습니다.
표 1-2TraceLog설정

Method

간략설명

비고

Append

Log파일을 모두 기록

개발 및 테스트 운영시 권장

New

맨 마지막 Log기록만 남김

개발 및 테스트 운영시 권장

None

Log파일을 쓰지 않음

운영시 권장사항

운영환경에서는 불필요한 trace를 통한 log 기록을 금지해야 합니다

불가피하게 log 확인시에는 장기간 trace 기록 설정을 하지 말아야 합니다

해당 log는 파일로 저장되기 때문에 운영환경 중 중요한 데이터를 trace로 기록하게 되면 보안에 심각한 문제를 끼칠 수 있을 뿐만 아니라 파일사이즈가 커지면 커질수록 파일 I/O에 따른 오버헤드(over-head)가 발생할 수 있어 성능에 악영향을 미칠 수 있습니다

반드시 TraceMode를 "none"으로 설정하시고 불필요한 trace구문을 삭제하시기 바랍니다

1.7.1TraceLog 설정방법

그림 1-1320120430_172342185_tracelog_1

TraceLog에 특정 개인정보를 기록하는 것이 없도록 주의해야 합니다.

(예: 주민번호 등)

TraceLog 기록 내용이 많은 경우 속도에 영향을 줄 수 있습니다.

(Syntax오류는 주기적으로 확인하여 오류가 발생되지 않토록 수정해야 합니다.)

TraceLog파일 설정은 어디서 하나요?

1.7.2TraceLog 파일위치

PID를 실행하여 동작되는 경우에는 PID의 output창에 로그가 기록됩니다.

일반 사용자의 경우 아래 경로에 파일이 생성됩니다.

위치 : C:\Users\KJB\AppData\LocalLow\TOBESOFT\MiPlatform320U\ TraceLog_MiPlatform.txt
( 위치는 버전 및 사용자 계정에 따라 다를 수 있음 )
기록내용 : 오류메시지 및 개발자 기록내용 
[20120213:11:32:19]-2085605088:Script Function을 찾는데 실패 하였습니다.fnCallBack
[20120213:11:32:19]-2085605354:해당 스크립트 호출에 실패 하였습니다.(proj_Result)
[20120213:11:32:25]-2085605088:Script Function을 찾는데 실패 하였습니다.fnCallBack

TraceLog파일 설정은 어디서 하나요?

TraceLog파일 생성 위치?

1.7.3PID 오류 메시지 중 ()에 표현되는 코드의 의미

PID에서 오류발생시 Output창에 오류메시지가 출력됩니다. 
이때 (2272): -2085605117:Script를 parsing할때 다음과 같은 오류가  발생하였습니다.
와 같이 출력이 되는데 2272 값에 대한 확인방법입니다.

그림 1-1420120430_171136889_pid_7

PID에 표현된 (2272)의 정보는 윈도우 작업관리자의 Process ID를 의미합니다. 
-2085605117의 오류는 MiPlatform 자체 엔진오류코드를 의미합니다.
SYNTAX Error (line 41) : else : Invalid Keyword
위의 line오류코드는 폼의 스크립트 오류 라인수를 의미합니다.

PID실생시 ()안에 표현되는 오류코드는 무엇을 의미하나요?

PID의 output창의 line번호는 무엇을 의미하나요?

1.7.4Application의 TraceMode를 none으로 설정시 실행여부

MiPlatform tracemode none 인 경우 Simulator는 실행을 하고 MIPlatform으로 실행시 trace 안쪽 실행은 하지 않습니다. 
(즉 none으로 설정하게 되면 일반 사용자 Simulator이 아닌 MiPlatform모듈로 실행시에는 엔진로직이 실행되지 않습니다.)

Application의 TraceMode를 None으로 설정시 trace시 실행여부

1.8MDI구현시 참고사항

1.8.1MDI에서 오픈된 화면을 Ctrl + F4닫기 기능을 막고자 하는 경우

// MDI로 오픈되는 각 폼의 이벤트를 기술하여 Ctrl + F4를 막을 수 있습니다.
function person_entry_OnLoadCompleted(obj) 
{     
    this.OnUnloadCompleted = "lfn_keydown";
}
function lfn_keydown()
{
    if(GetKeyState(17))
    {
        if(GetKeyState(115)) 
        {
            return false;
        }
     }
}
각 폼마다 해당 소스를 기술해 주어야 합니다. 
(만약 공통 스크립트가 존재한다면 해당 스크립트를 응용해서 적용이 가능할 것으로 봅니다.)

MDI로 오픈되는 각 폼의 이벤트를 기술하여 Ctrl + F4를 막을 수 있나요?

1.8.2전용브라우저. IE임베드시 MDI 사용여부

마이플랫폼에서 제공하는 전용브라우저와 IE(일반브라우저)에 임베드시 사용가능여부 및 버전정보 대해 기술합니다.

전용브라우저 MDI지원 여부

마이플랫폼 310, 310L ~ 330버전까지 전용브라우저를 지원하며, SDI형태와 MDI형태 모두 사용이 가능합니다.

IE브라어저에 Embed 사용

마이플랫폼 320 이전 버전의 경우 IE에 임베드시 MDI사용에 제약이 있어 100% 기능을 사용할 수 없습니다

IE브라우저에 Embed시 MDI형태 사용이 가능한가?

1.8.3MDI에서 NewWindowEx로 띄운 폼의 Handle정보를 얻어 종료하하는 방법

현재 열려있는 모든 폼의 정보를 알 수 있습니다. ( NewWindowEx포함)
for(var i=0; i<globals.count; i++)
{
    for(var j = 0 ; j < globals[i].Allwindows.count ; j++)
    {
         trace("ID>>>" + globals[i].Allwindows[j].id);
    }
}

Handle값을 얻어 닫는 방법

//NewWindowEx로 띄운 값의 핸들정보로 닫는 경우 
var rtn  = NewWindowEx("main", "D:\\CodeSamples\\CodeSamples_KJB.xml", "","Tip1::form.xml");
globals[1].GetFormFromHandle(rtn).Close();

MDI에서 NewWindowEx로 띄운 폼의 Handle정보를 얻어 종료하하는 방법

1.8.4Open된 폼(Form)을 닫을 때 변경된 DataSet정보를 체크하는 방법

//해당 내용은 MDI형태 뿐 아니라 일반 SDK형태에서도 동일합니다. 
function Button4_OnClick(obj)
{
    IsDatasetUpdate(this);  //해당 폼에 있는 DataSet의 변경사항 체크 
}
function IsDatasetUpdate(obj)
{
    for ( var i = 0 ; i < obj.Components.Count ; i++ )
    {
        if ( obj.Components[i].GetType() == "Dataset" ) 
        {
            trace(obj.Components[i].id + "===>" + obj.Components[i].getUpdate());
            if ( obj.Components[i].getUpdate() ) return true;
        }
        if ( obj.Components[i].IsComposite() )
        {
            if ( IsDatasetUpdate(obj.Components[i]) ) return true;
        }
    }
     return false;
}

폼을 닫을때 변경된 DataSet정보를 체크하는 방법

1.8.5Parent에서 오픈된 Child폼에서 자신의 폼은 유지하고 Parent폼 종료 방법

마이플랫폼에서는 자신을 호출한 Parent 폼이 종료가 되면 Child폼은 자동으로 종료가 됩니다.
문의하신 내용처럼 Child창을 유지하고자 한다면 Parent에서 Frame(MDI의 경우)을 이용하여 Child를 호출해야 합니다.

즉 Parent에서 자신 폼이 아닌 다른 폼 항상 Open이 되어 있는 Frame폼에 함수를 만들어 Frame에서 Open/Dialog를 호출해야 하며 오픈된 폼에서는 Frame가 아닌 실제 Frame를 통해서 호출한 폼을 Close시키면 됩니다.

마이플랫폼에서는 자신을 호출한 Parent 폼이 종료가 되면 Child폼은 자동으로 종료가 됩니다.

1.8.6MDI에서 타 시스템에 있는 폼 즉 NewWindowEx를 사용시 Global 참조방법

NewWindowEx는 다른 프로젝트에 있는 폼을 호출하여 보여주고자 할 경우 사용이 가능합니다. 
(이때 한 프로젝트에서 다른 폼을 보여줄 수 있으나 Data를 공유하지 않습니다.)
즉 각각의 StartXML의 값을 참조합니다.

NewWindowEx 사용시 Global참조파일

1.8.7현재 오픈되어 있는 Frame 및 폼정보를 얻는 방법

AllWindows 를 사용하면 MDI의 Frame 및 Dialog/Popup으로 오픈된 폼정보가모두 들어옵니다.
var wObj = AllWindows();
for (var i = 0 ; i < wObj.count; i++ )
{
      trace(wObj[i].id);
      if ( wObj[i].id == "XXXXXXXXX" )  //특정 폼으로 로직 처리하고자 할때
      {
           trace(wObj[i].width);
      }
}

MDI폼에 오픈되어 있는 모든 폼정보를 얻을 수 있나요?

1.8.8MDI에서 NewWindow시 OpenStyle Titlebar=false 경우 ArrangeWindow기능 사용여부

MDI에서 기본적으로 제공되는 ArrangeWindow기능은 TitleBar가 있는 경우에만 동작합니다

MDI에서 NewWindow시 OpenStyle TitleBar=false 경우에는 MDI기능 중 ArrangeWindow은 지원안하나요?

1.9통신방식

1.9.1데이터를 압축할 것인가?

  1. 먼저 주지할 사실은 데이터 통신방식은 프로젝트 설계 단계에서 결정을 해야 하는 사항이라는 점입니다.

  2. 마이플랫폼에서 지원하는 통신방식은 크게 XML, XML->Binary Encoded, XML->Binary Encoded->ZLIB (압축), CSV(Comma Seperated Value), CSV->ZLIB(압축), FirstRow 등으로 구분할 수 있습니다.

  3. 각각의 통신방식은 적용업무와 처리 데이터의 량, 서버 프레임웍의 특징에 따라 적절히 적용해야 하는데, 일반적으로 개발 중에는 XML타입으로 처리를 하여 실제 데이터를 개발자가 확인할 수 있도록 설정하나, 실 운영환경에서는 Binary Encoded 또는 ZLIB형태로 운영을 하도록 합니다.

  4. 물론 운영시점에 무조건 압축형태로 운영을 해야 하는 것은 아닙니다.

  5. 만일 서버와 주고받을 데이터의 양이 많지 않다면 XML형태로 처리를 해도 속도에 큰 문제가 야기되지 않을 뿐만 아니라, 스트림 압축에 사용되는 자원을 절약할 수 있습니다.

  6. 실제로 XML타입으로 처리하고 있는 사이트들도 많이 존재합니다.

  7. 그러나 주고받을 데이터의 양이 많이 지거나, 혹은 그 외의 요인으로 인해 데이터처리 속도가 늦다라고 판단이 된다면 압축을 사용하는 것을 권장합니다.

  8. 또한, Binary Encoded가 된 데이터는 마이플랫폼의 고유 바이너리 알고리즘에 의해 인코딩이 되므로, 1차적인 데이터 보안의 효과를 볼 수 있습니다.

  9. 대용량 데이터-일반적으로 10만~100만 건 단위를 말한다-를 처리해야 한다면 CSV ZLIB이나 FirstRow방식을 사용하는 것을 권장합니다.

  10. CSV는 데이터를 XML로 만들어 처리하는 것이 아니고, Flat File형태로 만들어 처리하는 방식을 말합니다.

  11. CSV타입을 사용하게 되면 순수 데이터 만을 전송하게 되므로, 데이터 패킷량을 최대한으로 줄일 수 있습니다.

  12. FirstRow방식은 앞서 말한 XML, Binary Encoded XML, Compressed Binary Encoded XML타입으로 데이터를 전송하되, 한번에 전(全)데이터를 모두 전송하는 것이 아니고, 일정 데이터씩 끊어서 보내는 방식입니다.

  13. 만일 클라이언트 화면에서 전체 데이터를 한번에 디스플레이 하지 않아도 되는 경우라면 이 방식도 권장할 만 합니다.

1.9.2데이터 통신방식 종유 및 특징

종류

특징

XML

순수 XML포맷 그대로 전송.

데이터 디버깅이 쉽다.

데이터 양이 많을 경우 패킷사이즈가 크다.

Binary Encoded XML

마이플랫폼 자체 알고리즘에 의해 바이너리 인코딩 된 포맷. 일반적으로 순수 XML보다 사이즈가 작다.

1차적인 데이터 보안 효과가 있다.

Compressed Binary Encoded XML

ZLIB압축.

XML형태로 만들어진 데이터 중 가장 사이즈가 작다.

CSV

데이터를 XML로 포맷팅 하지 않고, comma로 분리하여 데이터만 담고 있는 형태. 서버에서 클라이언트로 전송할 경우에만 가능하다.

Compressed CSV

CSV의 ZLIB압축.

FirstRow

XML타입의 데이터를 특정 크기 단위로 분리해 클라이언트로 전송.

바이너리 인코딩 및 ZLIB압축 가능.

대용량 데이터 전송 시 클라이언트의 Waiting Time을 줄일 수 있다.

위의 데이터 처리전송방식은 각 시스템의 여러 가지 환경(웹서버의 처리용량, WAS의 효율,네트워크의 데이터 처리속도 등)에 달라질 수 있으므로 정답이 있는 것은 아닙니다.
또한, 설계 시점에 각 화면단위의 처리 데이터 형태를 미리 결정하여, 개발하지 않게 되면 결과적으로 시스템 오픈 시점에 개발 소스를 대폭 수정해야 하는 번거로움이 있으니 주의하시기 바랍니다.
(XML타입으로 개발 후, CSV타입으로 전환하는 경우, 또는 반대의 경우에 그렇다.)

시스템 운영자는 위의 사항을 반드시 숙지하여 가장 최선의 환경을 위해 심사숙고 해야 하겠습니다.

위의 통신방식 설정에 따라 통신속도에 많은 차이가 발생합니다.

데이터 통신방식 종류

1.9.3통신방식 참고자료

MiPlatform 또는 XPlATFORM에서 지원하는 통신 모드는 크게 xml, Binary, Binary Compress, CSV 통신 방식이 있습니다.

데이터 전송방식 선택은 운영하는 시스템의 여러가지 환경(서버성능,WAS 효율,네트웍 속도등) 에 따라 최상의 모드를 선택하는 것이 바람직하지만 일반적으로 [표1]에서 보듯이 데이터 양이 증가함에 따라 CSV , Binary, Binary Compress, XML 순으로 응답속도가 빠른 것을 알 수 있습니다



100건

1,000건

10,000건

100,000건

XML통신

Response Time

(Sec)

0.16

0.45

3.44

No Response

Packet Size

(Bites)

42,237

423,839

4,243,645

N/A

Binary 통신

Response Time

(Sec)

0.14

0.27

1.86

No Response

Packet Size

(Bites)

9,891

103,942

1,037,222

N/A

Binary

Compress통신

Response Time

(Sec)

0.13

0.29

2.07

No Response

Packet Size

(Bites)

1,054

3,458

27,757

N/A

CSV

통신

Response Time

(Sec)

0.14

0.22

1.13

10.21

Packet Size

(Bites)

6,487

70,389

714,743

7,356,730

[표1] 전송 모드별 통신 응답시간 비교

또한 [그림1]에서 보듯이 XML, BIN, Compress별 TPS, BPS를 분석한 결과 Binary 모드가 다른 것에 비하여 통신 성능이 좀더 나은 것을 확인 하실 수가 있습니다

그림 1-15http_result

[그림1] 전송 모드별 통신 효율

업무별 처리할 데이터 양이 많은 대용량 데이터 조회시에는 서버 부하로 인해 메모리 오류가 발생할 수 있으니 CSV 또는 FirstRow 방식을 사용하는 것을 권장합니다. 
 
CSV는 Tobesoft에서 제공하는 API를 사용하지 않고 자바 객체를 사용하여 전송하기 때문에 메모리 효율이 좋고 FirstRow 방식은 한번에 데이터를 모두 전송하는 것이 아니고 일정양의 데이터를 나누어 전송하기 때문에 서버 부하를 줄일수 있습니다

1.10Cache기능

1.10.1마이플랫폼으로 작성된 resource가 아닌 gif, jpg등에 대한 Cache처리방법

  1. Image 를 리소스에서 읽는 경우가 아니면 Cache가 적용되지 않습니다.

  2. Image Component에서 Image를 Loading하는 방식은 Image를 처리 해야 하기 때문에 Cache로 처리될 수 없습니다.

  3. Cache로 처리된다는 의미는 화일 내에 Session정보를 비롯한 Cache정보를 포함하고 있어야 하는 것입니다.

  4. 그러므로 실제 이미지 화일에 다른 데이타가 들어가면 정상적으로 처리가 불가능하므로 Cache처리를 하지 않습니다.

  5. 또한 현재 ActiveX의 url Loading, Flash의 movie, sign의 bkimageid, menubar의 imageid, vsreport의 PutImagePath 가 같은 방식으로 처리되며 Cache 되지 않습니다.

  6. Cache가 적용되려면 resource의 이미지를 사용하여야 합니다.

Gif, JPG Cache방법

1.10.2Cache 각 레벨별 특징

표 1-3Cache 각 레벨별 특징

Cache Level

Cache여부

화면갱신주기

웹서버 요청

None

X

매번

매번

Staic

O

최초 한번

캐쉬가 없는 경우에만

Dynamic

O

화면 수정시 한번

매번-Last modified갱신확인

Session

O

마이플랫폼 기동 후 한번

어플리케이션 기동 후 한번만 Last Modified 갱신확인

1.10.3참고사항

* CacheLevel를 설정하지 않으면 기본 Session방식으로 동작합니다. 
* 화면 AppGroup의 경우 Session을 권장합니다. 
  개발완료 초기 단계에서는 소스 수정이 자주 일어 날수 있으므로 Dynamic을 사용할 수 있으나, 
  안정화 단계에서는 Session을 사용하는 것이 가장 속도면에서 권장할 수 있습니다. 
* 데이터 즉 서비스(Service)는 none으로 설정을 하여야 합니다. 
  Res(이미지파일)의 경우 Static를 권장합니다. 
  (Static의 경우 res tag부분에 Vesion 정보를 이용하여 다운로드 하므로 반드시 파일이 변경되면 
  변경된  res파일 변경 및 StartXML의 Res의 tag 중 Version을 증가시켜 줘야 합니다.)

- 요청한 화면(폼)의 로딩 또는 data의 처리 속도를 높이기 위해서 Cache를 사용합니다,

- Cache는 요청한 서비스에 대하여 서버에서 매번 해당 파일 또는 데이터를 내려받지 않고 local에 저장된 파일을 통해 불러오기 때문에 월등히 빠른 성능이 보장됩니다


- Cache는 크게 화면을 담당하는 App 부분과 서비스를 담당하는 Data 부분이 있는데 Data 부분의 Cache는 반드시 "None"로 설정하시기 바랍니다. 만약 설정하지 않은 경우 Cache를 사용하기 때문에 한번은 서버에서 가져오다 두번째 이후 부터는 처음에 가져온 데이터가 계속 보이게 됩니다. 서버에 데이타가 변경이 되었다면 갱신 되어 반영 되지 않는 현상이 발생하게 됩니다


- 화면 Cache는 운영 환경에서 Dynamic 또는 Session를 주로 사용합니다


- 화면 변경이 자주 일어나지 않는 경우는 Session으로 그렇지 않고 자주 변경하는 경우에는 Dynamic으로 설정하시길 권장합니다. 둘 중에 어는 것을 선택하는냐에 따라서도 성능차이가 있습니다. Session,Dynamic은 해당 화면을 요청할때 Last Modified와 관련된 정보를 서버에 보내 서버에서 이 정보와 비교하여 수정된 경우에만 내려주고 그렇지 않은 경우 cache에 있는 파일을 사용하게 되는데 Session은 Applicaion이 실행후 종료될 때 까지 한번만 갱신 확인을 요청하지만 Dynamic은 매번 갱신 확인을 하기 때문입니다

1.10.4주의

1) 플래쉬파일이 있는 AppGroup는 반드시Session을 사용해야 합니다.

플래쉬파일 자체가 Cache기능을 사용하기 때문입니다.

2) VsReport가 들어있는 AppGroup또한Session을 사용해야 합니다

Cache 레별별 설명

1.11httpadaptor 다수 개 처리방법

화면 뒤에서 batch성 작업을 계속 진행하고 또 다른 조회 및 작업을 할 경우 적용할 수 있습니다.
하나의 httpadp를 사용하는 경우 back단에서 진행 중인 경우 콤보등의 리스트성 컴포넌트를 사용할 
경우 조회 시 cursor가 생겨 dropdown된 리스트가 닫힙니다.

이러한 경우 usewaitcusor=false 설정하여 사용하면 이러한 현상이 발생하지 않도록 할 수 있습니다.

1.11.1사용 예)

1) protocols에 http 프로토콜을 하나 더 추가합니다. 
2) datagroup에서 group을 하나 더 추가하고 추가한 http 프로토콜을 baseurl에서 연결해줍니다. (http1://~)
    http1 과 같이 시작해야 합니다. (예약어)
3) 추가한 http의 usewaitcusor=false로 설정하고 background에서 호출하는 transaction에 한해서 사용하도록 합니다.

콤보 dropdownlist가 폼이Redraw되면서 원치 않은 데이터가 선택됨.

1.12마이플랫폼 LogOut 처리방법

마이플랫폼의 Application을 실행중인 프로그램을 모두 닫고 초기환경 즉 Login화면으로 돌아가고자 하는 경우 처리방법을 기술합니다.

1.12.1구현방법

1단계 : PID를 실행하여 해당 Project를 오픈합니다.

2단계 : PID의 Attributes의Event 중 OnBeforeExit 이벤트에 Gfn_BeforeExit 를 기술합니다.

그림 1-1620120501_112004304_logout_1

3단계 : 설정한 Gfn_BeforeExit에 대한 이벤트를 Global Script영역에 아래와 같이 기술합니다

그림 1-1720120501_112031918_logout_2

function Gfn_BeforeExit()
{
    if(Confirm("종료 하시겠습니까?"))
    {
        for(var i=Global.windows.count;i>=0; i--)   //현재 실행준인 화면을 Close합니다.
        {
            if(Global.windows[i].id ==  replace(replace(GetTopWindow(),"[Form:",""),"]",""))
            {   
                 Global.object(Global.windows[i].id).Close();     
                 break;
            }
        }
        SetReg("OnlyOne","false"); 
        global.MenuBar.fn_excute();    
       //Form변수 실행  MenuBar라는 Form의 fn_excute()를 호출 합니다.
    } 
}

MenuBar.xml (프레임 폼)에 다음 함수를 기술합니다.

function fn_excute()
{
    var  path = AliasToRealPath("%tobe%") + "MiPlatform320U//MiPlatform320U.exe";
    execProc(path,"-k '재 실행할 Key값'");// Key값 확인 
}

LogOut 처리 후 마이플랫폼 Application을 한번만 실행하고자 한다면 다음의 작업이 반드시 추가되어야 합니다.


Login화면의 OnLoadComplated 이벤트에 다음의 스크립트를 추가합니다.

setReg(“OnlyOne”,true);

EnableOnlyOne(“실행 Key값); // 반드시 추가되어야 합니다.

로그아웃(LogOut)방법

LogOut버튼 클릭시 전체 mdi폼 닫기

마이플랫폼 LogOut처리 방법

1.13Application onlyOne 사용시 두 번째 실행시 값 전달방법(이벤트 발생)

사용 예)
프로젝트에 OnDetectLaunchingBrowser이벤트를 기술하시어 처리하실 수 있습니다. 
(global script에 추가한 함수를 기술합니다.)
function gfn_OnDetectLaunchingBrowser() 
{ 
     // index 페이지에서 MiInstaller.GlobalVal = "1234"; 
     //   같이 관련정보를 넘겨 받습니다. 
     alert("gfn_OnDetectLaunchingBrowser: " +GetReg("GlobalVal")); 
}

배포 onlyone 적용시 구분방법 (메시지 전달방법)

1.14마이플랫폼 바로가기 아이콘 추가방법

MiPlatform을 개발하여 일반 사용자에게 배포하는 경우 바로가기 아이콘(실행파일)을 제공할 수 있습니다. 
이때 해당 아이콘을 바탕화면과 , 윈도우 프로그램목록에 표현하는 방법에 대해 기술합니다.

1.14.1MakeShortCut 만들기

MiPlatform을 개발하여 일반 사용자에게 배포하는 경우 바로가기 아이콘(실행파일)을 제공할 수 있습니다.

1.14.2바탕화면 표현방법

MiInstaller.MakeShortCut("%system%MiUpdater321.exe",strCommand,"baek","%Component%icon_next.ico",""desktop");  
디폴트 바탕화면에 표현된 결과입니다.

그림 1-1820120430_170201832_MakeShortCut_1

1.14.3윈도우 프로그램 목록에 표현방법

MiInstaller.MakeShortCut("%system%MiUpdater321.exe",strCommand,"baek","%Component%icon_next.ico","startMenu");

그림 1-1920120430_170221569_MakeShortCut_2

MakeShortCut메소드는 MiUpdator에서 제공되는 기능입니다.

MakeShortCut을 바탕화면과 프로그램 목록에 표현할 수 있나요?

1.15기타(참고사항)

1.15.1부동소수점 오차처리

개요

현재 사용되는 거의 모든 CPU에서는 부동소숫점 자료형을 표현하는데에 있어서 메모리에서 차지하는 크기를 제한을 두고 있습니다.

제한의 이유는 상대적으로 작은숫자를 자주 사용하지 않으며, 또한 높은 처리속도와 CPU 설계상 용이함을 위해서 고정크기가 필요하기때문입니다.

이 제한의 결과로서 특정 소수들이 이진수로 표현할때 무한소수로 나타나면 모두 저장할수 없어 그 표현이 제한되어 오차를 가지는 근사값으로 표현됩니다.

이는 1/3 이 10진수로 0.3333.... 과 같이 10진수로는 모두 표현못하는 것과 같이, 0.1이 2진수로 0001100110011100110011..... 으로 무한 반복하기 때문입니다.

정밀도/해상도

부동소숫점이 가지는 표현의 제약때문에 정밀도 또는 해상도라는 표현으로 그 제한을 나타내게 됩니다.
정밀도가 15자리라 하면 소숫점 이하 15자리까지만 표현을 한다는 의미가 됩니다.

마이플랫폼은 내부적으로 15자리의 정밀도를 가지며, 연산결과에 대해 정밀도를 처리하는 함수를 제공하고 있습니다.

부동소수점 연산

부동소수점으로 연산으로 할때에는 반드시 정밀도에 대한 처리가 필요합니다.

사칙연산 : 연산 결과는 CPU의 처리결과에 따릅니다. 소수에 따라서 오차가 포함될수 있습니다. 가감시에도 결과가 0에 가까울 경우 정밀도 처리가 필요합니다.

비교연산 : 비교연산시 정밀도를 12자리로 사용하여 처리하고 있습니다. 즉, 두 수를 차감하여 그 결과오차가 12자리 이하일때에는 동일한 값으로 처리됩니다.

오차처리

오차처리를 위하여 Truncate나 Round를 사용하는 것이 일반적인 프로그래밍 개발툴에서 사용하는 방식입니다. (VB,VC등)

마이플랫폼에서는 Truncate,Rount,NumFormat등에서 정밀도를 제공하여 부동소수점의 오차를 처리하도록 하고 있습니다.

일반적으로 오차처리를 위한 정밀도는 공학용으로 8-12 정도, 회계용으로 4-8 정도를 사용합니다.각 함수의 사용법은 다음과 같습니다.
Truncate( real, detail ) : 입력된 real 실수의 detail 이하의 소수점을 모두 버린수를 구합니다.
Round( real, detail ) : 입력된 real 실수의 detail 자리수에서 반올림한 수를 구합니다.
NumFormat( real, detail ) : 입력된 real 실수를 detail 자리까지 표현하고, 소숫점 이상 3자리수마다 ',' 가 표시된 문자열로 구합니다.

오차처리 예

if( (20 / 100 * 96) == 19.2 ) --> if( truncate( (20 / 100 * 96), 8 ) == 19.2 ) 
// 사칙연산의 결과를 해상도 8로 처리하여 비교시킴.
// 비교시 두수를 차감하여 해상도 12이하의 오차일때에는 동일한 값으로 자체 처리됨.
trace( 1.333+1.225-1.333-1.225 ) --> -2.22044604925031E-16 // 가감연산의 결과가 0에 가까울경우 오차값이 표현됩니다.
trace( 1.333-1.225-1.333+1.225 ); --> 0 // 연산순서에 따라서는 오차가 나타나지 않을수 있습니다.
trace( round(1.333+1.225-1.333-1.225, 4) ) --> 0 // 따라서 부동소수점을 사용하는 연산은 반드시 오차처리가 필요합니다.
grid.cell.subsumexpr --> NumFormat( subsum expr string, 12 ) // Grid의 Display가 Number 일때에 내부적으로 해상도처리를 하지 않고 원래 숫자가 출력됩니다.
// SubSum에 사용된 숫자가 실수형일 경우 해상도 처리를 해주어야 합니다.
grid.cell.display --> Currency // Grid의 Display를 Currency로 사용하면 4의 해상도를 가진 Currency Format으로 출력됩니다.

부동소수점 처리방법

1.15.2마이플랫폼에서 연산(계산)시 참고사항

마이플랫폼에서 제공하는 나머지 연산은 INT형만 지원됩니다.
나머지 연산은 정수연산으로써 두 값을 모두 정수형으로 변환한 후에 연산을 수행합니다. 
 
MiPlatform Engine 내부에서 정수는 -2^31에서 2^31-1까지 (-2,147,483,648 ~ 2,147,483,647) 
유효한 범위입니다. 

이를 벗어난 정수연산은 올바른 연산을 지원하지 않습니다.

숫자가 클때 나머지 연산시 문제가 있습니다

1.15.3String 데이타의 Codepage 변환방법

TextToBin을 이용하면 codepage 지정이 가능하며 변경한 binary데이타를 binToText를 이용하여 다시 원하는 codepage의 String으로 변경할 수 있습니다.

BinToText / TextToBin

//사용 예)
var aa = TextToBin("투비", "utf-8");
var bb = binToText(aa, "utf-8");
alert(bb);

String형 변수를 특정 Encoding로 변환하는 방법

1.15.42차원배열 선인 및 사용방법

MiPlatform에서 제공하는 DataSet자체가 2차원 배열를 제공하기 때문에 별도의 스크립트를 구현하지 않고 사용이 가능하나 스크립트를 이용하여 작성을 하고자 한다면 아래 사용방법을 참고하세요
//DataSet 데이터를 Array에 담아 다시 DataSet에 세팅하는 샘플
var CntRow, CntCol;
CntCol = Dataset0.ColCount();
CntRow = Dataset0.RowCount();
var ArrCol = Array(tonumber(CntCol));
var ArrRow = Array(tonumber(CntRow));
for (i = 0; i < CntRow; i++)
{
   for (j = 0; j < CntCol; j++)
   {
         ArrCol[j] = Dataset0.GetColumn(i, Dataset0.GetColID(j));
   }
   ArrRow[i] = ArrCol;
}
var nCnt, nRCnt, RowData;
nCnt = ArrRow.Length();
Dataset1.ClearData()
for (i=nCnt-1; i >= 0; i--)
{
   nRCnt = ArrRow[i].Length();
   RowData = ArrRow[i];
   Dataset1.AddRow();
   for (j=nRCnt-1; j >= 0; j--)
   {
         Dataset1.SetColumn(Dataset1.Row, Dataset1.GetColID(j), RowData[j]);
   }
}

2차원배열 사용방법

1.15.5MiPlatform에서 지원하는 이미지 포멧

MiPlatform에서 BMP, JPEG, GIF등을 지원합니다.

Tif, png 포멧은 지원하지 않습니다

MiPlatform에서 BMP, JPEG, GIF등 지원하는 포멧이 어떻게 되나요?

1.15.6MiPlatform ErrorCode 10진수 변환방법

MiPlatform의 개발 및 운영하다보면 0x83B01200와 같은 에러코드 즉 MiPlatform Admin Guide 하단에 정리된 에러코드를 10진수로 변환하는 방법에 대해 기술합니다.

변환방법

MiPlatform Admin Guide 하단에 정리된 에러코드를 10진수로 변환하는 방법입니다.
먼저 윈도우 계산기를 실행하여 보기 메뉴에서 일반용 -> 공학용으로 전환한다.
공학용 계산기가 실행되면 좌측 Hex를 선택한다.
100000000 에서 해당 에러 코드값을 뺀다.
Dec를 선택하여 10진수 변환.
결과 값에 -기호를 붙인 값이 MiPlatform Script에서 비교 할 수 있는 에러코드입니다.

예를 들어 Admin Guide상에 에러 코드가 0x83B01200 이고 에러 메시지가 “%s Protocol Adaptor 에서 에러가 발생했습니다.” 인 에러의 10진수 에러코드를 구하려면...

1. 윈도우 계산기를 Hex로 선택(radio박스 Hex 선택)
2. 100000000 - 83B01200 (윈도우 계산기 붙여넣기 지원됨)
3. Dec로 변환(radio박스 Dec 선택)
4. 결과값에 음수를 붙임.

참고사항 : 윈도우 계산기 기능 중 공학용으로 사용하시면 쉽게 작업이 가능합니다

마이플랫폼 오류코드를 10진수로 표현할 수 있나요?

1.15.7일반 사용자 PC에서 마이플랫폼을 사용하기 위해 Admin권한이 필요한 이유

MiPlatform으로 개발된 프로그램을 사용하기 위해서는 실사용자PC의 계정권한이 Admin권한이 필요합니다.

권한이 필요한 이유는 아래 내용을 참고하세요

MiPlatform을 사용하기 위한 설치모듈

MiPlatform InstallBase320(x)

MiPlatform_InstallBase 320.cab의 내용은 실질적으로 MicroSoft사가 제공하는 MFC(Microsft Foundation Calss)과 ATL(Active Tmplate Library) 입니다. 

MiPlatform의 동작시키기 위해서는 이 라이브러리가 필수적이며 이 라이브러리의 설치에는 Admin권한이 필요합니다. 
(해당 모듈은 저희 제품 이외에도 Window 자동업데이트를 통해서도 설치가 될 수 있으나, 기본적으로 설치되는 모듈이 아니므로, 반드시 배포가 필요합니다.)

MiPlatform_Engine 320(x).msi

MiPlatform 실제 동작에 필요한 엔진모듈로 설치 후 레지스트리 정보에 ActiveX를 등록하는 과정이 필요합니다

MiUpdater320(x)

MiPlatform 엔진 및 배포모듈을 관리하기 위해 설치되는 모듈로 사용자PC의 System폴더 복사 및 레지스트리 정보를 등록하는 과정이 필요합니다.

위와 같이 MiPlatform을 사용하기 위해서는 반드시 Admin 권한이 필요합니다

1.15.8마이플랫폼을 이용한 웹접근성 구현여부

MiPlatform에서 기본적으로 웹접근성을 지원하지 않습니다.

구현가능한 사항

멀티브라우저(Multi) 가능
스크립트 구현을 통한 화면사이즈 변경

참고사항

웹접근성을 구현하기 위해서는 MiPlatform 제품이 아닌 XPLATFORM제품 검토를 하시기 바랍니다.

MiPlatform을 이용하여 웹접근성 구현이 가능한가요?

1.16보안관련사항

1.16.1보안취약점 지적사항 및 조치방법

MiPlatform에서 ActiveX(MiPlatformX, MiPlatformMX) 사용시 문제 및 처리버전

지적내용

수정내용

적용버전

보안취약점 관련 자료

1.16.2MiPlatform에서 제공하는 업데이터(Updater) 종류 및 버전별 차이

표 1-4버전별 차이

버전

간략설명

비고

31x

320 기본 업데이터 기능과 동일


320

가장 기본적인 업데이터 기능

보안문제 발견 execute 명령어 실행가능 (320버전까지만 제공)

321

320버전에 execute명령어 실행기능 제거

보안문제 발견 UpdateUrl를 외부 Url 연결가능

(악용될 수 있으므로 Domain 주소와 UpdateUrl 정보 주소가 동일한 경우에만 정상으로 인식하도록 지적)

MiInstaller.MakeShortCut("%system%MiUpdater321.exe", 중략..)

실행파일명 보이지 않토록 변경요청 ->MU

예) MiInstaller.MakeShortCut("MU", 중략 …)

322

320, 321 문제사항을 모두 반영한 버전


331

321버전과 동일


332

322버전과 동일


참고사항

MiUpdater320 : 가장 기본으로 나온 파일이며 base가 되나 각 보안상의 문제로 다음 버전이 나왔습니다.

MiUpdater321 : 320의 업데이터 내부에 execute라는 함수가 있어 해당 함수를 이용하여 사용자의 PC 로컬에 있는 파일을 실행 시킬 수 있는 결점을 보완한 버전입니다.
Ex) Mipupdater321.execute(filePath) : 파일이 실행 되어 버림
MiUpdater322 : MiUpdater321의 결점을 보완하였습니다. 
결점은 Updater를 사용하여 updaterurl이나 Domain의 url을 다른 사이트의 url로 입력하여 사용할 수 있으며 해킹 사이트로 연결시 문제가 될 수 있는 소지가 있습니다. 
MiInstlr ActiveX 웹 페이지의 URL 경로의 Domain 값이 UpdateURL의 Domain값과 같아야 합니다.

Updater를 이용하여 다른 서버의 파일을 악의적으로 다운로드 및 실행할 수 있으며,

단축아이콘을 통한 다른 프로그램 실행도 가능하도록 되어 있습니다.


이러한 보안 취약점을 해결 하기 위해서는 322 또는 332 버전의 Updater를 사용하여야 합니다.


  • 322 또는 332 버전 Updater의 주용 특징

- 다운로드 되는 파일의 url과 Domain의 경로가 실제 Updater가 구동되는 경로와 동일한 경우에만 정상 동작 됨.

- 다운로드 파일의 실행기능 없음.

- 단축 아이콘으로 MiPlatform 또는 MiUpdater만 구동 가능

보안취약관 관련 자료

1.16.3SQL Injection

웹 클라이언트의 반환 메시지를 이용하여 불법 인증 및 정보를 유출하는 공격. 
웹 응용 프로그램에 강제로 구조화 조회 언어(SQL) 구문을 삽입하여 내부 데이터베이스(DB)  
데이터를 유출 및 변조하고 하는 방법으로 이 공격은 MS SQL 서버뿐만 아니라 모든 관계형 데이터베이스 관리 시스템(RDBMS)에서 가능하다.

MiPlatform 사용시 SQL Injection 처리구간

MiPlatform을 사용시 클라이언트에서 입력한 정보를 서버로 보낸 후 서버단의 서비스에서 전달받은 값에 대한 유무를 체크하도록 구현이 필요합니다.

MiPlatform에서 전달받은 값을 확인하는 방법

MiPlatform에서 POST, GET방식으로 전달된 정보는  getVariableList를 통해 값을 확인할 수 있습니다.
platformRequest.receiveData();
PlatformData inPD = platformRequest.getData();
VariableList inVariableList = inPD.getVariableList();
for(int i = 0; i < inVariableList.size(); i++) 
{ 
    System.out.println(i + "==" + inVariableList.get(i).getName() + ":" + inVariableList.getString(i)); 
}
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page language="java"%><%@ 
page import="com.tobesoft.xplatform.tx.*" %><%@ 
page import="com.tobesoft.xplatform.data.*" %><%@ 
page import="com.tobesoft.xplatform.data.datatype.*" %><%
    String strCharset = "euc-kr";
    /*********************************************************
     * request로 들어온 내용을 parsing하여
     * input variable list, input dataset list에 저장한다.
     * (MiPlatform 에서 보내온 데이터를 parsing한다.)
     *********************************************************/
    PlatformRequest platformRequest = new PlatformRequest(request.getInputStream(),   
               PlatformType.CONTENT_TYPE_XML, strCharset);
    platformRequest.receiveData();
    PlatformData inPD = platformRequest.getData();
    VariableList    inVariableList  = inPD.getVariableList();
    for(int i = 0; i < inVariableList.size(); i++) 
    {                 
           System.out.println(i + "==" + inVariableList.get(i).getName() + ":" + inVariableList.getString(i));      
    }
    DataSetList     inDataSetList   = inPD.getDataSetList();
    String strUserID   = inVariableList.getString("userid");
    String strUserName = inVariableList.getString("username");
    /*********************************************************
     * response로 보낼 내용을 생성한다.
     * output variable list, output dataset list에 저장한다.
     * (MiPlatform 이 받을 수 있는 데이터 형태로 가공)
     *********************************************************/
    PlatformResponse platformResponse = new PlatformResponse(response.getOutputStream(), 
           PlatformType.CONTENT_TYPE_XML, strCharset);
    PlatformData outPD = platformRequest.getData();
    VariableList    outVariableList  = new VariableList();
    DataSetList     outDataSetList   = new DataSetList();
    //System.out.println("5초 대기 시작");
    //Thread.sleep(5000);
    //System.out.println("5초 대기 끝");
    try {
        // MiPlatform 으로 전송할 Output Dataset 을 생성한다.
        DataSet outDataSet = new DataSet("output");
        // Output Dataset 컬럼 정의
        outDataSet.addColumn("IDX",        DataTypes.STRING, 5);
        outDataSet.addColumn("ObjectName",        DataTypes.STRING, 100);
        outDataSet.addColumn("ObjectID",   DataTypes.STRING, 200);
        outDataSet.addColumn("TestType",     DataTypes.STRING, 8);
        outDataSet.addColumn("TestObject",     DataTypes.STRING, 10);
        outDataSet.addColumn("TestValue",     DataTypes.STRING, 8);
        outDataSet.addColumn("ResultValue",     DataTypes.STRING, 10);
        int nRow;     
        for(int i = 0; i < 10; i++) {
            // Output Dataset 로우 추가
            nRow = outDataSet.newRow();
            // Output Dataset 에 조회 결과 값 세팅
            outDataSet.set(nRow, "IDX",      20);
            outDataSet.set(nRow, "ObjectName",      "NAME"+i);
            outDataSet.set(nRow, "ObjectID", "CODE_DESC"+i);
            outDataSet.set(nRow, "TestType",   "20081024");
            outDataSet.set(nRow, "TestObject",   strUserID);
            outDataSet.set(nRow, "TestValue",   "20081024");
            outDataSet.set(nRow, "ResultValue",   strUserID);
        }
 
        // Output Dataset 을 Output Dataset List 에 담는다.
        outDataSetList.add(outDataSet);
        // Output Vairable 을 세팅한다.
        outVariableList.add("ErrorCode", 0);
        outVariableList.add("ErrorMsg",  "조회 성공");
        outVariableList.add("strOutputData", "※ Output Vairable을 받으려면, 화면의 전역변수로 선언하면 됩니다.");
    } catch(Exception e) {
        // Output Vairable 을 세팅한다.
        outVariableList.add("ErrorCode", -1);
        outVariableList.add("ErrorMsg",  e.toString());
    } finally {
        // 조회 결과(Output Dataset List, Output Variable List)를 MiPlatform 으로 전송
        outPD.setDataSetList(outDataSetList);
        outPD.setVariableList(outVariableList);
        platformResponse.setData(outPD);
        platformResponse.sendData();
    }
%>

1.16.4정보 및 데이터 보안성

MiPlatform은 X-Internet 솔루션 특성 상 전용브라우저를 활용하여 운용하는 형태로서 
기본적으로 일반 인터넷익스프로러 기반의 웹 어플리케이션 대비 효과적인 화면보안을 제공하며, 
데이터 통신보안을 위한 Https 지원과 통신 데이터의 Binary,압축을 통해 별도의 보안모듈 없이도 
일차적인 보안을 지원하는 장점을 제공하며 필요 시 상용보안모듈과 연동하여 보안처리에 
만전을 기합니다.

MiPlatform의 보안 측면의 장점

표 1-5MiPlatform의 보안 측면의 장점

구분

지원방안

비고

화면 및 화면소스 보안

기본적으로 화면상의 소스 보기 원천차단

필요 시 화면소스 Compile처리를 통해 소스 해독 차단

MiPlatform

자체 기능

통신 데이타보안

Https 통신 지원

통신데이타의 Binary화 또는 압축처리 통한 기본적인 보안처리

MiPlatform

자체 기능

권한관리 통한 접근 보안

상용 보안모듈의 OCX, DLL과 연동 처리한 보안모듈 Adapter

( 다양한 상용 보안모듈 적용 시례 보유 )

상용보안

모듈 연동

WEB/WAS의 접근보안 및 권한관리 등과 연동을 통하여

보안처리를 지원( X-Internet 솔루션은 서버 보안과 무관함)

Web/WAS

기능 연동

상용보안모듈과의 연동 방안

그림 1-2020120622_131515561_protocalmanager

MiPlatform은 보안업체에서 제공되는 ActiveX 또는 DLL모듈을  MiPlatform에서 제공하는 SDK를 이용하여 보안통신 Adaptor로 Wrapping 하여 
개발자가 쉽게 개발할 수 있는 환경을 제공합니다. 

이에 따라 필요한 보안 모듈과의 연동을 통한 접근 및 통신보안에 만전을 기할 수 있습니다.

마이플랫폼 보안방법

1.16.5기타 보안관련 고려사항

구동 시 사용자 정보 노출 (권장사항)

MiPlatform 또는 XPLATFORM을 전용브라우즈 또는 Embed 상태로 구동 시 포탈 페이지등을 연계한 Global변수로 값을 전달하는 방법을 사용할 경우 사용자 정보(ID 및 Password등)을 넘기게 되는 경우 HTML 소스 보기등을 사용할 경우 해당 사용자 정보가 누출 됩니다. 
 
이는 제품이 아닌 구현 상의 문제로 세션변수를 사용하거나 솔루션등을 이용하여 취약점에 대비하여야 합니다.
사용 예)
MiInstaller.GlobalVal = “USER01^PASSWORD1^DEPT01^사번1234”;
XPLauncher.globalvalue   = "gv_userID:USER01,gv_passWd:PASSWORD01”;

대안

//구동 페이지
<%
session.setAttribute(“USERID”,”USER01”);
String sid = session.getId().toString();
%>
MiInstaller.GlobalVal = “<%=sid%>”;
//MiPlatform 소스 
var sid = GetReg(“GlobalVal”);
JSESSIONID = sid;
//서비스
String uid = session.getAttribute(“USERID”);
// ui에서 USERID넘길 경우 세션값 비교 체크

메모리상의 사용자 권한 정보 노출

메모리상의 정보는 쉽게 노출 될 수 없는 부분이지만, 이 또한 별도의 툴을 사용하면 획득 가능한 위험이 있습니다. 실제 코드상으로는 값이 노출 되지 않으나 사용자 접속 비밀번호 등을 메모리상에 계속 보관 하는 등의 작업을 가급적 배제 하셔야 합니다.
사용 예)
GV_PASSWORD = Dataset01.getColumn(0,”PW”);

서비스 요청 시 조작 가능한 식별자 사용

사용 예)
Transaction(“a”,”srv::service?grade=123”,””,””,”””CallBack”);// Get

var arg = “grade=’123’”;
Transaction(“a”,”srv::service”,””,””,arg,”CallBack”); // POST – 가급적 권한 정보등은 Param으로 넘기지 않음

레포트등 호출 시 조작 가능한 식별자 사용

레포등등 외부 모듈을 사용할 경우 레포등등에서 자체적으로 서비스를 호출 할 경우 파라메터등을 이용하여 사용할 경우 보안 취약점이 생길 수 있습니다.
사용 예)
Var rpturl = “http://aaa.com/aa.rpt?uid=111&data=234”;

서비스 요청/결과 값 위변조

POST 데이터를 요청 하더라도 로컬 프락시 프로그램등을 이용하여 악의적으로 데이터를 변조 할 가능성이 있습니다. 

이를 위하여 다음과 같은 보안 적용을 권장 합니다.
- 데이터 통신 방식은 바이너리+압축 방식을 고려 합니다.
   (대량데이타의 경우 압축방식은 성능측면으로 보았을 때 비효율적일 수 있습니다)
- 압축 통신 방식은 1차 보안 처리는 가능 하지만 암호화가 아닙니다. 따라서 솔루션을 사용한 네트워크 구간 암호화 작업을 사용하거나 SSL(https) 방식을 사용하도록 권장 합니다.
   (네트워크 구간 암호화 또한 성능에 영향을 주므로 적절한 표준 구현이 필요합니다)
사용 예)
Transaction(“aa”,”https://aaa.com/”

화면 스크립트 위변조

MiPlatform,XPLATFORM의 화면 소스의 경우 Static한 이미지 정보로 웹서버에서 처리가 됩니다. 소스의 경우 데이터 정보를 담고 있지는 않지만 UI 스크립트상에서 분기등을 사용하여 권한 정보를 변경 가능한 소스가 있는 경우 보안 취약점에 노출되게 됩니다.

이를 대처하기 위한 대안은 다음과 같습니다.
- 권한등 처리는 가급적 서비스에서 처리 하여 결과를 UI에서 담도록 한다.
- 화면 소스를 Compiled XML로 변환 한다.
사용 예)
sGrage = “001”; // 위변조
If(sGrade == “001”) OpenForm(“관리자xml”);
else If(sGrade == “002”) OpenForm(“사용자xml”);

세션체크

UI 소스를 획득 한 상태에서 임의의 화면을 열고 조회 및 저장이 가능하다면 보안 취약점에 노출됩니다. 로그인한 사용자 정보를 세션 처리하고 서비스 호출 시 이에 대한 권한 정보를 체크하도록 합니다.
사용 예)
UI
function gn_callService(..)
arg += arg + “ USERID=ID001“;
..
transaction(… arg..):
서비스
세션값과 서비스로 넘긴 ID가 동일한 지 체크 후 아닌 경우 오류 RETURN

화면 권한 위변조

// 모든 form 전역변수 선언
var cv_project_filename = “ABCD”;  // Filename이 ABCD.xfdl일 경우
function fn_onload(obj, e)
{
   gfn_commonLoad(obj,e);
}
Function gfn_commonLoad(obj,e)
{
// 방법 1. XPLATFORM인 경우 e.url과 변수 명 비교하여 처리.
// 방법 2. 메인화면에 오픈 정보를 두고 변수값과 비교
// 방법 3. 서비스 호출하여 화면 권한 정보 체크 (화면별 권한 테이블 필요)
// 방법 4. URL Link되는 경우 this.url과 비교하여 체크
}

FTP (MiPlatform)

MiPlatform 은 기본적으로 FTP Component를 지원 합니다. 해당 모듈은 MS에서 재공하는 WININET 기본 모듈을 사용하기에 속도 및 기능등에 여러 제약 사항이 있습니다. 이와는 별개로 FTP 자체를 사용할 때 접속 정보가 노출 될 수 있기 때문에 환경 적인 보안 처리가 안전하지 않는 경우 사용을 권장하지 않습니다.

파일 업로드/다운로드 보안 적용

1.17마이플랫폼 확장 모듈 개발을 위한 툴 설정

1.17.1개발 환경

Visual Studio 2005 / Visual Studio 2005 Service Pack 1 설치
MiPlatform 3.2(3.3) for Developer 설치

1.17.2MS Visual Studio 2005 MFC 버전 확인

설치된 Visual Studio 2005 에서 MFC 확인 방법
설치된 경로에서 MFC 버전 확인
  Ex) C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86 경로에서 MFC 버전 확인
 빌드 된 모듈은 해당 폴더의 MFC 버전에 대한 의존성을 가집니다

그림 1-21mv1

Microsoft.VC80.CRT

그림 1-22mv2

Microsoft.VC80.MFC

1.17.3마이플랫폼의 MFC 버전 의존성(MP 320 기준)

"Microsoft.VC80.CRT" version="8.0.50727.762"
"Microsoft.VC80.CRT" version="8.0.50727.762"
마이플랫폼은 version="8.0.50727.762" 의 MFC 버전으로 빌드 되었습니다.

확장 모듈 또는 신규 모듈(*.dll, *.exe, *.ocx 등)이 MFC 상위 버전을 사용하게 된다면 별도의 Microsoft Visual C++ 2005 Redistributable을 필요하게 됩니다. 가급적 "8.0.50727.762"으로 개발 환경을 맞추고 개발한다면 추가로 배포하는 것을 방지 할 수 있습니다.

1.17.4Build 된 모듈의 MFC 버전 의존성 확인

Visaul C++ 개발툴 에서 확인 하기

간단하게 VC 개발툴에서 리소스를 확인하여 판단
Ex) 파일을 Visual C++에서 열어서 확인

그림 1-23mv3

IDE에서 확인한 리소스

그림 1-24mv4

모듈에서 MFC 확인

1.17.5기타

PEView 에서 확인하기

마이크로 소프트에서 *.dll, *.exe, *.ocx 등 기타 실행 가능한 파일에서 특정한 포켓 형식의 format 형태를 가지고 있습니다.
이를 통하여 MFC 버전을 확인 할 수 있습니다.
- 자세한 내용한 Microsfot 사이트를 참고 하십시오
- 여기서는 MFC 버전 확인 하는 간단한 방법만을 소개합니다

PEView 다운로드

http://www.magma.ca/~wjr/
PEView를 실행하고, 대상 파일을 Open 합니다
SECTION .rsrc 에서 MANIFEST 부분을 확인하시면 됩니다.

그림 1-25mv5

PEView에서 MFC 버전 확인하기

1.18도메인 변경시 체크사항

1.18.1StartXML의 서버경로 확인

StartXML은 MiPlatform이 구동되기 위한 환경정보가 설정되어 있으며 AppGroup 및 DataGroup 그리고 Res파일에 대해 웹경로를 기술합니다. 

이곳의 URL경로를 확인하여 변경이 필요합니다. 
(만약 상대경로를 사용한 경우라면 기술되어 있지 않을 수 있습니다.)
예) 
<AppGroups> 
  <AppGroup Version="1.0" Type="Form" Prefix="Basic" Language="0" 
        CodePage="euc-kr"> 
       <script ScriptUrl="./Basic/" Ext="xml" Baseurl="./Basic/"/> 
  </AppGroup>
  <AppGroup Version="1.0" Type="Form" Prefix="Main" Language="0" 
    CodePage="euc-kr" CacheLevel="dynamic"> 
    <script CacheLevel="dynamic" ScriptUrl="./Main/" Ext="xml" Baseurl="./Main/"/>
    <Resource Ext="res" Url="./Images/Main.res"/>
  <DataGroup Version="1000" Type="ASP" Prefix="dbsrv_cs" Language="0" 
      CodePage="utf-8" CacheLevel="none" 
      Baseurl="http://www.miplatform.co.kr/xx/ " 
      TrMethod="normal" Streamver="4000"/>
</AppGroup>

1.18.2배포페이지 확인

Install.html (고객사마다 다름)과 같이 배포페이지 소스 중 도메인정보가 포함된 소스부분에 대한 확인이 필요합니다.

UpdateURL정보

MiInstaller.UpdateURL = "http://www.miplatform.co.kr/320U/update_next_cfg.asp?mode=" ;
Update_next_cfg.asp파일 안에는 여러 개의 xml(asp)등이 포함되어 있으니 확인 필요

아이콘 생성 경로

MiInstaller.MakeShortCut (바탕화면 아이콘) 생성시 도메인 정보가 포함되어 있는지 확인이 필요합니다.

1.18.3서비스 API 체크

서비스 API의 경우에는 도메인 정보가 변경된다고 하여 수정사항은 없습니다.

1.18.4기타

소스 상에서 도메인을 기술하여 서비스를 호출하는 경우 
(이 경우는 극히 드물지만 개발자 분들에게 확인을 해 볼필요는 있어 보입니다.)
예) transaction(‘select’,’http://www.miplatform.co.kr/aa/a.asp”,””,…………..

1.19폰트 배포시 주의사항

고객사 개발시 MS에서 기본적으로 제공되는 폰트 이외에 맑은고딕과 같은 기본적으로 배포되지 
않는(OS에 따라 다를 수 있음) 폰트를 고객사 홈페이지를 통해 배포하는 것은 라이센스에 위배 됩니다.
기본 폰트 이외에 MS에서 제공되는 폰트에 대해서는 다음과 같이 배포가 되어야 한다고 하니 
참고하시기 바랍니다.

안녕하십니까,

마이크로소프트 고객지원센터입니다.

마이크로소프트 다운로드 센터에서 다운로드가 가능한 프로그램의 경우 다운로드 받은 후 해당 프로그램을 직접 배포하는 것은

가능하지 않고, 링크를 개제 후 일반 고객들이 해당 링크를 클릭하여 마이크로소프트 사이트를 통해서 다운로드 받을 수 있도록 사이트 링크를 개제하는 것만 가능합니다.

기타 바코드 출력등을 위해 상용 font등을 사용시 해당 업체에 배포에 대한 라이센스 정책을

반드시 확인 후 사용하시기 바랍니다.

마이플랫폼에서 업데이터를 통해 font 배포는 가능할 수 있으나, 바로 적용이 되지 않고

OS(PC)를 재부팅 후 적용이 되는데 이 부분은 OS에서 적용되는 문제이며, 마이플랫폼에서는

단지 window%fonts에 복사만 진행합니다.

1.20Alert, Confirm(메시지 창)

MiPlatform을 이용하여 Alert, Confirm 보여주는 경우 폰트를 변경하고자 하는 경우 참고사항입니다.

MiPlatform은 기본적으로 Application Project Magager의 Font에서 설정된 폰트를 이용하여 
기본적으로 표현이 됩니다. 
그러나 메시지 창에서 사용하는 폰트는 Window OS에서 설정된 폰트정보를 따릅니다.

그림 1-26message

MiPlatform에서 사용하는 Alert창의 폰트는 어떻게 바꾸나요?

1.21MiPlatform 실행 요구 사항

1.21.1OS

Windows 98 SE 또는 Windows ME ( Internet Explorer 5.5이상 설치되어 있어야함)
Windows 2000이상 Windows Xp, Windows 2003, Windows VISTA.

1.21.2CPU

Pentium MMX이상 호환.

1.21.3Memory

128MB이상.(개발자용은 256MB이상이 필요합니다.)

※ MiPlatform 3.3은 Windows 2000이상에서 사용할 것을 권장합니다.

※ 단, 개발자용인 PID, BSB, MiSimulator는 Windows 2000이상만 지원 됩니다.

(Windows 98/ ME불가.)

※ 다국어를 지원하는 UNICODE버전은 Windows 98/ME에서 사용이 불가능합니다.