해결책 : 로컬 커넥션을 사용해 두 애플리케이션간 통신하도록 하면 된다.
사실 누군가가 처음 내게 이 질문을 했을 때
난 별 생각없이, "물론, 로컬커넥션을 사용하면 웹 애플리케이션이랑 AIR 애플리케이션이
서로 통신할 수 있지"라고 대답했다.
그런데 가만 생각해 보니, 웹 애플리케이션은 플래시 플레이어에서 구동되고
AIR 애플리케이션은 AIR 런타임에서 구동되는데, 둘이 통신할 수 있다는 게
말이 안되는 거 같았다. 그래서 나는 대답을 보류했고, 한참 동안 관련 레퍼런스를
찾아서 결국 로컬 커넥션을 통한 통신이 가능하다는 것을 알아 냈다.
일단 웹 애플리케이션에서 AIR 애플리케이션에 접근하려면 다음 문법을 따라야 한다.
(이 때 lc는 LocalConneciton 인스턴스라고 가정한다)
lc.send("app#"+AIR 애플리케이션 ID+"."+AIR 애플리케이션 제작자(publisher) ID+":"+AIR 애플리케이션 로컬 커넥션 네임,"메소드 명", 파라미터)
얼핏 봐도 복잡해 보인다.
한편 반대로 AIR 애플리케이션에서 웹 애플리케이션의 메소드를 호출하려면
다음과 같이 해야 한다.
lc.send(웹 애플리케이션 도메인+":"+웹 애플리케이션 로컬 커넥션 네임,"메소드 명", 파라미터)
이 때 웹 애플리케이션 도메인은 로컬에 있을 때는 localhost,
웹 도메인에 있을 때는 도메인명(예를 들어,www.joshy21.com)이 된다.
사실 웹 애플리케이션과 AIR 애플리케이션 사이의 로컬 커넥션 통신을 통한 연동은
활용 범위가 엄청나게 넓다. 예를 들어, ActionScript 2와 AIR와의 통신도 가능하고
간단한 로컬 커넥션 핼퍼 클래스를 작성해 연동 부분만 처리하면,
웹 애플리케이션에서 launchApplication() 메소드를 통해 AIR 애플리케이션이 (실행중이 아니면) 실행시키고
서로 통신하면서 온갖 "쇼"를 다 할 수도 있을 것이다.
그래서 나는 다음과 같은 LocalConnection Info 클래스와 Manager 클래스를 만들어
AIR 애플리케이션과 웹 애플리케이션 사이의 연동이 정말 쉬워질 수 있도록 했다.
먼저 LCInfo 클래스의 소스는 다음과 같다.
이 클래스는 domain, air_connection, web_connection, isAirApp, appId, publisherId
속성을 가지고 있는데, 각각의 속성은 다음과 같다.
domain - 웹 애플리케이션이 있는 도메인 위치. 기본값은 localhost
air_connection - AIR 애플리케이션의 로컬 커넥션 네임
web_connection - 웹 애플리케이션의 로컬 커넥션 네임
isAirAipp - 해당 애플리케이션이 웹 애플리케이션인지 AIR 애플리케이션인지 여부
appId - (웹 애플리케이션인 경우에만) AIR 애플리케이션의 애플리케이션 ID
publisherId - (웹 애플리케이션인 경우에만) AIR 애플리케이션의 제작자 ID
이어서 이 클래스를 활용하는 메니저 클래스의 소스를 살펴보면 다음과 같다.
이 클래스는 싱글턴 패턴을 따르고 있고 LCInfo 클래스 인스턴스를
속성으로 가지고 있다 (has-a 관계).
하는 일은 애플리케이션이 웹 애플리케이션인지 AIR 애플리케이션인지
init() 메소드를 통해 알게 된 후
자동으로 상대편 애플리케이션에 로컬 커넥션의 send() 메소드를 통해
접근할 커넥션 네임을 생성해 주고
LCManager.getInstance().send() 메소드를 통해
굳이 로컬 커넥션 객체에 접근해 일일히 커넥션 네임을 할당하지
않아도 상대편 애플리케이션과 통신할 수 있도록 해 주는 기능이다.
그럼 이어서 예제를 보도록 하자.
AIR 애플리케이션 예제
이 두 예제에서 하는 일은 다음과 같다.
AIR 애플리케이션에서는 LCManager 클래스를 통해 로컬 커넥션을
생성하고 웹 애플리케이션쪽으로 애플리케이션 ID와 publisher ID를
타이머를 통해 전송해 준다.
웹 애플리케이션에서는 역시 LCManager 클래스를 통해 로컬 커넥션을
생성하고 AIR 애플리케이션에서 호출하는 getID 메소드를 통해
AIR 애플리케이션의 ID와 publisher ID를 동적으로 전달받는다.
이렇게 전달받은 애플리케이션 ID와 publisher ID를 바탕으로
웹 애플리케이션은 AIR 애플리케이션의 stopTimer() 메소드를
LCManager 클래스를 통해 호출하고
웹 애플리케이션 메소드





