열이아빠님 블로그를 구독하고 있는데요. 플렉스에서 좋은 프레임워크가 없을까 하는 생각에 갑자기 열이아빠님의 블로그에 포스팅한 '10 가지 플렉스 디버깅 도구 및 프레임워크'가 생각이 났습니다.
여기서 나온게 Mate Framework라는 것인데, 발음은 메이트가 아닌 마떼라고 발음하는 것이라고 열이아빠님께서 말씀하셨습니다. 조또마떼! 일본애니메이션보면 디게 많이 나오는데...잠만 기댕겨?라는 뜻인듯?-_-;
Mate Flex Framework 공식홈페이지 http://mate.asfusion.com/
Mate Flex Framework 공식홈페이지에 가보면,
Mate is a tag-based, event-driven Flex framework.
라고 되어있습니다. tag기반에 event driven 플렉스 프레임워크라는 겁니다.
개발 방식도 우선 Service와 Event를 정의한 EventMap, 그리고, View로 나눠져 있습니다. MVC랑 비슷한 것 같은데, View에서 이벤트가 발생하면 이벤트를 정의해놓은 EventMap에서 찾아서 Event를 발생하죠. 이 EventMap에서는 해당 Service를 호출하는 등의 구조로 되어있어요. 제가 설명하는게 맞는지는 모르겠지만, 대충 저런 구조인 듯하네요. '서비스는 WAS없이도 돌아간다라고 생각하고 짜야된다가 현재의 결론입니다'라고 허광남씨가 말했던 것 처럼 여기서도 Service는 다른 것에 영향없이 돌아가야하는 겁니다.
이 Service는 BlazeDS를 이용한 RemoteObject가 될 수 있고, HTTPService를 이용한 서비스가 될 수 있고, WebService가 될 수 있습니다. 물론, Flex에서 만든 어떤 Method가 될 수도 있습니다.

그러면 해당 서비스를 EventMap에 정의를 해놓고, View에서는 Event를 발생시키기만 하면 되는 겁니다.
백날 말로 하는 것보다 코드로 보는게 빠릅니다-_-;

New -> Project -> Flex Project 를 선택!
Project Name은 HelloMate라고 하고, Web application을 선택하고, Application Server는 NONE으로 Finish고고싱!
Mate Flex Framework공식 홈페이지에 가면 downloads를 클릭하면, swc파일이 있는데요. 이것을 libs폴더에 복사합니다.

우선 패키지를 만들어봅시다.
src에 New -> Folder를 선택해서 events, maps, services, views를 만듭니다.
우선 events에 Event클래스를 하나 만들어봅시다.
New -> ActionScript Class선택 후 Name은 HelloEvent로 하고, Superclass는 flash.events.Event를 선택!
events/HelloEvent.as

