XPLATFORM 101
Application > Transaction

아마도 기업용 애플리케이션에서 가장 많이 사용하는 기능이 트랜잭션입니다.
데이터를 조회하고 추가, 삭제, 변경 하고 저장하는 일련의 프로세스의 틀을 벗어나지 않습니다.

transaction 은 Dataset의 값을 갱신하기 위한 서비스를 호출하고 transaction이 완료되면 콜백 함수를 수행하는 메소드입니다.

[application.]transaction(strSvcID,strURL,
strInDatasets,strOutDatasets,strArgument,strCallbackFunc[,bAsync[,bBinary[,bCompress]]])

기본적으로 필요한 항목이 많군요.

strSvcID : 트랜잭션을 구별하기 위한 ID
strURL : 요청 주소 값
strInDatasets : 트랜잭션 요청시 입력값으로 보낼 Dataset의 ID의 집합. 1개 이상을 보낼 수 있으며 빈칸으로 구분
strOutDatasets : 처리결과를 받을 Dataset ID. 역시 1개 이상을 받을 수 있음
strArgument : 트랜잭션을 위한 인자값. a=b 형식
strCallbackFunc : 결과를 돌려줄 콜백 함수

그리고 나머지 옵션은

비동기 여부, Binary 여부, 압축 여부를 결정합니다.

- 조회가 어떤 식으로 들어가는지 살펴봅시다.
transaction("select",
"Svc::TransactionSample/select_sample_db.jsp?getvar=테스트test123","","Dataset00=output",vArgument,"fn_callback",bReqAsync,bReqBinary,bReqCompress);

일단 첫번째 인자는 ID 구요.

두번째 인자가 요청 주소값인데 Svc 는 TypeDefinition에서 지정합니다.


그리고 세번째는 최초 조회시에는 필요하지 않기 때문에 빈칸으로 놔두었습니다.
업데이트 처리시에 사용되는 부분이죠.

네번째는 데이터를 받을 Dataset을 지정해주고

다섯번째는 트랜잭션에 필요한 인자값(조건)을 넣어줍니다.
예제에서는 vArgument 라는 변수로 따로 지정을 했구요.
해당 값은 XML로 전달되는 경우에는 다음과 같이 전달됩니다.
vArgument = "arg="+encodeURI("한글testArg") +  " bResType=" + Combo01.value;
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Parameters>
<Parameter id="JSESSIONID" type="STRING">5D5B9FBEA8F277EE75E9ED9579D66841</Parameter>
<Parameter id="arg" type="STRING">%ED%95%9C%EA%B8%80testArg</Parameter>
<Parameter id="bResType" type="STRING">xml</Parameter>
</Parameters>
</Root>
넘어오는 데이터를 살펴보면 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.tobesoft.com/platform/dataset" ver="5000">
<Parameters>
<Parameter id="ErrorCode" type="int">0</Parameter>
<Parameter id="ErrorMsg" type="string">SUCC</Parameter>
</Parameters>
<Dataset id="output">
<ColumnInfo>
<Column id="no" type="int" size="4"/>
<Column id="id" type="string" size="12"/>
<Column id="name" type="string" size="50"/>
<Column id="sid" type="string" size="13"/>
<Column id="password" type="string" size="50"/>
<Column id="email" type="string" size="50"/>
<Column id="address1" type="string" size="100"/>
<Column id="address2" type="string" size="100"/>
<Column id="post" type="string" size="100"/>
<Column id="phone1" type="string" size="50"/>
<Column id="phone2" type="string" size="50"/>
<Column id="officeNm" type="string" size="50"/>
</ColumnInfo>
<Rows>
<Row>
<Col id="no">1</Col>
<Col id="id">hunnam</Col>
<Col id="name">홍길순</Col>
<Col id="sid">8107221234567</Col>
<Col id="password">1234</Col>
<Col id="email">leehm@tobesoft.com</Col>
<Col id="address1">서울시&#32;송파구&#32;잠실동</Col>
<Col id="address2">222번지&#32;서일빌딩&#32;7층</Col>
<Col id="post">138-863</Col>
<Col id="phone1">01036475643</Col>
<Col id="phone2">0221407112</Col>
<Col id="officeNm">투비소프트</Col>
</Row>
<Row>
<Col id="no">2</Col>
<Col id="id">hunnam</Col>
<Col id="name">홍길동</Col>
<Col id="sid">9312032031020</Col>
<Col id="password">345678</Col>
<Col id="email">hgd@naver.com</Col>
<Col id="address1">서울</Col>
<Col id="address2">삼성역</Col>
<Col id="post">123-456</Col>
<Col id="phone1">01012345671</Col>
<Col id="phone2">022123456</Col>
<Col id="officeNm">디자인회사</Col>
</Row>
</Rows>
</Dataset>
</Root>
기본 옵션 외의 나머지를 보면 쇼케이스에서 테스트하는 부분이 바이너리 유무와 압축 유무입니다.

