IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
한국 developerWorks   >   Open developerWorks  > developerworks

XML on HTTP, Part 2: XML 문서의 대용량 처리 기법(1)



김성래김성래 Jason.kim@3ksoftware.com

3Ksoft XML 관련 미들웨어 컨설턴트로 일하고 있으며 XML IDC라는 블로그를 운영 중이다.


난이도 : 초급
2008년 5월 6일


[오픈 디벨로퍼웍스]는 여러분이 직접 필자로 참가하는 코너입니다. 이번 연재에서는 XML 문서 대용량 처리 기법에 대해 알아봅니다.

 

가상의 ‘3K 은행 ' 에서 고객이 웹 또는 모바일 장치 (PDA, 휴대전화 등 ) 를 통해 자금이체 처리를 하는 상황을 가정해 보자 . 고객은 다음과 같은 ‘ 자금이체 정보입력 ' 이라는 웹 폼을 통해 데이터를 입력한다 . 물론 ‘ 자금이체 정보입력 ' 폼은 3K 은행에서 인터넷 뱅킹을 위해 개발한 웹 폼이다 . 이 글에서 소개하는 개발 방법론이 일반적인 정보시스템 개발 방법론과 다른 점은 이 ‘ 자금이체 정보입력 ' 폼에서 입력된 정보가 데이터베이스에 직접 생성되지 않고 먼저 XML 파일로 생성된다는 점이다 ( 물론 XML 파일과 데이터베이스에 동시에 데이터를 생성할 수도 있다 ).

 

웹에서 입력된 결과 조회방법

 

위 그림에서 ①의 방법은 웹에서 사용자로부터 데이터를 입력받아 데이터베이스에 데이터를 생성하고 웹 프로그래밍을 통해 입력된 결과를 조회하는 방법이다 . ② 의 방법은 웹에서 사용자로부터 데이터를 입력받아 XML 을 생성하는 방법으로 이 XML 파일은 XSL 과 결합하여 웹에서 조회가 된다 . 지금부터 설명하는 방법은 ② 의 방법으로 대용량 데이터를 처리하는 방법이다 . 그럼 다음과 같은 웹 폼이 있다고 가정해 보자 .

 

자금이체정보입력 웹 폼 

웹 폼의 소스는 다음과 같다.



