Flex LCDS, Data Management Service, Tomcat 6
Study Material
여기에서 사용된 예제파일
LCDS Download
http://www.adobe.com에 접속하여 Downloads 메뉴를 선택하여 우측상단의 검색창에 lcds 입력하면
검색결과에서 LiveCycle Data Services ES 링크를 선택한다.
다운로드하려면 회원에 가입되어 있어야 한다.
Data Management Service setup
설치시에는 Tomcat 6버전과 함께 설치하기를 선택하면 Data Management Service를 위해 필요한
라이브러리(JOTM, JTA등이 톰캣의 라이브러리에 포함되어 설치되므로 별도로 라이브러리를 구해서
설치하는 번거로움을 덜 수 있다.
LCDS설치경로가 c:\lcds\ 라고 하면, Tomcat은 c:\lcds\tomcat 에 설치된다. Eclipse에 톰캣의 경로를
등록할 때 참고하면 된다.
Eclipse > Window > Preferences > Server > Runtime Environment > Add > Apache > Apache Tomcat 6.0 >
위에서 설치한 톰캣 경로를 선택하여 등록한다.
Eclipse에서 c:\lcds\lcds.war파일을 임포트하여 lcds라이브러리가 포함된 웹프로젝트를 생성한다.
생성된 프로젝트의 Build Path > Configure Build Path.... > Library > Add Library > Server Runtime > Tomcat 6
를 선택하여 톰캣에 포함된 JOTM(Java Open Transaction Manager), JTA(Java Transaction API)등을 사용할 수
있도록 등록한다.
생성된 웹프로젝트의 WebContent/META-INF/context.xml 파일의 내용을 다음과 같이 설정한다.
<Context reloadable="true">
<!--
<Resource name="jdbc/myDB" auth="Container" type="javax.sql.DataSource"
factory="org.objectweb.jndi.DataSourceFactory"
driverClassName="org.postgresql.Driver"
username="mojo" password="jojo" url="jdbc:postgresql://localhost/javatest"/>
-->
<Transaction factory="org.objectweb.jotm.UserTransactionFactory"
jotm.timeout="60"/>
</Context>
만일 데이터베이스 Connection Pool을 사용하려는 경우에는 위의 주석처리된 부분의 주석을 해제하고
사용하고자 하는 데이터베이스의 정보를 속성에 설정해 주면 된다.
데이터베이스를 사용하지 않은 상태에서 클라이언트와 서버측의 데이터 동기화 테스트를 하려면
위의 경우처럼 데이터베이스 Connection Pool설정은 주석으로 남겨두고 Transaction 요소를 활성화
해 주면 된다. 여기에서도 이 방법을 사용하려고 한다.
웹프로젝트에 다음과 같이 Assembler 클래스와 DTO클래스를 작성한다. 만약 Assembler클래스에서 데이터베이스에 접근할 필요가 있다면 별도의 DAO클래스를 작성해 사용하면 될 것이다.
----------------MemberAssembler.java----------------------------------------------------
package test;
import java.util.*;
import flex.data.DataServiceTransaction;
import flex.data.assemblers.AbstractAssembler;
public class MemberAssembler extends AbstractAssembler {
@Override
public Collection fill(List fillParameters){
System.out.println("fill()메소드 실행됨");
ArrayList<Member> al = new ArrayList<Member>();
al.add(new Member("홍길동","234-645-567","hong@yaho.com"));
al.add(new Member("박지성","543-4567-0987","jspark@daum.com"));
return al;
}
@Override
public void createItem(Object newItem){
System.out.println("createItem()메소드 실행됨");
}
@Override
public void updateItem(Object newVersion, Object prevVersion, List changes) {
System.out.println("updateItem()메소드 실행됨");
DataServiceTransaction dtx = DataServiceTransaction.getCurrentDataServiceTransaction();
dtx.refreshFill("test.member", new ArrayList(0));
}
@Override
public void deleteItem(Object item){
System.out.println("deleteItem()메소드 실행됨");
}
@Override
public boolean autoRefreshFill(List fillParams){
return false;
}
}
------------Member.java(DTO class)----------------------------
package test;
import java.io.Serializable;
public class Member implements Serializable {
public String name;
public String phone;
public String email;
public Member(){}
public Member(String name, String phone, String email){
this.name = name;
this.phone = phone;
this.email = email;
}
}
----------------data-management-conf.xml--------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<service id="data-service"
class="flex.data.DataService">
<adapters>
<adapter-definition id="actionscript" class="flex.data.adapters.ASObjectAdapter" default="true"/>
<adapter-definition id="java-dao" class="flex.data.adapters.JavaAdapter"/>
</adapters>
<default-channels>
<channel ref="my-rtmp"/>
</default-channels>
<destination id="test.member">
<adapter ref="java-dao"/>
<properties>
<source>test.MemberAssembler</source>
<scope>application</scope>
<metadata>
<identity property="name"/>
</metadata>
</properties>
<channels>
<channel ref="my-rtmp"/>
</channels>
</destination>
</service>
-----------------Flex 프로젝트를 생성하고 클라이언트를 작성한다----------------
프로젝트를 생성할 때 LCDS를 사용할 수 있도록 체크하고 클라이언트 코드가 서버측에 컴파일되어
저장될 수 있도록 lcds기반 웹프로젝트를 지정해 주어야 한다.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
applicationComplete="init()">
<mx:Script>
<![CDATA[
import mx.data.events.DataConflictEvent;
import mx.rpc.events.FaultEvent;
import test.Member;
private function init():void {
dataservice.fill(ac);
}
private function faultHandler(event:FaultEvent):void{
mx.controls.Alert.show("에러"+event.message.toString());
}
private function conflictHandler(event:DataConflictEvent):void{
mx.controls.Alert.show("Data Conflict");
}
private function onAdd():void {
ac.addItem({name:tiName.text, phone:tiPhone.text, email:tiEmail.text});
}
private function onRemove():void {
ac.removeItemAt(dg.selectedIndex);
}
]]>
</mx:Script>
<mx:DataService id="dataservice" destination="test.member"
fault="faultHandler(event)" conflict="conflictHandler(event)"/>
<mx:ArrayCollection id="ac"/>
<mx:Panel x="52.5" y="24" width="530" height="350" layout="absolute" title="2개의 브라우저 실행후, 입력/수정/삭제 동기화 테스트" fontSize="13">
<mx:DataGrid id="dg" y="10" dataProvider="{ac}" editable="true" width="424" horizontalCenter="0" height="143">
<mx:columns>
<mx:DataGridColumn headerText="Name" dataField="name"/>
<mx:DataGridColumn headerText="Phone" dataField="phone"/>
<mx:DataGridColumn headerText="Email" dataField="email"/>
</mx:columns>
</mx:DataGrid>
<mx:TextInput y="228" width="102" id="tiName" x="203"/>
<mx:TextInput x="104" y="228" width="91" id="tiPhone"/>
<mx:TextInput x="313" y="228" width="93" id="tiEmail"/>
<mx:Button y="258" label="위에 입력한 내용을 ArrayCollection에 추가" width="301" fontSize="12" click="onAdd()" x="104"/>
<mx:Button x="149" y="178" label="선택한 항목 삭제하기" width="212" fontSize="13" click="onRemove()"/>
</mx:Panel>
</mx:Application>
----------------클라이언트 측에서 사용될 Actionscript DTO class---------------------
{
[Managed]
[RemoteClass(alias="test.Member")]
public class Member
{
public var name:String;
public var phone:String;
public var email:String;
public function Member() {}
}
}
-------------------------------------------------------------------------------------------------
웹서버 실행
웹서버를 실행하면서 콘솔에 에러 메시지가 나타나지 않고 제대로 기동했는지 확인한다.
-------------------------------------------------------------------------------------------------
Flex 클라이언트 실행
Run As > Flex Application을 선택하여 서버측에 컴파일되어 저장된 Flex 애플리케이션을 웹브라저에서
요청하여 실행한다.
위와 같이 2개의 웹브라우저에 클라이언트를 실행해 놓고 그 중 한 화면의 데이터를 변경해 본다.
변경된 데이터른 다른 화면에서도 그대로 반영되는 것을 확인할 수 있다.
-------------------------------------------------------------------------------------------------




flex-dataservices-tutorial.pdf
DataServiceTest.zip
이올린에 북마크하기