package events
{
import flash.events.Event;

public class HelloEvent extends Event
{
/* Constants */
public static const SAY:String = "sayHelloEvent";

/* Properties */
public var name:String;

public function HelloEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}

SAY라는 상수를 하나 만들어서 sayHelloEvent라고 합시다. 이 이름을 통해 이벤트를 구분합니다.
Properties는 event를 발생할 때 properties값을 지정해서 EventMap에 정의한 메소드에 파라메터로 넣기 위해서 사용합니다.

이제 service를 만들어봅시다.
New -> ActionScript Class선택 후 name은 HelloService라고 합시다.
services/HelloService.as

package services
{
public class HelloService
{
public function sayHello(name:String):String
{
return "Hello! " + name + ", I'm so sorry but I love dagujitmal";
}
}
}

단순히 name을 파라메터로 받아서 Hello!를 붙여줘서 리턴해주는 메소드입니다.

이제 view를 만들어봅시다.
New -> File -> MXML Component선택! Filename은 HelloBox로 하고, Based on은 조낸 귀찮으니까 VBox로 하고, 사이즈도 그냥 그대로 갑시다-_-;
views/HelloBox.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:mate="http://mate.asfusion.com/"
width="400" height="300"
horizontalAlign="center"
verticalAlign="middle">
<mx:Script>
<![CDATA[
import events.HelloEvent;

private function sayHello():void
{
helloDispatcher.generateEvent();
}

private function helloResult(result:String):void
{
myLabel.text = result;
}
]]>
</mx:Script>

<!-- Dispatcher -->
<mate:Dispatcher id="helloDispatcher" generator="{HelloEvent}" type="{HelloEvent.SAY}">
<mate:ResponseHandler type="helloResultResponse" response="helloResult(event.helloResult)" />
<mate:eventProperties>
<mate:EventProperties name="{input.text}" />
</mate:eventProperties>
</mate:Dispatcher>

<mx:TextInput id="input" enter="sayHello();"/>
<mx:Button id="button" label="hello" click="sayHello();"/>
<mx:Label id="myLabel" text="이름을 입력하세요" width="295"/>
</mx:VBox>

mate에서 제공하는 Dispatcher기능을 쓰기 위해 네임스페이스를 지정해줍니다.
그리고, <mate:Dispatcher />태그가 있는데요. 여기서 자세히 보면, HelloEvent를 발생하고, 이벤트 종류는 HelloEvent.SAY인 것이죠. 이 이름은 단순 EventMap에 있는 것이랑 매핑하기위해서 쓰인 것 같구요.
이 이벤트를 발생할 때 Properties값은 input에 있는 text값을 넘깁니다. 방금 위에서 HelloEvent를 정의할 때 Properties값 name을 선언했는데, 저렇게 EventProperties에 지정을 해주면 저 값을 물고 들어갑니다.
그다음 그 응답값을 받을 ResponseHandler를 정의해주는데, helloResultResponse는 EventMap에 있는 것이랑 매핑하기 위한 이름이구요, response는 실제 메소드를 호출해줍니다. event.helloResult값은 EventMap에서 정의한 Properties값이구요. 여기서 설명하는 것보다 EventMap을 실제로 보면 이해가 훨씬 빠릅니다.

New -> MXML Component를 선택, Filename은 MainEventMap 그냥 Finish.
<mx:Canvas를 EventMap으로 고칩니다.
maps/MainEventMap.mxml

<?xml version="1.0" encoding="utf-8"?>
<EventMap xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns="http://mate.asfusion.com/">
<mx:Script>
<![CDATA[
import services.HelloService;
import events.HelloEvent;
]]>
</mx:Script>

<EventHandlers type="{HelloEvent.SAY}">
<MethodInvoker generator="{HelloService}" method="sayHello" arguments="{event.name}" />
<ResponseAnnouncer type="helloResultResponse">
<Properties helloResult="{lastReturn}" />
</ResponseAnnouncer>
</EventHandlers>

</EventMap>

EventHandlers를 정의해줬는데 여기서 type은 아까 dispatcher에서 정의한 type과 같은 HelloEvent.SAY가 되겠죠. 그다음 MethodInvoker는 메소드를 호출하는 태그입니다. 위에서 언급했듯이 메소드 말고, RemoteObject나 HTTPService, WebService도 다 됩니다.
generator는 클래스를 적어주고, method에 메소드 이름을 적습니다. arguments에는 파라메터값인데 event.name은 해당 event에서 받은 name을 말하는겁니다. 우리가 Dispatcher에 정의한 name에 input.text값을 넣었으니 그게 들어가는 겁니다. 그다으메 ResponseAnnouncer는 응답을 정의하는 건데, 그 type이 아까 위에서 정의한 그 타입과 일치해야합니다. Properties의 helloResult도 위에 Dispatcher에서 정의한 것과 동일한 이름이여야겠죠. 그러면 저 Properties에 값이 들어가는데 여기서 보면 lastReturn이라고 써있는데, 위에 메소드에서 리턴한 값을 말하는 겁니다.
저렇게 해주면 끝납니다.

이제 마지막으로 main을 작성해봅시다.
HelloMate.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
xmlns:view="views.*"
xmlns:maps="maps.*">

<!-- Event Maps -->
<maps:MainEventMap />

<!-- views -->
<view:HelloBox />

</mx:Application>

EventMap을 추가하고, View만 추가해주면 끝납니다.
실행해봅시다.
사용자 삽입 이미지
암쏘쏘리 벗알러뷰다거짓말.......
    • 머드초보

      헉..지금 보니까 but I love 'you'가 빠졌습니다.
      미안하지만 난 다거짓말을 사랑해가 되버렸어요.

  1. 지돌스타

    이거 프로그램안에 쓰이는 이벤트를 일괄적으로 정리하는데 큰 도움이 되겠군요.
    이벤트를 많이 쓰다보면 출발점과 도착점을 헷갈리는 경우가 많은데...
    이렇게 Map으로 관리하면 적어도 도착점을 바로 알 수 있으니 훨씬 쉬워지겠군요.
    좋은 글입니다.

    • 머드초보

      넵 이벤트를 EventMap에서 다 정리가 되어있어요.
      저 맵대로 이벤트가 발생을 하도록 되어있는 프레임워크더라구요.
      저두 더 봐야하는데 ^^
      방문해주셔서 감사해요~ ^^

  2. 아이

    정말 대단한데!!!

    • 머드초보

      응 대단한 프레임워크인 것 같은데, 아직초반이라 뭔가 버그도 많고, 디버깅도 힘들고, 아직 쓸만한게 못돼-_-;

  3. 꽃녀

    머드님 저거 틀린거 같네요..

    i'm so sorry but i love you g r ji ma yo...인데..

    암쏘쏘리벗알러뷰그르지마요.

  4. 정태현

    덕분에 암소땡큐땡썰랏 다 진짜야~ 퍼갈께요.

    • 머드초보

      아네 도움이 되셨다니 다행이네요^^
      Mate Flex Framework가 아직은 검증되지 않아서-_-;
      실무에서 사용하시는 것은 좀 추천하고 싶지 않습니다-_-;

  5. Flex 초보

    머드초보님 좋은 정보 감사합니다..;^^
    저도 mate 에 대해 공부 중인데.. 요.. sample을 따라 하다 보니..
    MainEventMap.mxml에서 <properties helloResult="{lastReturn}"/> 요 라인에..
    Could not resolve <properties> to a component implementation. 이라고 에러 메시지 뜨는데요..
    어떻게 해야 하나요?

    알려주세요^^:;

    • 머드초보

      안녕하세요!
      P가 아마도 대문자일겁니다-_-;
      한번 해보시고 연락주세요~

  6. adf

    adfffffffff

  7. 아 이런;

    아..머드님

    MATE Error: Method not found, turn on the debugger for more information
    EventType:sayhelloevent. Error was found in a EventHandlers list in file MainEventMap

    에러가 뜨고 안됩니다 ㅠ

    • 머드초보

      메소드가 없다고 하는 걸보니.....-_-
      근데 제가 mate안한지 오래되어서-_- 소스를 볼 수 있을까요?-_-

[로그인][오픈아이디란?]

submit

우선 service-config.xml파일을 수정해야합니다.
<factories>
  <factory id="springfactory" class="flex.messaging.factory.SpringFactory" />
</factories>
를 추가합니다.

그 다음 remote-config.xml파일을 수정해야합니다.
<destination id="productmanager">
 <properties>
  <factory>springfactory</factory>
  <source>productManager</source>
 </properties>
</destination>
자세히 보시면 factory는 위에 service-config.xml파일에 정의한 놈이고, source는 bean이름입니다.
즉 applicationContext.xml파일에 정의한 그 bean이름을 저기에 적어 놓으면 됩니다.
그러면 그 bean을 flex로 가져와서 쓸 수 있습니다.

아 그리고 프로젝트에서 이상하게 contextroot가 WebContent로 되어있는데 프로젝트이름으로 고쳐줍시다-_-;
프로젝트 이름에 대고 마우스오른쪽버튼(alt+enter) properties를 선택, Flex Server부분 클릭.
context root를 프로젝트이름(SpringAndBlazeds)으로 바꿔줍시다.

자 그러면 flex_src에 있는 SpringAndBlazeds.mxml을 수정해봅시다.
SpringAndBlazeds.mxml


<?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.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.RemoteObject;

private function init():void {
var remoteObject:RemoteObject = new RemoteObject();
remoteObject.destination = "productmanager";
remoteObject.addEventListener(ResultEvent.RESULT, resultHandler);
remoteObject.addEventListener(FaultEvent.FAULT, faultHandler);
remoteObject.getProducts();
}

private function resultHandler(event:ResultEvent):void{
dg.dataProvider = event.result;
}

private function faultHandler(event:FaultEvent):void{
Alert.show("실패 메세지 : " + event.fault.message);
}
]]>
</mx:Script>

