캠핑과 개발

출처 : http://cafe.naver.com/flexcomponent/12264

아시는 분들도 계시겠으나...
DataService 를 사용하지 않고 XML 응답만으로 Flex 를 개발할때
java 서버측 구현에 쉽게 적용 가능한 Caster 라는 XML 변환 프레임웍을 소개해 드립니다.

아래의 링크에서 Caster 를 다운로드 받습니다. 샘플도 많습니다. 다운받으세요~
http://www.castor.org/download.html

아래의 링크는 맵핑에 관련된 설명입니다.
http://www.castor.org/xml-mapping.html


간단히 소개해 드리자면
------------------------------------------------
Java결과객체 → Caster프레임웍 → 변환된 XML
                                ↑
                       XML맵핑룰.xml
------------------------------------------------
와 같이 동작하는 매우 일반적 형태의 프레임웍입니다.

 

바로 사용할 수도 있으나 사용의 편이성을 위해 아래와 같은 클래스를 맹길었습니다.

 

public class CasterMapper {

    /** XML 맵핑 객체 */
    Mapping mapping;

    // .. 스트림이나 파일을 받는 생성자 등등등...

    /**
     * XML 파일을 객체로 변환한다
     * @param xmlIn
     * @return
     * @throws MappingException
     * @throws ValidationException
     * @throws MarshalException
     */
    public Object xmlToObject(Reader xmlReader)
            throws MappingException, MarshalException, ValidationException {
        Unmarshaller unmarshaller = new Unmarshaller(this.mapping);
        return unmarshaller.unmarshal(new InputSource(xmlReader));
    }

 

    /**
     * 객체를 XML 로 변환한다.
     * @param obj
     * @param xmlOut
     * @throws IOException
     * @throws MappingException
     * @throws ValidationException
     * @throws MarshalException
     */
    public void objectToXml(Object obj, Writer xmlWriter)
            throws IOException, MappingException, MarshalException, ValidationException {
        Marshaller marshaller = new Marshaller(xmlWriter);
        marshaller.setMapping(this.mapping);
        marshaller.marshal(obj);
    }
}

 

그리고 Flex의 요청에 대한 응답을 처리하는 Servlet 내에서 아래처럼 결과객체를 변환하여
응답을 보냅니다.

 

    // #. 결과객체 (변환하고자 하는 객체)
    Object resultObject = new Object(); // 개인마다 DB의 결과를 담은 다른 클래스형의 객체가 들어갈겁니다...

    // #. 맵핑룰 XML 얻기
    InputStream xmlInputStream = getClass().getResourceAsStream("test_ed_mapping.xml");
    CasterMapper mapper = new CasterMapper(xmlInputStream);

    // #. print response
    mapper.objectToXml(resultObject, response.getWriter());

 

 

아래는 test_ed_mapping.xml 의 예로서 전체 XML응답전문을 Header 와 Body 로 구분하고
사용자 목록을 출력하도록 지정했습니다.

맵핑전문은 아래와 같은 특징이 있으니 잘 살펴보시기 바랍니다.
- Element(태그)는 클래스와 맵핑된다.
- 값은 Attribute 나 Element 로 표현될 수 있다.
- 위쪽에서 사용된 클래스에 대한 정의로 바로 아래에서 표현한다.

 

test 로 시작되는 패키지 내의 Class 는 개인적으로 만드셔야 합니다.
전문을 눈여겨 보면 어렵지 않게 클래스를 만들수 있으시라라 생각됩니다.
참고로 PagingList 란 넘은 java.util.ArrayList 형의 list 어트리뷰트를 가지고 있습니다.

 

<?xml version="1.0"?>
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd">

<mapping>

    <class name="test.common.xml.ed.XmlResponse">
        <map-to xml="response"/>
        <field name="header" type="test.common.xml.ed.XmlHeader">
            <bind-xml name="header" node="element"/>
        </field>
        <field name="body" type="test.common.xml.ed.XmlBody">
            <bind-xml name="body" node="element"/>
        </field>
    </class>

    <!-- HEADER -->
    <class name="test.common.xml.ed.XmlHeader">
        <map-to xml="header"/>
        <field name="id" type="java.lang.String">
            <bind-xml name="id" node="attribute"/>
        </field>
        <field name="group" type="java.lang.String">
            <bind-xml name="group" node="attribute"/>
        </field>
        <field name="code" type="java.lang.String">
            <bind-xml name="code" node="attribute"/>
        </field>
        <field name="message" type="java.lang.String">
            <bind-xml name="message" node="attribute"/>
        </field>
    </class>

    <!-- BODY -->
    <class name="test.common.xml.ed.XmlBody">
        <map-to xml="body"/>
        <field name="obj" type="test.common.xml.ed.PagingList">
            <bind-xml name="users" node="element"/>
        </field>
    </class>

    <!-- Users -->
    <class name="test.common.xml.ed.PagingList">
        <map-to xml="users"/>
        <field name="list" type="test.beans.User" collection="arraylist">
            <bind-xml name="user" node="element"/>
        </field>
    </class>

    <!-- USER -->
    <class name="test.beans.User">
        <map-to xml="user"/>

        <field name="id" type="java.lang.String">
            <bind-xml name="id" node="attribute"/>
        </field>

        <field name="name" type="java.lang.String">
            <bind-xml name="name" node="attribute"/>
        </field>

        <field name="email" type="java.lang.String">
            <bind-xml name="email" node="attribute"/>
        </field>
    </class>
</mapping>

 

 

이리하여 결과는 아래와 같습니다.

DB의 사용자 테이블에 질의한 쿼리의 결과가 User 객체의 List 로 반환이 되었다고 가정하고

이것에 대한 서블릿의 결과는 다음과 같습니다.

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <header>
        <id>test.ViewMembers</id>
        <group>admin</group>
        <code>0000</code>
        <message>SUCCESS</message>
    </header>
    <body>
        <users>
            <user id="honggildong1" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong2" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong3" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong4" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong5" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong6" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong7" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong8" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong9" name="길동이" email="honggildongika@gildong.com"/>
            <user id="honggildong10" name="길동이" email="honggildongika@gildong.com"/>
        </users>
    </body>
</response>

 

편리하겠죠?

기존 JSP 로 작성된 시스템에서 Flex Client로 전환시 Layer 가 잘 나눠져 있다면
아주 쉽게 커스터마이징 가능하리라 생각됩니다.


간단한 내용이나 걍 참고하시라고 적어봤습니다.

 

[참고링크]
이곳에 뉴스그룹이 있으니 기타 트러블슈트 참고하시고요~
http://www.mail-archive.com/castor-dev@exolab.org/


'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글

FLEX - Style Exploer  (0) 2010.01.19
Flex 흐르는 텍스트 효과  (0) 2010.01.12
Flex 컴포넌트의 비율 유지  (0) 2009.12.21
Flex와 Java간 소켓 통신  (1) 2009.12.21
XML과 E4X 다루기  (0) 2009.12.20