<HTML>
<HEAD>
<TITLE></TITLE>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<META http-equiv="Content-Type"/>
<META content="MSHTML 6.00.6000.16587" name="GENERATOR"/>
<STYLE>BLOCKQUOTE {
 MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
}
P {
 MARGIN-TOP: 1px; MARGIN-BOTTOM: 1px; font-size:9pt; font-family:Arial;
}
v\:* {
 BEHAVIOR: url(#default#VML)
}
o\:* {
 BEHAVIOR: url(#default#VML)
}
.shape {
 BEHAVIOR: url(#default#VML)
}
x\:* {
 VISIBILITY: hidden; POSITION: relative
}
TD {
 font-size:9pt; font-family:Arial; WORD-BREAK: break-all;
}
UL {
 MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt; MARGIN-LEFT: 30pt
}
OL {
 MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt; MARGIN-LEFT: 30pt
}
</STYLE>
</HEAD>
<script language="JavaScript" src="C:/BaseXML/webform/script/bxForm.js"> </script>
<script language="JavaScript" src="C:/BaseXML/webform/script/bxControl.js"> </script> 
<script language="JavaScript" src="C:/BaseXML/webform/script/bxCommon.js"> </script> 
<BODY onLoad="bxfXmlInit('account_sample.xml')"  style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">
<form name=BaseXML onsubmit='bxfXmlSaveEx(); return false'>
<OBJECT ID="XMLfile" width="550" height="1" CLASSID="CLSID:966BCF62-9570-421C-ACC7-AFF0F0B1AEA0"></OBJECT>
<input type=submit value='Save' style="display:none">
<textarea  name="calXMLcontent" style="display:none" ></textarea>
<textarea  name="inXMLcontent" style="display:none" ></textarea> 
<textarea  name="outXMLcontent" style="display:none" ></textarea>
<input type="hidden" name="savefilepath" value="">
<input type="hidden" name="imagesavepath" value="">
<input type="hidden" name="imagematchinfo" value="">
<input type="hidden" name="H_kkkConvertTyp" value="">
<input type="hidden" name="kkkConvertTyp" value="">
<input type="hidden" name="H_kkkEncryptKeyValue" value="">
<input type="hidden" name="kkkEncryptKeyValue" value="">
<input type="hidden" name="H_DownloadFilePath" value="">
<input type="hidden" name="H_DownloadFileName" value="">
<input type="hidden" name="DownloadFilePath" value="">
<input type="hidden" name="DownloadFileName" value="">
 
<input type="hidden" name="H_root/out_account_info/out_account_no" value="">       <!--출금계좌번호-->
<input type="hidden" name="H_root/out_account_info/out_account_pw" value="">       <!--계좌비밀번호-->
<input type="hidden" name="H_root/in_account_info/in_bank" value="">               <!--입금은행-->
<input type="hidden" name="H_root/in_account_info/in_account_no" value="">         <!--입금계좌번호-->
<input type="hidden" name="H_root/in_account_info/in_amount" value="">             <!--이체금액-->
<input type="hidden" name="H_root/in_account_info/in_transfer_date" value="">      <!--이체실행일자-->
 
<P>
<FONT style="FONT-SIZE: 12pt">
<STRONG>자금이체정보입력 - 3K 은행
</STRONG>
</FONT>
</P>
<P>
<TABLE id="55" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-SIZE: 10pt; 
BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" borderColor="black" 
cellSpacing="0" cellPadding="3" width="700" border="1">
<COLGROUP>
<COL width="130"></COL>
<COL width="251"></COL>
<COL width="132"></COL>
<COL width="187"></COL>
</COLGROUP>
<TBODY>
<TR style="HEIGHT: 20px">
<TD><P align="center"><FONT style="FONT-SIZE: 12pt">출금계좌번호</FONT></P></TD>
<TD>
<SELECT name="root/out_account_info/out_account_no">
 <OPTION value="123-45-67890" selected>123-45-67890</OPTION>  
 <OPTION value="012-34-56789">012-34-56789</OPTION> 
</SELECT> 
</TD>
<TD><P align="center"><FONT style="FONT-SIZE: 12pt">계좌비밀번호</FONT></P></TD>
<TD><P><input type="text" name="root/out_account_info/out_account_pw" value="" style="width:100"/></P></TD>
</TR>
<TR style="HEIGHT: 20px">
<TD><P align="center"><FONT style="FONT-SIZE: 12pt">입금은행</FONT></P></TD>
<TD colSpan="3"><P align="left">
<SELECT name="root/in_account_info/in_bank"> 
 <OPTION value="우리은행" selected>우리은행</OPTION>  
 <OPTION value="국민은행">국민은행</OPTION> 
 <OPTION value="신한은행">신한은행</OPTION>
</SELECT></P>
</TD>
</TR>
<TR style="HEIGHT: 20px">
<TD><P align="center"><FONT style="FONT-SIZE: 12pt">입금계좌번호</FONT></P></TD>
<TD colSpan="3"><P align="left"><input type="text" name="root/in_account_info/in_account_no" style="width:100"/></P></TD>
</TR>
<TR style="HEIGHT: 20px">
<TD><P align="center"><FONT style="FONT-SIZE: 12pt">이체금액</FONT></P></TD>
<TD colSpan="3"><P><input class="number" type="text" name="root/in_account_info/in_amount" 
style="width:100; text-align:right"/></P></TD>
</TR>
<TR style="HEIGHT: 20px">
<TD><P align="center"><FONT style="FONT-SIZE: 12pt">이체실행일자</FONT></P></TD>
<TD colSpan="3">
<input style="width:100;" class="date" type="text" name="root/in_account_info/in_transfer_date" 
id="root/in_account_info/in_transfer_date" MaxLength="10" onblur="bxfSetDate(this, 'd');" 
onkeypress="return bxfKeyCheckInt(event);" 
ondblclick="bxfCalendar('root/in_account_info/in_transfer_date', -1);" />
</TD>
</TR>
</TBODY>
</TABLE>
</P>
</form>
<SCRIPT LANGUAGE="JavaScript"  FOR="XMLfile" EVENT="XMLdown(lFile)">
  if(lFile != "" )
 { 
 //alert(lFile); 
 document.forms[0].outXMLcontent.value=lFile;
document.title=lFile; 
//Save created XML content in a file! 
 }
</script>
<SCRIPT LANGUAGE="JScript"  FOR="XMLfile" EVENT="XMLupdate(lFile)">
//alert(lFile);
 if(lFile != "" )
 {
  bxfXmlDisplay(lFile);
 }
</script>
</BODY>
</HTML>



 

위의 웹 폼은 일반적인 웹 폼과 다를 바가 없다 . 하지만 다른 점이 있다면 아래 소스가 추가되어 있다는 것이다 .




<BODY onLoad="bxfXmlInit('account_sample.xml')"  style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">
<form name=BaseXML onsubmit='bxfXmlSaveEx(); return false'>
<OBJECT ID="XMLfile" width="550" height="1" CLASSID="CLSID:966BCF62-9570-421C-ACC7-AFF0F0B1AEA0"></OBJECT>


 

각 행을 자세히 설명하자면 다음과 같다 .

 

* 웹에서 XML 을 생성하기 위해 원본 XML 파일을 선언하는 부분



<BODY onLoad="bxfXmlInit('account_sample.xml')"  style="FONT-SIZE: 9pt; FONT-FAMILY: Arial">


 

* 폼의 이름을 "BaseXML" 로 하고 [Save] 버튼을 클릭하였을 때 "bxfXmlSaveEx()" 함수를 실행



<form name=BaseXML onsubmit='bxfXmlSaveEx(); return false'>


  

* 웹에서 원본 XML 을 참조하여 입력된 데이터를 받아 복제 XML 을 생성하기 위한 XML 생성 엔진 선언



<OBJECT ID="XMLfile" width="550" height="1" CLASSID="CLSID:966BCF62-9570-421C-ACC7-AFF0F0B1AEA0"></OBJECT>


  

위에 선언된 소스를 일반 웹 폼에 추가함으로써 XML 을 웹에서 생성하여 타깃 서버로 파일을 전송할 수 있다 . 위의 ‘ 자금이체 정보입력 ' 웹 폼에서 참조하는 원본 XML(account_sample.xml) 파일의 구조는 다음과 같다.



<?xml version="1.0"   encoding="UTF-8"?>
<!-- File Name: basexml.xml -->
<?xml-stylesheet type="text/xsl" href="account_sample.xsl"?>
<root>
      <out_account_info>
         <out_account_no></out_account_no>          <!--출금계좌번호-->
         <out_account_pw></out_account_pw>          <!--계좌비밀번호-->
      </out_account_info>
      <in_account_info>
         <in_bank></in_bank>                        <!--입금은행-->
         <in_account_no></in_account_no>            <!--입금계좌번호-->
         <in_amount></in_amount>                    <!--이체금액-->
         <in_transfer_date></in_transfer_date>      <!--이체실행일자-->
      </in_account_info>
</root>


 

만약 사용자가 다음과 같은 정보를 입력하고 저장을 했다고 하자 .

  자금이체정보입력 웹 폼

 

타깃 서버에는 위의 원본 XML 을 참조하여 복제한 인스턴스 XML 파일이 다음과 같이 생성될 것이다.



<?xml version="1.0" encoding="UTF-8" ?>
<!-- File Name: basexml.xml -->
<?xml-stylesheet type="text/xsl" href="account_sample.xsl"?>
<root>
   <out_account_info>
        <out_account_no>123-45-67890</out_account_no>
        <out_account_pw>****</out_account_pw>
   </out_account_info>
   <in_account_info>
        <in_bank>우리은행</in_bank>
        <in_account_no>123-456-02-789</in_account_no>
        <in_amount>200000</in_amount>
        <in_transfer_date>2008-04-15</in_transfer_date>
   </in_account_info>
 </root>


 

위의 인스턴스 XML 파일은 이미 "account_sample.xsl" 이라는 양식이 연결되어 있으므로 웹 브라우저에서 파일을 열면 다음과 같이 표현될 것이다 .

 

자금이체정보입력 웹 폼

 

웹 폼에서 XML 파일을 HTTP 프로토콜 상에서 생성하려면 DOM(Document Object Model) 을 사용하거나 XForm 을 사용하는 것이 현재까지 나와 있는 방법이다 . 하지만 DOM 기술은 난해하고 XForm 또한 일반 개발자들이 새로 배우기에는 장벽이 존재한다 ( 한국 developerWorks 의 XML 의 미래 ( 한글 ) 기사를 참고하라 ). 설사 두 기술을 모두 배우더라도 DOM 에는 메모리 문제가 존재하고 XForm 을 사용하여 XML 을 생성하려고 하더라도 추가적인 애플리케이션이 필요하다 .

 

XML 은 N 차원의 데이터 속성을 가지고 있다 . 이로 인해 혼합에 의한 복잡성 (combination complexity) 이 존재한다 . 이것이 XML 기술의 실체를 접근하는 데 있어 가장 중요한 키워드다 . 많은 개발자들이 범하기 쉬운 오류는 2 차원적인 정보를 다루는 기술 (DB, HTML, DOM 등 ) 로 N 차원의 XML 문서를 만들려는 것이다 . 아래 그림에서 보듯이 XML 문서가 element(Root 는 제외 ) 세 개를 가지고 있다면 만들 수 있는 XML 문서는 18 개다 .

 

XML 문서가 element(Root 는 제외 ) 세 개를 가지고 있다면 만들 수 있는 XML 문서는 18 개다.

이것을 공식으로 표현하면 N*N! 이다 (N: XML 의 element 개수 ). 세 개의 element 를 순서와 계층 (hierarchy) 을 변경하면 완전히 다른 문서가 된다는 것이다 . DOM 을 사용한다면 세 개의 element 를 가지고 18 가지의 다른 종류의 XML 로 생성하기 위해 18 가지 프로그래밍이 필요하다 .

 

XML on HTTP(ActivaXML 방법론 ) 를 사용한다면 개발자들이 해야 할 18 가지의 프로그래밍 개발 노력을 XML 생성 엔진이 자동으로 처리하게 된다 . 또한 XML 을 생성하기 위한 웹 폼을 기존의 웹 폼 개발자들이 늘 사용하는 방법을 그대로 사용하고 복제 / 치환이라는 방법을 사용함으로써 대용량 데이터 처리를 위한 개발 생산성을 높이고 비용을 절감하는 효과를 누릴 수 있다 .

 

다음 회에는 웹에서 생성된 XML 파일을 대용량 트랜잭션 처리가 필수적인 은행 업무에 적용하는 경우를 설명하고 이에 대한 장단점을 설명하겠다 .



위로



이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us

이제 전문가의 글을 단순히 ‘보는 것’에서, 직접 여러분이 developerWorks의 필자가 될 수 있습니다. IBM developerWorks를 통해 공유하고 싶은 지식이 있으신 분들은 원고 기획안을 접수해주세요. 채택되신 분께는 소정의 원고료를 드립니다.



[지난 Open dW 보기]

사이트 여행

dW 커뮤니티
포럼 | 블로그 | Spaces
dW Student Community

로컬 컨텐츠

행사 및 세미나

기획 기사

개발자 입문

튜토리얼 및 교육

TOP 10 인기자료

SW 다운로드

RSS 피드

뉴스레터
  
자바스크립트가 작동이 중지되었습니다. 이 기능을 수행하시려면 브라우저에서 자바스크립스트를 작동시켜 주시거나 이곳을 클릭해주세요.
Special offers
IBM SOA Sandbox 시험판
dW Student Community
로보코드
코드 트레이닝


    IBM 소개 개인정보 보호정책 문의