<mx:DataGrid id="dg" width="100%" height="100%" />
</mx:Application>

간단하게 Manager에 있는 getProducts를 호출해서 DataGrid에 넣는 코드입니다.

자 이제 실행해봅시다-_-;
이클립스 오른쪽아래에 server에다가 SpringAndBlazeds프로젝트를 추가합니다.
서버에 대고, 오른쪽버튼누르면, Add and Remove Project클릭해서 추가하면 됩니다.
서버를 가동합니다.
Run Flex Application을 실행해봅시다!-_-;
사용자 삽입 이미지


아....잘되....는.....군.....요......-_-;
  1. 검쉰

    좋은 정보 감사합니다. ;)
    한번 시도해봐야겠습니다. ㅎ

    • 머드초보

      아네 항상 방문해주셔서 감사합니다 ^^
      스프링과의 연동은 정말 강력해요!-_-;

  2. 비밀방문자

    관리자만 볼 수 있는 댓글입니다.

    • 머드초보

      안녕하세요! 소스는 지금 보고 계시는 게 소스입니다 ^^
      잘 안되시나요? 연락주세요~ ^^

  3. 비밀방문자

    관리자만 볼 수 있는 댓글입니다.

    • 머드초보

      안녕하세요~
      입력 수정 삭제 모듈이라 함은 어떤걸 말씀하시는건가요? ㅠ

