Whiteship's Note


[NullPE] SpEL 때문에 고민 해결

Java : 2010.02.10 18:47


애초에 MVEL.eval() 내부에서 레퍼런스를 타고 갈 때 null 처리를 해줄 수 있는 방법을 찾았다면 Null Object 패턴까지 적용할 생각은 안 들었을테고, 그럼 Null Object 패턴을 어떻게 적용해야 깔끔한가?에 대한 고민도 안했을 텐데.. 그 실마리가 바로 MVEL 대신 SpEL을 사용하는 것이었습니다. 이론... OTL

SpEL은 스프링 3.0에 새로 추가된 기능인데 이 녀석이 할 수 있는 멋진 일들에 비해 아직 이것을 어떻게 활용해야 할지 제대로 파악이 되지 않은 상태입니다.(제가 파악이 안됐다는 것이지 일반적으로 그렇다는 것이 아니오니 오해 마시기 바랍니다.)


/**
 * Created by IntelliJ IDEA.
 * User: whiteship
 * Date: 2010. 2. 10
 * Time: 오후 6:38:11
 */
public class SpELNullTest {

    @Test
    public void SafeNavigation(){
        ExpressionParser parser = new SpelExpressionParser();

        SpringSprout ss = new SpringSprout();
        StandardEvaluationContext context = new StandardEvaluationContext(ss);

        String myName = parser.parseExpression("whiteship?.name").getValue(context, String.class);
        assertThat(myName, is(nullValue()));
    }

    class Whiteship{
        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    class SpringSprout{
        Whiteship whiteship;

        public Whiteship getWhiteship() {
            return whiteship;
        }

        public void setWhiteship(Whiteship whiteship) {
            this.whiteship = whiteship;
        }
    }

}

흠냐.. 괜찮군요!

?. 가 아니라 그냥 . 로 연결하면 null 객체에 대고 getName()을 호출하는 격이라 에러가 납니다. ?, 연산식이 SpEL에서 지원하는 Safe Navigation이라는 녀석입니다.

이것 말고도 삼항 연산식도 제공하며 삼항 연산식에서 반복을 줄일 엘비스 연산식도 제공합니다. 아무튼 스프링은 참.. 멋지네요. +_+

덕분에 NullPE 고민 해결입니다.
top

TAG NullFE, SpEL

[NullPE] NullPointerException 때문에 고민 1

Java : 2010.02.10 11:46


레퍼런스를 사용하는 쪽에서 null 체크를 하면 되지만.. 그러지 못하는 경우가 있어서..

MVEL.eval(column.getPath(), entity, Integer.class)

column의 getPath()에는 item의 속성을 타고 타고 들어가는 경로도 들어옵니다. 그럴 때 타고 가는 중간에 null을 만나면 에러가 나죠. 제어할 수가 있다면 null 체크 하는 구문만 넣어서 버그를 수정하겠지만.. 지금은.. 좀.. @_@;;

그래서 Null Object Pattern이라는게 생각났고 이걸 적용해볼까 했습니다.

http://www.refactoring.com/catalog/introduceNullObject.html
http://en.wikipedia.org/wiki/Null_Object_pattern

Item 클래스의 레퍼런스 타입 변수를 반환하는 게터들이 다음과 같이 바꼈습니다.

    public Code getDelivery() {
        return NullObjectUtil.eval(delivery);
    }

    public Code getCar() {
        return NullObjectUtil.eval(car);
    }

    public Code getItemGroup() {
        return NullObjectUtil.eval(itemGroup);
    }

    public Supp getSupp() {
        return NullObjectUtil.eval(supp);
    }

public class NullObjectUtil {
   
    public static Code eval(Code code) {
        return code != null ? code : new NullCode();
    }

    public static Supp eval(Supp supp) {
        return supp != null ? supp : new NullSupp();
    }
}

그리고 domain.nullobject 패키지를 만들고

public class NullCode extends Code {
}

public class NullSupp extends Supp {
}

이렇게 NullObject 클래스들을 만들어 줬습니다.

이렇게 할지;;;

public Code getProcess(){
    return Code.basicIfNull(process);
}

이런식으로 할지. 고민입니다. 어떤게 왜 나은걸까나;; @_@


top


WEB-INF/urlrewrite.xml 파일 설정하기

Java : 2010.02.09 18:02


http://tuckey.org/urlrewrite/manual/3.0/

일욜에 보던건데. 이제서야 다시 정리하고 싶어져서;; 쿨럭;;

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