기본 옵션과 바이너리, 바이너리 압축을 비교해보면 위의 데이터의 경우 물리적인 크기의 차이가 있긴 합니다.


하지만 바이너리 변환과 압축과정에서의 손실이 있으며 헤더값이 추가적인 정보가 들어가기 때문에
상황에 따라 어떤 형식을 선택할지 고려해야 합니다.

삭제나 추가는 Dataset에 직접 deleteRow()나 addRow()를 사용합니다.
addRow()일 경우에는 성공시 해당하는 Row의 위치값을 반환해주기때문에
바로 Dataset.setColumn() 메소드로 해당하는 값을 설정해줍니다.

저장시에는 아래와 같은 형식으로 업데이트될 Dataset을 데이터를 보내줍니다.
달라지는 부분은 <Row type="insert"> 으로 처리되는 부분이네요.
delete 는 삭제, update 는 수정, insert 는 추가입니다.
update 일 경우에는 OrgRow 라는 항목이 추가됩니다.
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Parameters>
<Parameter id="GID" type="STRING"></Parameter>
<Parameter id="NEIS" type="STRING"></Parameter>
<Parameter id="JESSIONID" type="STRING"></Parameter>
<Parameter id="JSESSIONID" type="STRING">597FB296B292335D787A54EC766B815A</Parameter>
<Parameter id="arg" type="STRING">%ED%95%9C%EA%B8%80testArg</Parameter>
<Parameter id="bResType" type="STRING">xml</Parameter>
</Parameters>
<Dataset id="input">
<ColumnInfo>
<Column id="no" type="INT" size="4"/>
<Column id="id" type="STRING" size="12"/>
<Column id="name" type="STRING" size="50"/>
<Column id="sid" type="STRING" size="13"/>
<Column id="password" type="STRING" size="50"/>
<Column id="email" type="STRING" size="50"/>
<Column id="address1" type="STRING" size="100"/>
<Column id="address2" type="STRING" size="100"/>
<Column id="post" type="STRING" size="100"/>
<Column id="phone1" type="STRING" size="50"/>
<Column id="phone2" type="STRING" size="50"/>
<Column id="officeNm" type="STRING" size="50"/>
</ColumnInfo>
<Rows>
<Row type="delete">
<Col id="no">1</Col>
<Col id="id">hunnam</Col>
<Col id="name">홍길순</Col>
<Col id="sid">8107221234567</Col>
<Col id="password">1234</Col>
<Col id="email">leehm@tobesoft.com</Col>
<Col id="address1">서울시&#32;송파구&#32;잠실동</Col>
<Col id="address2">222번지&#32;서일빌딩&#32;7층</Col>
<Col id="post">138-863</Col>
<Col id="phone1">01036475643</Col>
<Col id="phone2">0221407112</Col>
<Col id="officeNm">투비소프트</Col>
</Row>
<Row type="update">
<Col id="no">2</Col>
<Col id="id">hunnam</Col>
<Col id="name">홍길동</Col>
<Col id="sid">9312032031020</Col>
<Col id="password">345678</Col>
<Col id="email">hgd@naver.com</Col>
<Col id="address1">성남</Col>
<Col id="address2">삼성역</Col>
<Col id="post">123-456</Col>
<Col id="phone1">01012345671</Col>
<Col id="phone2">022123456</Col>
<Col id="officeNm">디자인회사</Col>
<OrgRow>
<Col id="no">2</Col>
<Col id="id">hunnam</Col>
<Col id="name">홍길동</Col>
<Col id="sid">9312032031020</Col>
<Col id="password">345678</Col>
<Col id="email">hgd@naver.com</Col>
<Col id="address1">서울</Col>
<Col id="address2">삼성역</Col>
<Col id="post">123-456</Col>
<Col id="phone1">01012345671</Col>
<Col id="phone2">022123456</Col>
<Col id="officeNm">디자인회사</Col>
</OrgRow>
</Row>
<Row type="insert">
<Col id="no">3</Col>
<Col id="id">test</Col>
<Col id="name">test</Col>
<Col id="sid">1111111</Col>
<Col id="password">1111</Col>
<Col id="email">111@111</Col>
<Col id="address1">11</Col>
<Col id="address2">11</Col>
<Col id="post">11</Col>
</Row>
</Rows>
</Dataset>
</Root>
* 대용량 데이터 조회(FirstRow)에 대해서는 따로 다루도록 하겠습니다.
* 생각보다 설명할 내용이 길어지네요. ㅠㅠ

http://cafe.naver.com/xplatform101/149