[로그인][오픈아이디란?]

submit

이제 Manager클래스를 만들어봅시다.
실제로 BlazeDS를 이용해서 가져오는 놈은 이 Manager클래스가 되겠죠^^

Java Resources: src에서 오른쪽버튼 클릭하고, New를 해서 interface를 구현합니다.


package springapp.service;

import java.util.List;
import springapp.domain.Product;

public interface ProductManager {
public List<Product> getProducts();
}

getProducts라는 메소드가 하나 있군요! 구현해봅시다!!!

package springapp.service;

import java.util.List;

import springapp.dao.ProductDao;
import springapp.domain.Product;

public class ProductManagerImpl implements ProductManager {

private ProductDao productDao;

@Override
public List<Product> getProducts() {
return productDao.getProductList();
}

public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
}

getProducts라는 함수는 Dao에서 getProductList를 호출하는 놈이네요.
요 아래에는 setter가 있네요. 이건 spring에서 DI를 하기위해 존재하는 setter입니다^^
서비스도 완성이 되었네요! 이제 설정파일을 작성해봅시다.

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- Enable @Transactional support -->
<tx:annotation-driven />

<!-- Enable @AspectJ support -->
<aop:aspectj-autoproxy />

<aop:config>
<aop:advisor pointcut="execution(* *..ProductManager.*(..))"
advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="save*" />
<tx:method name="get*" read-only="true" />
</tx:attributes>
</tx:advice>

<bean id="productManager"
class="springapp.service.ProductManagerImpl">
<property name="productDao" ref="productDao" />
</bean>

</beans>

Dao부분의 설정파일인 applicationContext-ibatis.xml파일을 봅시다.
applicationContext-ibatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:properties/jdbc.properties" />

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
p:username="${jdbc.username}" p:password="${jdbc.password}" />

<!-- Transaction manager for iBATIS Daos -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:springapp/dao/SqlMapConfig.xml" />
</bean>

<!-- Add additional Dao definitions here -->
<bean id="productDao"
class="springapp.dao.ProductDaoImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>

</beans>

jdbc.properties파일은 properties라는 package를 만들고, jdbc.properties파일을 넣어버립시다.

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://DB주소
jdbc.username=DB아이디
jdbc.password=DB비밀번호

이 설정들의 bean들의 관계를 보고 싶다면-_-;
Spring Elements에서 오른쪽버튼 클릭하고 properties를 선택.
Bean Support를 선택, Add한 뒤 두개의 설정파일(applicationContext.xml, applicationContext-ibatis.xml)선택.
Config set에서 New하고 Name에 applicationContext라고 하고, 두개다 체크 오케이~
그럼 이제 스프링 설정파일에서 에러를 찾아낼 수 있어요!
bean들의 관계를 그래프로도 볼 수 있네요!
Config set에 추가한 applicationContext에다가 마우스오른쪽버튼을 클릭하면 open graph로 볼 수 있어요!