    <!DOCTYPE urlrewrite
        PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
        "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

    <urlrewrite>

        <rule>
           <from>^/some/olddir/(.*)$</from>
           <to type="redirect">/very/newdir/$1</to>
        </rule>

        <rule match-type="wildcard">
           <from>/blog/archive/**</from>
           <to type="redirect">/roller/history/$1</to>
        </rule>

    </urlrewrite>

파일 이름은 urlrewrite.xml로 해야하고 위와 같은 형태로 작성하면 됩니다. urlrewrite 엘리먼트가 반드시 들어있어야 하며, 그 안에는 최소한 한 개의 rule 엘리먼트가 들어있어야 합니다.

rule 엘리먼트 안에는 from과 to가 각각 하나씩 반드시 있어야 하며, condition와 set 엘리먼트는 없거나 여러 개 있어도 됩니다.

rule 안에 정의한 condition이 만족하면 from이 요청 URL에 적용되고 set 엘리먼트가 실행되고 to가 적용 됨.

아래는 수도 코드

    Pattern.compile(<from> element);
    pattern.matcher(each request url);
    matcher.replaceAll(<to> element);
    if ( <condition> elements match && pattern matched ) {
       execute <run> elements (if any)
       perform <to> element (if any)
    }




top


UrlRewriterFilter 옵션

Java : 2010.02.07 20:12


http://tuckey.org/urlrewrite/manual/2.6/

UrlRewriterFilter 설정 파일을 다시 읽어 들일지 확인하는 주기 설정.
0은 계속해서 확인하고, 빈 값 또는 이 속성을 설정하지 않으면 다시 읽어 들일지 확인하지 않음.

    <init-param>
    <param-name>confReloadCheckInterval</param-name>
    <param-value>60</param-value>
    </init-param>

로그 수준을 설정한다.
사용할 수 있는 값: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, log4j, commons, sysout:{level} (ie, sysout:DEBUG)
기본값은 INFO

    <init-param>
    <param-name>logLevel</param-name>
    <param-value>DEBUG</param-value>
    </init-param>

status 페이지(UrlRewriter 설정 페이지 /rewrite-status)를 사용하지 않게 설정할 수 있다.
사용할 수 있는 값: true, false
기본값: true

    <init-param>
    <param-name>statusEnabled</param-name>
    <param-value>true</param-value>
    </init-param>


애플리케이션에서 필요한 경로와 중복되지 않도록 status 페이지 요청을 다른 경로로 변경할 수 있다.
반드시 /로 시작해야 한다.

    <init-param>
            <param-name>statusPath</param-name>
            <param-value>/status</param-value>
    </init-param>


top


UrlRewriterFilter 설치하기

Java : 2010.02.07 17:20


http://tuckey.org/urlrewrite/manual/2.6/

1. 다운로드 또는 메이븐

        <dependency>
            <groupId>org.tuckey</groupId>
            <artifactId>urlrewritefilter</artifactId>
            <version>3.1.0</version>
        </dependency>

2. web.xml에 필터 맵핑 추가하기

    <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3. WEB-INF 폴더에 urlrewrite.xml 파일 만들기

4. 애플리케이션 재시작하고 http://127.0.0.1:8080/rewrite-status 확인하기
top


"서블릿 매핑 규칙"과 "필터 순서 정하기 규칙"

Java : 2010.02.07 16:36


둘 다 web.xml과 관련이 있는 것인데 '서블릿 매핑 규칙'은 /* 와 /foo 로 서블릿 매핑이 되어 있을 때 만약 http://springsprout.org/foo 라는 요청이 왔을 때 /*로 매핑되어 있는 서블릿으로 갈 것이냐... /foo로 매핑되어있는 서블릿으로 갈것이냐와 관련이 있는 규칙입니다. web.xml에 설정되어 있는 순서에 따라 달라질까요? 글쎄요..ㅋ

'필터 순서 정하기 규칙'은 위와는 다릅니다. 서블릿 매핑은 결국 어떤 것 하나를 선택하는 문제지만 이건 여러 개가 선택되어도 문제가 없기 때문이죠. 대신 그들 사이의 순서가... 중요할 수도 있을텐데 그 순서가 어떻게 정해지는지 이해해야될 것 같습니다. (스프링처럼 Ordered 인터페이스를 적용해 줄 것이지 복잡하게 이게 뭐람 @_@)

서블릿 매핑 규칙(헤드 퍼스트 서블릿과 JSP 영문판 2판 619 페이지)

1. 먼저 요청한 URL과 정확히 일치하는 매핑을 찾습니다. 그게 없다면 디렉토리가 일치하는 매핑을 찾습니다. 그게 없다면 확장자가 일치하는 매핑을 찾습니다.

2. 만약 요청이 여러 개의 디렉토리 매핑 <url-patterm> 과 일치하다면, 그 중에서 가장 긴 매핑을 선택합니다. 예를 들어 /foo/bar/myStuff.do 요청이 왔을 때 /foo/bar/* 매핑이 /foo/* 매핑을 이기게 됩니다. 가장 구체적인 것이 위너가 됩니다.

필터 순서 정하기 규칙(헤드 퍼스트 서블릿과 JSP 영문판 2판 710 페이지)

1) 해당 URL 패턴에 대응하는 모든 필터는 DD(보통 web.xml)에 정의되어 있는 순서대로 체인에 놓는다. 즉 필터 선언 중 <url-pattern>을 사용하여 해당 순서대로 필터를 놓는다.

2) 위 과정이 끝난 뒤 <servlet-name>에 대응하는 것들을 DD에 정의되어 있는 순서대로 그 뒤에 이어서 놓는다.

해당 페이지에 퀴즈도 있으니 풀어보시면... 재미납니다.ㅋ
top


UrlRewriterFilter 소개

Java : 2010.02.07 16:00


http://tuckey.org/urlrewrite/

아파치 mod_rewrite와 같은 기능을 레진, 오리온, 톰캣 같은 J2EE 호환 웹 애플리케이션 서버에서 사용할 수 있도록 해주는 자바 웹 필터이다.

URL 재작성은 아파치 웹 서버에서 매우 흔히 사용하지만 자바 웹 애플리케이션 서버에서는 이용할 수 없었다.  이것을 사용하여 할 수 있는 주요 작업들은 다음과 같다.

- URL 간편화 / URL 추상화: URL을 간단하게 구성할 수 있고 애플리케이션의 기반 프레임워크 기술을 가릴 수 있다.
- 브라우저 감지: HTTP 헤더를 기반으로 URL을 재작성 할 수 있다.
- 날짜 기반 재작성: 날짜/시간을 기반으로 다른 URL로 포워딩 또는 리다이렉트 할 수 있다.
- 이동된 컨텐츠: 컨텐츠 이동을 편리하게 할 수 있다.
- 짧고/친화적인 URL(예, blah.com/latest 를 blah.com/download/ver1.2.46.2/setup.exe로 리다이렉트 시킬 수 있다.)
- 서블릿 매핑 엔진(Method Invocation 참조)

WEB-INF 디렉토리에 있는 urlrewrite.xml 이라는 xml 파일 한 개를 사용하여 설정한다.

대부분의 매개변수는 Perl5 스타일 정규 표현식 또는 와일드카드 표현식을 사용할 수 있다. 이 점이 매우 유용하다.




top


플렉스 컴폰넌트와 샘플 코드

Adobe : 2010.02.07 15:34


http://www.adobe.com/devnet/flex/tourdeflex/web/#docIndex=0;illustIndex=0;sampleId=100


오호.. 액션 스크립트를 MXML에 <mx:script> 를 사용하여 포함시킬 수도 있군요. 저기서 예제 코드들을 참조하면 될 것 같습니다.

JQuery 사이트에 있는 예제 코드들도 유용하게 참조해서 썼는데.. 플렉스도 비슷한 페이지가 있네요.
top


난 뉴스보다 기술에 더 관심이 많은 것 같다.

모하니?/Thinking : 2010.02.05 12:36


요즘 어도비 플렉스 기술에 살짝 관심을 가지기 시작했는데 이유는 Comet 또는 Revers Ajax라 부르는 기술 때문이다.

페이지를 가만히 띄워놓고 있지만 그 내부의 데이터는 시시각각 변하기 마련이다. 극적인 예를 들자면 '경매'나 '주식'이 그렇다. 하물며 봄싹 사이트는 안그런가. 이번 주 스터디 모임에 대해 어떤 댓글을 달렸을지 궁금해서 F5키를 연타해보곤 한다. 이 얼마나 귀찮은가. 그냥 한쪽 탭에 띄워놓고 다른 일 하다가 다시 그쪽 탭을 보면 새로 등록 된 댓글이 보이면 되는데 왜 내가 귀찮게 F5키를 눌러줘야 하는건지 말이다. 게다가 실시간 데이터가 가장 중요한 '이벤트' 들은 완전 F5키의 전쟁이다. 1초 아니 1밀리초라도 더 빨리 해당 시간에 들어가서 쿠폰이라도 어떻게 받아볼까.. 인기 교양 과목 하나라도 건져볼까.. 미친듯이 F5키를 눌러대던 학창 시절의 추억까지도 지져분하게 느껴진다. 그냥 얌전히 기다리고 있으면 제시간에 브라우저에 <시작> 이라는 문구만 떠주면 그런 손가락 노가다 따위는 안해도 될텐데 말이다.

그래서 난 사용자들이 좀 더 의사소통을 신속히 그리고 얌전히 할 수 있도록 Comet이니 Revers Ajax같은 기술이 필요하다고 생각했다. 험블 프로그래머님이 번역하신 책도 읽어봤고 서블릿 3.0 스팩도 보고 HTML 5 스팩도 대충 살펴봤다. 이미 나름대로의 Comet용 서비스를 제공하는 제티, 톰캣의 구현체도 살펴봤다. Dojo와 Bayuer(배여?)까지고 들락 거려봤지만 쉽지 않아 보였다. 서버 쪽에서 해줄 일도 보통이 아니고 클라이언트 쪽에서 해줄 일도 보통이 아니다. 나름 빠져들면 재밌을 것 같다는 생각도 들었다. 하지만 당장은 야크 쉐이빙에 빠져들 여력이 없다.

그러던 중 갑자기 어도비에서 메일이 왔다. 이게 왠 일. '난 자바 개발자인데 왠 플래시??' 라고 생각하던 중에 문뜩 떠올랐다. 그래. 차라리 플래시로 하면 더 간단하지 않을까? 어차피 사용자는 그게 코멧이던 플래시던 뭔 상관이겠어. 그냥 실시간으로 데이터만 후딱 보여주면 그만이지.

그래서 플랙스라는 걸 공부하고 있는데... 요즘 ipad를 발표한 스티브 잡스가 플래시 플레이어 코드가 더럽다고 애플 휴대용 제품들에서 지원하지 않겠다니 어쩌니 했나보다. 그래서 어도비에서도 그에 대한 반응으로 글을 올리고 어쩌구 저쩌구 했나본데... 

안하면 어떻고 하면 어떤가.. 안하면 아이폰 유저들은 웹 사이트에 뜨는 플래시가 안돌아가 가니까 불편을 느낄테고 아이폰 개발자들도 귀찮아 질테고 그럼 안드로이드만 신나는거 아닐까? 뭐 어차피 개발 플랫폼도 안드로이드가 편하다고 하니... 뭐.. 몰겠다. 난 그쪽 전문이 아니라 @_@;;

솔직히 난 저런거에 하나도 관심이 없다. 난 아이폰 개발자도 아니고 플래시 개발자도 아니고 스프링 하이버에 관심은 있지만 스프링이 VMWare에서 나와서 개빈킹이랑 손잡고 JBoss에 들어가서 '씸스프링'을 만들던 말던 내가 스프링 직원이나 하이버 직원이 아닌 이상 뭔 상관인가... ('씸스프링'이 나온다면 그거에 관심은 가겠지만..)

난 그냥 빨리 플랙스 기술을 익혀서 내가 원하는 서비스를 만들고 싶을 뿐이다.
top

TAG 어도비

[Flex] "Hello, Flex" with IntelliJ IDEA

Adobe : 2010.02.02 11:55


참조: http://www.adobe.com/devnet/flex/videotraining/xml/vid03.html

모든 언어나 프레임워크를 공부할 때 가장 먼저하는 일이 단순 메시지 출력인데 플렉스 강좌를 보니까 이클립스 기반의 플렉스 빌더를 가지고 설명하고 있습니다. 하지만 저는... 이클립스에 질려버렸고 요즘은 똑똑한 인텔리J랑 사이좋게 지내고 있기 때문에 인텔리J로 강의를 따라하고 있습니다.

이클립스를 사용하시는 분들은 플렉스 빌더를 받아서 위 동영상을 따라하시면 될 듯...

이 아래는 인텔리J에서 헬로우 Flex를 띄우는 과정입니다.

1. Flex SDK 다운 받기

http://opensource.adobe.com/wiki/display/flexsdk/Downloads

여기서 오픈소스가 필요하지 않다면 그냥 Free Adbove Flex SDK를 받습니다.
압축을 풀어서 적당한 위치에 놓고..

2. 인텔리J에서 Flex 프로젝트를 만듭니다.



3. 실행하기

3-1. Run Configuration을 만듭니다. MXML 파일을 우클릭하고 Create "HelloWorld" .. 메뉴를 클릭합니다.


3-2. 실행합니다.

사실 3-1 건너띄고 바로 실행해도 됩니다. 실행하면 SWF 파일이 열리고 버튼이 떠있고 클릭하면 메시지가 나옵니다. 메시지를 조금 수정해서 hello flex를 띄울 수 있습니다.

Run Configuration 파일을 열어서 SWF 파일말고 wrapper.html 파일을 선택한뒤 실행하면 자동으로 브라우저에 새 탭을 열고 SWF 파일을 브라우저에서 재생해 줍니다.

http://www.adoberia.co.kr/


팁. Flex 만드는 도중에 Pure ActionScript 어쩌구 메뉴를 체크하시면 MXML이 아니라 액션스크립트로 작성된 HelloWorld 예제를 볼 수 있습니다. 동작하는 방법은 그냥 단순 출력이라 이전거랑은 좀 다릅니다.

package {

import flash.display.Sprite;
import flash.text.TextField;

public class HelloWorld extends Sprite {
    public function HelloWorld() {
        var textField:TextField = new TextField();
        textField.text = "Hello, World";
        addChild(textField);
    }
}

이런 코드네요. 흠.. 자바랑 비슷해 보이면서도 뭔가 좀..  변수 선언할 때 타입이 아니라 이름부터 적는군..


ps: 흠.. 다른 웹 애플리케이션과는 어떻게 연동해야하려나;; 차차 나오겠지;?




top


나는 허접하고 비겁하다.

모하니?/Thinking : 2010.02.01 22:11


오늘 정말 아주 예전에 만났던 분께 메일을 받았다. 내가 처음 다녔던 직장의 선생님이신데 그분과 나는 교차점에서 만난 인연이라 굉장히 짧은 시간 몇마디 대화만 주고 받았던 기억이 난다. 한달을 다니다보니 내가 그 회사 생활과 맞지 않다는 생각이 들었고, 지금은 다 물거품이 되버렸지만 그때당시 나에게 굉장히 좋은 조건으로 이직 요청이 들어왔다.

나는 이직을 결심하고 사표를 냈다. 쉽지 않았다. 한달만에 사표라니.. 하지만 난 그럴수밖에 없었다. 내가 아무것도 할 수 없는 곳 보다는 나를 필요로 하고 더 많은 걸 배울수 있는 곳으로 가고 싶었다. 그뒤로 나에게 그 회사를, 그 회사에 나를 들여보내주신 분에게 절교(?) 비슷한 걸 당했고, 훗날 용서를 구하는 메일도 보내봤지만 실패했다. 하긴.. (용서는 없다라는 영화에서) 용서하는게 죽는것보다 힘들다고도 하던데...고작 한달을 다니고 그만 두겠다고 했으니 그리고 그분 입장에선 내게 소개해준 회사를 내가 이러쿵 저러쿵 토 단것처럼 볼 수도 있으니.. 그런 반응도 자연스러웠던 것 같다. (사실 용서보다는 오해를 풀고 싶은 생각이 크다.)

아무튼 그렇게 힘들게 첫 직장에 사표를 낸지도 언 2년이 지났다. 어쩌면 딱 이맘때 회사를 옮겼는데 그때 생각이 나셔서 연락하신 걸지도 모르겠다. 왜 이쯤만 되면 이직을 하고 싶은지 모르겠는데 요즘도 그때와 비슷한 고민을 하고 있다. 나를 좀 더 필요로 하는 곳으로 가고 싶다는 생각이 든다. 지금 난 직원이 단 한명 나뿐인 회사에 다니고 있고 미국으로 가기로 했던 계획은 물거품이 됐다. 프로젝트가 날아갔다. 그래서 더욱 미친듯이 스터디와 커뮤니티 활동에 열을 올리고 있는지도 모르겠다. 도무지 내 자신을 써먹을 곳이 없어서.. 그게 오직 스터디 밖에 없어서.. 이러는거 아닐까? 난 이제 일보다 스터디가 좋고 커뮤니티가 좋다. 물론 일에서 배울 수 있는 것도 많다. MRP의 굉장히 복잡한 로직이며, 까다로운 원가 관리, BOM의 이력관리는 또 얼마나 변화 무쌍한지.. 다들 게시판에 비할 수 없는 주옥같은 비즈니스 로직들이다. 하지만 이 로직들은 전부 사용자에 의해 달라진다. 기본 로직은 있지만 그걸쓰는 회사 나름의 방침이나 관습이 있기 때문에 정형화 할 수 없다. 따라서 사용자와 잦은 미팅과 피드백이 필요한데, 나의 고객도 이 회사의 직원처럼 딱 한명. 지금 회사의 대표님 뿐이며 일주일에 한 번 만나 미팅을 하면 다행인 정도로 의사소통 주기가 길다. 이쯤에서 나는 고민을 안할 수가 없다.

그래도 무라도 썰어야지라는 생각과 프리랜서라도 좋으니 나를 정말로 필요로 하는 곳을 찾아가자라는 생각이 대립한다. 2년전과 똑같은 고민이다. 그때는 내가 투입된 첫 프로젝트에 누를 끼치면서까지 나와서 내가 갈 길을 갔지만 결과는 반반이었다. 개발자로보나 인간적으로보나 정말 멋진 사부님을 만났지만 미국으로 가려던 플젝은 쫑이났다. 결국 요즘은 심난한 마음에 머리까지 뒤숭숭하지만 되도록이면 이번에는 무라도 썰어볼 생각이다.

장모님 말씀따라.. 집중하기가 조금 힘들겠지만 이정도쯤은 견뎌내야하는 것 아닐까? 고작 이정도에도 흔들리는 정신력이면 난 너무 허접한거 아닐까?

잘 좀 하자 기선아... ㅠ.ㅜ
top


플래시, 플렉스, 플래시 플레이어, 에어(Air) 비교

Adobe : 2010.02.01 12:54


참조: http://www.adobe.com/devnet/flex/videotraining/xml/vid01.html

Flash: Fl

비두얼 툴과 타임라인을 사용하여 애플리케이션 레이아웃과 액션스크립트를 만든다.

플래시가 액션스크립트를 컴파일하여 SWF 파일을 만든다.

애니메이션과 비주얼 엘리먼트를 작성하는데 최적화 되어있다.

Flex: Fx

비주얼 컴포넌트와 클래스로 구성되어 있는 프레임워크를 제공하며, 비주얼 레이아웃에 사용할 MXML과 비즈니스 로직에 사용할 액션스크립트 프로그래밍 언어를 제공한다.

MXML과 액션스크립트 코드를 액션스크립트로 변환한 뒤 SWF 파일로 컴파일 한다.

Adobe Flex SDK 오픈소스로 제공한다.

Adobe Flex Builder는 SDK를 포함하고 있으며 디자인, 개발, 테스팅을 원할하게 도와준다.

=> 플래시와 플렉스 모두 사용자가 서버에 요청을 하면 동적으로 데이터를 가져와서 다시 사용자에게 보여줄 수 있다.

=> 이 둘을 같이 활용하여 플래시로 애니메이션을 만들고 플렉스로 가져와서 컴파일/편집 할 수 있다.

Flash Player

플래시나 플렉스 애플리케이션을 브라우저에서 보려면 플래시 플레이어 9 런타임이 필요하다.

AIR

어도비 에어는 데스크탑 애플리케이션 용 어도비 런타임이다.

브라우저가 아니라 데스크탑 애플리케이션으로 동작하는 RIA(리치 인터넷 애플리케이션)를 만들 수 있다,


http://www.adoberia.co.kr/
top

TAG 어도비