본문 바로가기

Knowhow/Programming

[스크랩] 매크로미디어 Flex를 활용한 J2EE 어플리케이션 구축 조회(39)

[스크랩] 매크로미디어 Flex를 활용한 J2EE 어플리케이션 구축
조회(39)
프로그래밍 | 2005/09/13 (화) 14:18
추천 | 스크랩
OnJava에 새로 올라온 아티클 'Integrating Macromedia Flex with Java'를 읽고, 정리해봅니다.
 
아티클에서 브라우저의 제약을 언급하고 있는데
  • Browsers interpret scripting languages, such as JavaScript, in an inconsistent manner. This forces developers to write the same code multiple times to accommodate each browser.
  • Simple user interface effects such as tabbing, wizard-based forms, and large tabular data set handling, can be cumbersome to develop and require a lot of extra coding on a browser.
  • HTML is a limited, static markup language that cannot be extended.
  • Event handling within the user interface can be challenging. Because the rendered HTML pages can only be displayed one at a time, events cannot update another page without going back to the server.
  • Serialization of application state can be achieved only through cookies, which do not support objects.
  • It is nearly impossible to develop occasionally connected clients using a browser.
     
    웹 개발을 해본 사람은 쉽게 접할 수 있는 문제들이죠.
     
    최근에 브라우저의 제약을 극복하기 위한 많은 시도들이 일어나고 있습니다.
    아티클에서 다루는 Flex도 그 중 하나로 볼 수 있지만
    JCP에서 주도하는 JSF도 그 중에 하나이구요.
    XUL인가 하는 마크업도 이런 류죠.
     
    저자는 이를 RIA(Rich Internet Application)라고 표현했네요. RIA 클라이언트를 위한 기술의 예로 다음과 같은 것들을 말합니다.
    JDNC (JDesktop Network Components), Laszlo, Thinlet, Java Web Start, and Macromedia Flex.
     
    Flex는 매크로미디어의 상용 프리젠테이션 기술이다.
    Flex는 플래시 플러그인을 실행 환경으로 활용한다는 점에서 이식성이 매우 우수하다.
    Flex 개발자는 일종의 XUL인 MXML(Macromedia Flex Markup Language)ActionScript 2.0(자바스크립트와 유사한 ECMA 호환 언어)을 사용할 수 있다.
     
    이전글(Struts, Spring, 그리고 Hibernate)에 언급했었던


    위와 같은 레이어링에 기초하여 저자는 Flex와의 통합을 이야기하고 있다.
     


    그러나, 위와 같이 하면, Presentation 레이어가 중복된다.
     


     
    위와 같은 2중 구조가 바람직한 모델이라고 할 수 있다.
    브라우저를 이용하는 경우는 Struts 등을 이용하고, Flex를 이용하는 경우는 Flex AMF(ActionScript Messaging Format) Gateway와 Delegate Layer가 서버측 프리젠테이션을 담당한다.
     
    Flex + Business Delegates + Spring Framework + Hibernate
     


    결국 Flex 활용시는 위와 같이 된다.
     
    이때, 서버의 flex-config.xml에 설정되는 Delegate 객체의 예는 다음과 같다.
     
    <object name="OrderBusinessDelegate">
       <source>
          com.meagle.flexro.FlexBusinessDelegate
       </source>
       <type>stateless-class</type>
       <use-custom-authentication>
          true
       </use-custom-authentication>
       <allow-unnamed-access>
          false
       </allow-unnamed-access>
       <roles>
          <role>OrderUser</role>
          <role>Admin</role>
       </roles>
    </object>
    Flex 클라이언트에서 원격 호출을 하기 위해 사용하는 MXML 코드의 예는 다음과 같다.
     
    <mx:RemoteObject id="soapro"
       named="OrderBusinessDelegate"
       protocol="https"
       showBusyCursor="true">
       <mx:method name="saveNewOrder"
                  result="saveNewOrder_result(event)"
                  fault="faultHandler(event.fault)"/>
       <mx:method name="findOrderById"
                  result="findOrderById_result(event)"
                  fault="faultHandler(event.fault)"/>
       <mx:method name="updateOrder"
                  result="updateOrder_result(event)"
                  fault="faultHandler(event.fault)"/>
    </mx:RemoteObject>

    <mx:Model id="roModel" >
       <!-- The object graph for the Order object
               will be stored here -->
       <Order/>
    </mx:Model>
    다시 그림을 상기시켜보면


    이제 남은 것은 데이터 전송을 위한 자바 객체, 즉 DTO(Data Transfer Object)인데, 예를 보자.
     
    package com.meagle.bo;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;

    /**
    * This object represents an order.
    * @hibernate.class table="TestOrder"
    * @author meagle
    */
    public class Order {
       private int id;
       private double total;
       private int version;
       private String userName;
       private List orderLineItems = new ArrayList();

      // other fields and getter/setter methods not
      // shown to save space
    }
     
    ActionScript 용으로도 같은 것이 필요하다.
    Flex 서버와 클라이언트 사이에서 주고 받기 위해 필요하겠지.
     
    /**
    * Generated Action Script Object
    * for com.meagle.bo.Order. Do not edit!
    */
    class com.meagle.bo.Order extends Object {

       public function Order(){}

       public static var regClass =
          Object.registerClass("com.meagle.bo.Order",
                                com.meagle.bo.Order);

       var id : Number;
       var orderLineItems : Array = new Array();
       var total : Number;
       var userName : String;
       var version : Number;

       // other fields and getter/setter methods not
       //shown to save space
    }
     
    거의 자바 코드와 같아서 ANT나 XDoclet으로 생성할 수 있을 듯
     
    음.. 그리고 Hibernate와 연동할 때 다소 문제가 있다고 하는데
    이를 사용해본 일이 없어 무슨 소리인지 몰라 복사해놓는다. ㅡㅡ;
    There are a couple of pitfalls when using Hibernate and remote objects with Macromedia's AMF gateway. Hibernate users know you cannot access a lazy loaded collection that has not been initialized with a Hibernate Session object. Accessing a collection of dynamic proxy objects that has not been initialized will result in a runtime exception. The AMF gateway does not know how to specifically look for Hibernate dynamic proxy objects. A potential solution is an aspect-oriented programming (AOP) interceptor that can take the object that is about to be sent over the AMF gateway in the delegate object and remove the dynamic proxies. This process involves sending the resultant object through the interceptor class, which recursively looks for proxy objects that use reflection and that are not initialized. If any lazy proxy objects or collections are found then they are set to null. This is a cross-cutting concern that can be applied as an aspect using an AOP language such as JBoss AOP, AspectJ, Spring AOP, and so on. The AOP interceptor should be applied to objects in the business delegate layer. Figure 4 shows what this looks like in the application architecture:
  • 원본 : 매크로미디어 Flex를 활용한 J2EE 어플리케이션 구축