이제 클라이언트 구현으로....다음 시간에-_-;

  1. 가을우체국

    안녕하세요?? 위에 있는 내용으로 작성 실행을 해보려고 하니
    아래에 있는 코드가 오류가 나네요.ㅠㅠ

    <bean id="productDao"
    class="springapp.dao.ProductDaoImpl">
    <property name="sqlMapClient" ref="sqlMapClient" />
    </bean>

    Build path is incomplete. Cannot find class file for com/ibatis/sqlmap/client/SqlMapClient 이란
    오류가 왜 나는지 알수가 없어서 글을 남겨 봅니다..ㅠㅠ

    혹 가능하심 함 봐주세요.. (네이트 :maroon0@nate.com )

    • 머드초보

      그 클래스를 못찾는 것 보니....
      iBATIS라이브러리파일이 없는 것 같은데요.
      ibatis~~~.jar파일을 혹시 넣으셨나요?

  2. 모라이

    설정파일 applicationContext.xml에서
    <bean id="productManager" class="springapp.service.ProductManagerImpl">
    <property name="productDao" ref="productDao" />
    </bean> 이 부분에 아래와 같은 에러가 납니다.
    No setter found for property 'productDao' in class 'springapp.service.ProductManagerImpl'
    setter가 없다는거 같은데 ProductManagerImpl소스 안에
    public void setProducts(ProductDao productDao){
    this.productDao = productDao;
    }//setProducts
    setter 잘 있거등요 ㅠㅠ 왜이런지 모르겠어오. 도움 부탁드립니다~

    • 머드초보

      아.....습흐링을 안하지 꽤 되어서...-_-
      일단....몬가 셋팅오류인 듯 합니다.
      저도 스프링할 때 많은 에러를 봐왔는데...
      일단은...저도 해보질 않아서 잘 모르겠네요 ㅠㅠ

[로그인][오픈아이디란?]

submit

http://mudchobo.tomeii.com/tt/236 에 이어서-_-;
이제 셋팅이 끝났으면 코딩을 해봅시다.

※이 예제는 스프링프레임워크에서 제공하는 스텝바이스텝 예제의 일부를 조금 수정한 것 입니다.

우선 DB구조입니다-_-;


CREATE TABLE `products` (
`id` int(11) NOT NULL,
`description` varchar(255) default NULL,
`price` decimal(15,2) default NULL,
PRIMARY KEY (`id`),
KEY `products_description` (`description`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr;

INSERT INTO `products` (`id`, `description`, `price`) VALUES
(1, 'Lamp', 391.50),
(2, 'Table', 2918.85),
(3, 'Chair', 884.27);


그냥 src폴더는 자바서버단 폴더구요. flex_src폴더는 플렉스클라이언트단 폴더입니다^^
우선 스프링을 사용할 수 있게 web.xml파일을 수정해봅시다.
web.xml파일을 열어서 코드를 추가합니다.

web.xml

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

applicationContext*라고 적어 놓은 이유가 ibatis랑 분리를 하려고-_-;
설정파일은 applicationContext.xml과 applicationContext-ibatis.xml 두개를 사용할껍니다.

src에다가 코딩을 해봅시다.
java는 perspective를 Java EE로 바꾸고 합시다-_-;

우선 domain부분에 ValueObject를 하나 만들어봅시다-_-;
Java Resources:src에다가 New를 하고 class를 선택합니다.
package는 springapp.domain이라고 하구요.
Name은 Product라고 하고 Finish

package springapp.domain;

public class Product {

private int id;
private String description;
private Double price;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public Double getPrice() {
return price;
}

public void setPrice(Double price) {
this.price = price;
}
}

ProductDao를 만들어봅시다.
Java Resource:src에 New해서 interface를 추가합시다.
package에다가 springapp.dao라고 써놓고,
Name에다가 ProductDao라고 씁시다-_-;

package springapp.dao;

import java.util.List;

import springapp.domain.Product;

public interface ProductDao {
public List<Product> getProductList();
}

딸랑 ProductList만 가져오는 메소드가 있어요!
저 Dao인터페이스를 구현해봅시다!!!

package springapp.dao;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import springapp.domain.Product;

public class ProductDaoImpl extends SqlMapClientDaoSupport implements
ProductDao {

protected final Log logger = LogFactory.getLog(getClass());

@SuppressWarnings("unchecked")
@Override
public List<Product> getProductList() {
logger.info("Getting products!");
return getSqlMapClientTemplate().queryForList("getProductList");
}
}

ibatis부분인데요. 설정파일을 보도록 하겠습니다.

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
<typeAlias alias="Product" type="springapp.domain.Product"/>

<sqlMap resource="springapp/dao/MySQLProduct.xml" />
</sqlMapConfig>

alias지정해주고, resource는 MySQLProduct.xml파일이네요. 보도록 합시다.

MySQLProduct.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Product">

<resultMap id="ProductMap" class="Product">
<result property="id" column="id" />
<result property="description" column="description" />
<result property="price" column="price" />
</resultMap>

<select id="getProductList" resultMap="ProductMap">
select id, description, price from products
</select>

</sqlMap>

getProductList라는 것은 products테이블에서 내용을 select하는 것이네요.
Dao가 완성되었네요! 너무 길어지니 다음이시간에-_-;

  1. IxU

    언제나 많은 도움이 되고 있습니다.
    감사합니다.^_^

    getSqlMapClientTemplate().queryForList("getProductList";);
    요기에서요.
    queryForList 는 인자가 2개가 필요한거 같은데...
    제가 잘못 알고 있나요??

    • 머드초보

      안녕하세요~
      2번째 인자는 있어도 되고 없어도 됩니다.
      파라메터가 없는 경우 안넣어도 되겠죠 ^^

  2. IxU

    아... 죄송합니다.
    spring버전 문제 였네요.
    제가 사용하고 있던게 1.2.8 이었거든요.
    1.2.8에서는 인자를 한개만 받는 메서드가 없었네요.

    확인도 안해보고 질문드린 점 죄송합니다.
    즐거운 추석 보내세요.^-^

    • 머드초보

      헉 그렇군요 ^^
      1.x버전의 스프링은 사용해보지 않아서 ㅠ
      IxU님도 추석 잘보내세요~^^

[로그인][오픈아이디란?]

submit
초간단시리즈-_-;
스프링에 있는 bean을 플렉스에서 가져다가 쓸 수 있어요!
멋져요!-_-;

우선 준비물! 저의 테스트 환경입니다.
Eclipse IDE for Java EE Developers  : http://www.eclipse.org/downloads/
Flex Builder 3 Eclipse Plug-in(로그인후받을 수 있음) :
http://www.adobe.com/cfusion/tdrc/index.cfm?product=flex_eclipse
JDK 6 update 5 : http://java.sun.com/javase/downloads/index.jsp
Apache Tomcat 6.0.16 : http://tomcat.apache.org/download-60.cgi
Spring Framework 2.5.2 : http://www.springframework.org/download
BlazeDS : http://opensource.adobe.com/wiki/display/blazeds/Downloads
Spring과 BlazeDS연동라이브러리 : blazeds-spring-beta1.jar 현재 beta1이군요.
http://www.igenko.org/archiva/repository/igenko/com/adobe/flex/blazeds-spring/
JDK6을 먼저 설치를 합니다.
이클립스는 받아서 그냥 압축을 풀어버립시다.
그리고, 플렉스빌더3 이클립스 플러그인을 설치 합니다.
톰캣은 ZIP버전이면 그냥 압축을 풀어놓고 JAVA_HOME을 잡아줍시다-_-;
스프링프레임워크는 lib파일을 가져다 쓸것이니 아무대나 압축을 풀어놓읍시다.

셋팅이 완료가 되었으면 이클립스를 띄웁시다.
File -> New -> Project선택, Flex Project선택 후 Next
Project이름은 SpringAndBlazeds라고 지어봅시다-_-;
Application Type은 Web Application이라고 하고, Application server type은 J2EE로 선택합니다.
넥스트를 하고 Target runtime에서 Tomcat을 설정해야합니다.
New한다음에 Apache폴더에 Tomcat 6.0을 선택하고, 해당 톰캣의 경로를 지정합니다.
Finish를 클릭하고, flex WAR파일을 선택하라고 하는데 받아놓은 blazeds.war파일을 선택하면 됩니다.
Finish를 클릭하면 끝납니다-_-; 셋팅이 완료가 되었어요!

이제 스프링IDE를 설치해봅시다.
이클립스메뉴에서 Help -> Software Updates -> Find And Install 선택
Search for new features to install를 선택 후 Next
New Remote Site선택 Name은 Spring IDE, url은 http://springide.org/updatesite/ 라고 씁니다.
추가한 것만 체크된 상태에서 Finish클릭!
Search Result에서 Spring IDE선택.
그러면 몇개는 설치 못하는데 설치 못하는 것은 체크해제를 시켜요-_-;
Dependencies에서 Spring IDE Dependencies 체크해제
Integration에서 Spring IDE AJDT Intergration 체크해제
AspectJ Development Tools도 설치하려면 하세요(전 사용할 줄 몰라요^^)
Next -> agree -> finish하면 설치가 됩니다.
설치가 다 되면 이클립스ide를 restart하라고 나와서 리스타트하면 돼요^^

그리고 우리가 만든 프로젝트에  마우스 오른쪽버튼을 클릭해서
Spring Tools -> Add Spring Project Nature선택 하면 완료됩니다.

필요한 라이브러리를 복사해봅시다.
dist/spring.jar : 스프링프레임워크를 쓰기 위해 꼭 필요한 놈.
dist/module/spring-test.jar : 스프링테스트 할 때 필요한 놈.
lib/jakarta-commons/commons-logging.jar : 로그찍을 때 필요한 놈.
lib/ibatis/ibatis-2.3.0.677.jar : ibatis쓸 때 필요한 놈.
lib/cglib/cglib-nodep-2.1_3.jar : Junit으로 테스트 할 때 필요한데, JUnit테스트를 할 때에는 Interface가 구현이 안되어있어서(aop를 사용하려면 interface가 구현이 되어있어야 한다고 하더군요) 필요한 놈.
lib/aspectj/aspectjweaver.jar : aop때문에 필요한 놈 같은데-_-;
lib/junit/junit-4.4.jar : JUnit을 사용하기 위해 필요한 놈.
mysql-connector-java-5.1.5-bin.jar : mysql Connector. db가 다른거면 다른 Connector가 있으면 돼요!
blazeds-spring-beta1.jar : 위에서 설명한 spring과 blazeDS와 연동할 때 필요한 놈.

셋팅은 여기까지-_-;
  1. 시난

    아주 훌륭한! 도움이 되는! (재밌죠?^^;)
    정말 좋은 자료네요. 저도 오늘 홧김에 함 해보고 있습니다. ㅎㅎ;
    열람료 센스 클릭 꾸욱~

    • 머드초보

      앗 시난님 또 방문해주셔서 감사합니다 ^^
      저거 스프링이랑 BlazeDS 잘 모르고 무작정 따라해서 만든예제라-_-;
      완전 허접해요-_-;
      도움이 되셨다니 다행입니다 ㅠㅠ

  2. 비밀방문자

    관리자만 볼 수 있는 댓글입니다.

    • 머드초보

      http://mudchobo.tomeii.com/tt/238
      글이 분할이 되어있어서요^^
      여기서 보시면 됩니다.

  3. 데이비슨

    안녕하세요. 플렉스 초보자 데이비슨입니다.
    저는 지금 LCDS를 이용해서 리모트 오브젝트를 사용하고 있는데요.
    지금 하고 있는 것을 스프링 프레임워크로 하려고 하는데
    LCDS에서 blazeds-spring-beta1.jar라이브러리를 사용해도 문제가 없나요.
    샘플을 사용해 보았는데, 돌아가는거 같은데 혹시 LCDS용라이브러리가 따로 있나 해서요!
    답변 주시면 감사하겠습니다.

    • 머드초보

      LCDS에서 사용해도 문제가 아마도 없을 겁니다.
      근데, 최근에 Spring에서 공식적으로 BlazeDS를 지원하기 시작했습니다.
      아마 LCDS에서도 될 듯 싶습니다.(해보진 않았습니다ㅠ)
      그 라이브러리를 사용하셔도 될 겁니다.

    • 데이비슨

      답변 감사합니다. 님글들을 읽고 플렉스의 개념을 잡고 있습니다. 블로그에 좋은 샘플들이 많아서 겁없이 도전해보고 있습니다. 감사합니다. 좋은 하루 되세요.

    • 머드초보

      아 감사합니다. 저는 제가 삽질한 것을 주로 올린거라 옳지 않은 것도 분명 있을 겁니다.
      개념은 책을 보시고 잡으시고, 제 삽질자료는 참조만 해주세요^^
      감사해요~

[로그인][오픈아이디란?]

submit