2010년 1월 10일 일요일

[Flex/AIR] BlazeDS 길들이기. Flex Builder, Tom...

방장은 누규? 채팅사이트 조이팅스토리를 운영하며 마케팅, 사업 등에 관심이 많은 철이


[Flex/AIR] BlazeDS 길들이기. Flex Builder, Tomcat, Editplus를 이용하자.

2008/09/03 10:08

 
[공지]이미지나 링크가 깨졌다면 댓글 부탁드립니다.
1. BlazeDS 사용해보기
2. BlazeDS 길들이기. Flex Builder, Tomcat, Editplus를 이용하자.
3. BlazeDS 길들이기. Flex Builder, Tomcat, Eclipse 환경에 적응해보자.
 

BlazeDS의 데이타 연동 방식

BlazeDS는 크게 RPC와 메시지 서비스를 지원한다.

1. RPC : HTTP환경에서 HttpService(Get/Post), WebService(SOAP), RemoteObject(Java 객체)등을 이용해 통신하는 방식

2. 메시지 서비스 : RTMP환경에서 Producer와 Consumer 클래스를 이용해 통신하는 방식

간단하게 BlazeDS에서 지원하는 통신방식에 대해 알아보자.


연동방법 프로토콜 데이터 형태 서버 사이드 App. BlazeDS 메시징
RPC Service Http
Service
HTTP
HTTPS
XML PHP
ASP
JSP
XML
선택적 X
Web
Service
HTTP
HTTPS
XML
SOAP
Web Service가
가능한 App.
선택적 X
Remote
Service
HTTP
HTTPS
AMF Java Beans 필수 X
Data Service
Message
Service
RTMP AMF Java Beans 필수 O
Data
Management
Service
HTTP
RTMP
AMF Java Beans LCDS만
가능
O
* RTMP(Real Time Messaging Protocol)
* AMF(Action Message Format)
* RPC(Remote Procedure Call)
* SOAP(Simple Object Access Protocol)


RPC(Remote Procedure Call)
다른 서버에 있는 함수를 호출해서 결과값을 리턴 받는 방식
참고 :
http://en.wikipedia.org/wiki/Remote_procedure_call

RTMP(Real Time Messaging Protocol)
Adobe Flash Player와 서버간에 오디오, 비디오, 데이타를 스트리밍 하기 위해 개발된 프로토콜이다.
참고 :
http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol

SOAP(Simple Object Access Protocol)
일반적으로 널리 알려진 HTTP,HTTPS,SMTP등을 사용하여 XML기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 형태의 프로토콜이다. SOAP은 웹 서비스(Web Service)에서 기본적인 메시지를 전달하는 기반이 된다
참고 :
http://ko.wikipedia.org/wiki/SOAP

AMF(Action Message Format)

BlazeDS와 LCDS에서 RemoteObject와 메시지 서비스는 AMF3(Action Message Format version 3)를 이용해 통신하게 된다. AMF는 Flash Player에서 리모팅 및 메시징 기술에 빠른 통신방법을 제공하기 위한 일종의 바이너리 데이타 형태라고 생각하면 되겠다. 그러므로 서버에 제작된 Java Beans 함수를 호출하여 그 결과를 객체(바이너리 형태)로 받을 수 있다.

AMF3를 이용하는 RemoteObject는 XML등을 이용하는 HttpService나 WebService보다 대용량 데이터 처리가 우수하다. 속도 테스트에 관련된 내용은 예전에 내가 쓴
"수행속도종합테스트"를 참고하자.

참고 :
http://en.wikipedia.org/wiki/Action_Message_Format

HttpService
- RPC통신방식으로 HTTP환경에서 GET/POST방식으로 서버에 요청에 따라 XML과 같은 Text형태의 데이터를 받는 방법
- ASP/JSP/PHP든 어떤 서버사이드 스크립트 언어를 써도 상관없다.

WebService
- RPC통신방식으로 HTTP환경에서 XML로 된 SOAP 메시지를 결과로 리턴받는 개방형 방식, WSDL규정에 따라 데이터를 얻어온다.
- 웹서비스가 가능한 애플리케이션과 연동된다.

Remote Service
- RPC통신 방식으로 HTTP환경에서 Java Bean를 호출하여 AMF방식을 통해 객체 데이터를 주고 받는 형식
- 대용량 데이터를 고속 처리하는데 적합하며 암호화가 가능함
- LCDS나 BlazeDS와 같은 웹애플리케이션이 돌아갈 수 있는 WAS환경에서만 가능

Message Service
- 클라이언트의 요청없이 서버에서 클라이언트 쪽으로 데이터를 보내줄 수 있는 방식
- 새로운 뉴스 리포팅이나 실시간 자동 데이타 업데이트 등에 쓰일 수 있다.
- RTMP환경에서 AMF방식으로 데이타를 주고 받는다.
- BlazeDS나 LCDS가 있어야 사용할 수 있다.

Data Management Service
- 클라이언트와 서버간에 데이터를 쉽게 동기화하기 위한 서비스다.
- 클라이언트가 수정한 데이터를 즉시 서버에 반영할 수 있다.
- 서버에 수정된 데이터는 다른 클라이언트에도 즉시 반영된다.
- RTMP 및 HTTP 환경에서 AMF방식으로 데이터를 주고 받는다.
- LCDS가 있어야 사용할 수 있다.


BlazeDS 개발 환경 구성

BlazeDS에서 제공하는 RPC 서비스와 메시지 서비스 자체는 LCDS(구 FDS)와 크게 다를게 없다. 그러므로 LCDS를 몰라도 BlazeDS를 활용할 줄 알면 LCDS에 대한 대부분을 이해하는데 도움을 준다.

BlazeDS를 이용하기 위해서는 J2EE 환경이 구축되어야 한다. 그래서 이 글에서는 J2EE규약을 일부 따른 Tomcat환경에서 서버를 구성하고 BlazeDS실습을 하고자 한다.

다음과 같은 환경 구성에 따라서 진행하고자 한다.

1. Flex Builder 3와 Tomcat 6, Editplus
2. Flex Builder 3와 Tomcat 6 , Eclipse
3. Eclipse와 Flex Builder 3 Plug in, Tomcat 6


1번의 경우 Tomcat 환경에 익숙하지 않고 처음 해본 사람에게 적합한 내용이겠다. 하지만 이 방법은 실무에는 사용하지 않는다. 실무에서는 대체적으로 2,3번 환경을 구축하여 개발할 것이다. 2번의 경우 Flex개발 툴인 Flex Builder와 Java개발 툴인 Eclipse를 독립적으로 분리시킨 환경에서 개발하는 방법이다. 3번은 Eclipse안에 Flex Builder 플러그인을 설치하여 Flex와 Java를 하나의 툴안에서 개발하는 방법이다. 2,3번의 경우 어느쪽이 되었건 자신의 환경에 맞게 선택해서 하면 되겠다.

본문에서는 1번의 환경에서 BlazeDS의 환경에 대해 적응하고 사용하는 방법을 설명하고자 한다.
WAS, Java 환경에 아직 익숙하지 않아서 거의 용어 설명 및 개념 설명으로 인해 장황한 내용이 많다. 이미 Java, WAS환경에 적응되어 있는 사람에게는 쉽게 접근할 수 있는 내용이라 생각한다.

2번, 3번은 다음에 글을 올리겠다.




Flex Builder 3와 Tomcat 6, Editplus 환경에서 개발하기


다음과 같은 순서로 진행하겠다.
아래 내용이 너무 많이 보이지만 부가설명이 많아서 그런것이니 걱정말고 가볍게 읽기 바란다.

1. Flex Builder 3 설치
2. JDK 설치
3. Tomcat 설치
4. BlazeDS 설치
5. Editplus로 Java개발 환경 구축
6. BlazeDS 환경
7. HTTP 서비스 예제
8. Remote 서비스 예제
9. Message 서비스 예제 -> 이건 귀찮아서 일단 생략... ㅡㅡ;

모두 Windows 환경이라는 가정하에 진행하도록 하겠다. 만약 Linux환경에서 Tomcat과 JDK를 설치하는 과정을 알고 싶다면 본인이 예전에 쓴 "Linux 환경에서 Tomcat(톰켓), JDK 설치 하기"를 참고하면 되겠다.


1. Flex Builder 설치하기

http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email 에서 60일 trial 버전을 다운로드 받을 수 있다. 설치 중간에 Option Installations에 Javscript 플러그인인 JSEclipse를 함께 설치하면 좋겠다.

사용자 삽입 이미지
Flex Builder 설치중 JSEclipse 옵션 체크


2. JDK(Java Development Kit) 설치

JDK는 Java 개발을 위한 일종의 라이브러리 모음이라 생각해도 좋겠다. BlazeDS도 Java로 만들어졌기 때문에 JDK가 설치되어 있어야 정상적으로 구동시킬 수 있을 것이다.

JDK를 설치하기 위해 다음과 같은 과정을 수행하면 되겠다.
 A. http://java.sun.com/에 방문해서 downloads의 Java SE(Java Standard Edition) 메뉴로 들어간다.
 B. 아래 그림과 같이 JDK 6 Update x 를 다운로드 받는다. windows용으로 받으면 되겠다.


사용자 삽입 이미지

 C. JDK 설치. 다운로드 받은 JDK 실행파일을 실행하여 설치한다.
 D. JAVA_HOME 환경변수 설정을 해야한다. JDK를 설정한 경로가 C:/Program Files/Java/jdk1.6.0_07 일 때 다음과 같은 방법으로 환경변수를 설정하자.
  -  제어판->(성능 및 유지관리)->시스템에 들어가 "고급"탭의 "환경변수"버튼을 클릭한다. "시스템 변수"에서 "새로만들기"를 누른다.
  - 변수 이름으로 "JAVA_HOME", 값으로 "C:/Program Files/Java/jdk1.6.0_07"를 넣어준다.
  
사용자 삽입 이미지



3. Tomcat 설치

http://tomcat.apache.org/에 방문하여 Download->Tomcat 6.x로 들어가 Windows Service Installer를 다운로드 받는다. 이 글을 쓰는 시점 Tomcat의 최신버전은 6.0.18이다.

Tomcat은 대표적인 무료 WAS(Web Application Server)의 일종이다. 그렇다고 Tomcat을 WAS라고 하긴 곤란하다. 왜냐하면 J2EE의 일부분(Servlet/JSP)만 구현했기 때문에 WAS라기 보다는 일종의 웹컨테이너가 더욱 맞는 말이다. WAS는 Application을 설치하여 관리할 수 있는 Web Server와 DB Server 중간다리 역할을 하는 미들웨어라 생각하면 되겠다. 일반 Web Server는 사용자와 직접적으로 통신하는 front-end의 성격이 강하고, WAS는 뒷단에서 비즈니스 로직등을 처리하게 된다. 자세한 내용을 알려면 참 많은 것을 공부해야하니 이 정도로만 정리하겠다.

이 글을 정리하면서 참 어려운 용어들이 많이 나왔다.
J2EE니 WAS니.... 아직 완벽히 적응하기에는 이른 것 같지만 간단히 요약하면 다음과 같겠다.

J2EE나 JEE, JSE 같은 용어는 일종의 규약이라고 생각하면 되겠다.

JEE(Java Enterprise Edition) : Servlet/JSP,Mail,MQ,Corba,EJB,WS
JSE(Java Standard Edition) : JRE+JDK
J2EE는 JEE의 윗버전으로 Java 2 Enterprise Edition을 지칭한다.

WAS에 대해서 살펴보자. 도데체 Tomcat이 WAS인가 헷갈릴 때가 많은데 간단하게 정리하면 보통 WAS는 J2EE규약을 준수하여 구현했는가 일부만 구현했는가에 따라서 결정하게 된다.

WAS(Web Application Server) : JEE규약을 준수한 구현체, 종류로는 웹스피어, Web Logic, Sun JEE서버등
Web Container : JEE규약의 일부분(Servlet/JSP) 구현체, 종류로는 Tomcat, Resin,JRun 등

WAS의 중요한 기능중  Servlet/JSP Container와 EJB Container이 있는데 EJB Container로서의 역할비중이 크다. 하지만 Tomcat은 EJB Container에 대한 구현을 안했기 때문에 엄밀히 말해서 WAS라고는 하지 않는 것이 보통이다.

WAS의 역할은 Web Server와 DB Server 사에 존재하는 미들웨어 역할을 하며 그 중간에 Web Application을 탑재하여 DB Server의 데이타를 사용목적에 맞게 가공하여 Web Server에 보내주는 역할을 한다.

WAS를 사용하는 또 다른 이유는 분산환경을 만들기 위해서이며 분산환경의 가장 큰 이슈인 트렌잭션 처리를 적은 비용으로 효과적으로 처리하는 것을 목적으로 한다.


Tomcat을 다운로드 받았으면 설치하자.

사용자 삽입 이미지

톰켓의 설치 경로를 위처럼 잡았다. [Next]버튼을 누른다.

(주의점)어느 경로에 설치해도 문제없지만 설치 경로상에 공백이 들어가지 않도록 한다. 가령 Program Files아래 Tomcat이 설치되는 경우 Program과 Files 공백이 있어 앞으로 나올 EditPlus에서 Java컴파일을 하는데 어려움이 따른다.

 아래 화면에서 포트는 기본이 8080이지만 일반적으로 많이 쓰이는 80으로 설정했다. http://localhost:8080으로 접속하는게 귀찮아서... 만약 다시 설정하고 싶다면 {tomcat 설치경로}/config/내에 xml파일을 수정하면 되겠다.

관리자 Name과 Password는 잊지 않도록 하자.


사용자 삽입 이미지
Tomcat Port 설정 및 관리자 Name/Password 설정


JDK와 JRE?
Tomcat 설치 중에 JRE 설치 경로를 설정하는 부분이 있을 것이다. 여기서 JDK와 JRE의 의미를 명확히 알아보자.

① JDK

    - Java Development Kit
    - 자바 애플릿이나 각종 응용 프로그램(어플리케이션)을 개발자들이 쉽게 만들 수 있도록
       해주는 개발자용 도구.
    - 여러 운영체제 및 응용 프로그램(어플리케이션)과 연결시킬 수 있는 자바 응용 프로그램
      인터페이스(API)와 클래스 라이브러리, 자바 가상 머신 등을 포함.
    - 자바를 사용해서 자바 응용 프로그램을 개발할 수 있도록 해주는 도구입니다.
    - 자바 파일을 컴파일할 수 있는 컴파일러를 포함한 부분

② JRE
    - Java Runtime Environment
    - 컴파일된 자바 프로그램을 실행할 수 있도록 해주는 환경.
    - 자바 언어로 개발된 소프트웨어를 실행하기 위해 필요한 플랫폼.
    - 자바를 이용해 개발된 소프트웨어는 어떤 플랫폼으로부터도 독립적인 형식
       (자바 바이트 코드)으로 배포되지만, 이것을 실행하려면 그 플랫폼을 해석할 수 있는 형식
       (native code)으로 변환해야 한다. 즉, 자바 실행 환경(JRE)은 이 변환과 실행을 행하는
       자바 가상 머신과 그 주변의 소프트웨어이다.

요약하자면 JDK는 자바개발을 위한 도구이며 JRE는 자바로 작성된 응용프로그램을 실행하기 위한 환경이다.

JDK = JRE + 개발에 필요한 실행파일(javac.exe등)
JRE = JVM(자바가상머신) + 클래스라이브러리(Java API)

그러므로 JDK가 설치되면 JRE는 필요 없다고 해도 무방하며 Tomcat의 경우 설치하는 과정으로부터 JRE가 설치되어있어야 동작한다는 것을 알 수 있다.
설치를 완료하면 {Tomcat 설치폴더}/bin/tomcat6.exe를 실행하면 되겠다.

사용자 삽입 이미지
Tomcat 트레이 아이콘
Tomcat을 실행하면 위와 같은 트레이 아이콘이 뜨며 두번 클릭하면 시작/중지나 각종 설정을 할 수 있도록 되어 있다. 꼭 해보길 바란다.

Tomcat이 구동되어 있는 상태가 되면 이제 여러분의 컴퓨터는 웹서버로 사용할 수 있게된다.
웹브라우져 창을 띄워서 주소창에 http://localhost를 입력해보자. 아래와 같이 나온다면 Tomcat은 정상적으로 구동하고 있는 것이다. 만약 설치시 port를 8080으로 했다면 http://localhost:8080 으로 접속해야한다.

사용자 삽입 이미지

Tomcat의 활용에 대해 이해하기 위해 몇가지 테스트를 해보자.

 {톰켓설치폴더}/webapps폴더에 보면 아래 그림과 같이ROOT, manager, host-manager, docs등이 있다. 이 각각의 폴더는 Tomcat에 설치된 웹어플리케이션들이라고 생각하면 되겠다.

사용자 삽입 이미지
Tomcat에 설치된 Web Application들

 http://localhost/docs에 접속해보자. 아래와 같은 화면을 볼 수 있을 것이다.
사용자 삽입 이미지

이 페이지는 {톰켓설치폴더}/webapps/docs/ 내에 index.html이 실행된 것을 알 수 있다.
ROOT 폴더는 http://localhost/ROOT 형태로 접근할 수 없고 http://localhost로만 접근이 가능하다. Tomcat 설정에 ROOT 폴더는 http://localhost로 접속할때 바로 ROOT로 Redirect될 수 있도록 설정되어 있기 때문이다.

{톰켓설치폴더}/webapps/ 내에 test폴더를 만들고 index.html을 만들어 보자. 그리고 index.html안에 "안녕하세요"를 넣고 http://localhost/test/로 접속해보자. 그럼 아래와 같이 표시될 것이다.

사용자 삽입 이미지


이번에는 {톰켓설치폴더}/webapps/test/ 에 hello.jsp를 만들어 아래와 같은 코드를 만들고 http://localhost/test/hello.jsp 로 접속해보겠다.
<%@ page contentType="text/html;charset=euc-kr" %>
<html>
<head><title>Hello world</title></head>
<body>
<h2>Hello World</h2>
오늘 날짜와 시간은 : <%=new java.util.Date() %>
</body>
</html>
사용자 삽입 이미지

JSP, Servlet, JDBC 에 관련된 Java 웹 프로그래밍에 대한 내용은 관련 서적을 구입해서 보도록 하는 것이 좋겠다.


4. BlazeDS 설치

Tomcat도 WAS의 일부 기능인 Servlet/JSP 컨테이너 역할을 지원하고 있다. 그래서 Java로 만들어진 웹애플리케이션(Web Application)을 Tomcat에 설치할 수 있다. 이런 웹애플리케이션은 WAR형태로 배포해서 사용한다. WAR(Web Application aRchive)는 일종의 zip이나 tar와 같은 압축파일로 웹애플리케이션을 효율적으로 배포,설치하기 위한 파일 형식이다.  제작한 웹애플리케이션을 WAR로 배포하면 손쉽게 설치할 수 있고 Tomcat뿐 아니라 Web Logic, JRun과 같이 Servlet/J2EE 엔진에도 호환성을 가진다.

BlazeDS도 웹애플리케이션이다. 그러므로 BlazeDS도 war로 배포되고 있다.

이전 포스팅에 "BlazeDS 사용하기"를 보면 BlazeDS는 3가지 다운로드 타입을 제공한다고 했다. 그 중에 개발용인 2. Binary Distribution를 다운로드 받자. 압축을 푼뒤 내용을 보면 blazeds.war가 있다. 이 파일을 웹애플리게이션을 담는 {톰켓설치폴더}/webapps 폴더에 복사한다. Tomcat이 구동중이라면 Tomcat은 아래 그림처럼 blazeds.war를 자동으로 압축을 푼다. 즉, 일부러 풀어서 넣을 것 없다는 뜻이다. 필요하다면 미리 압축을 풀어 다른 이름으로 만들어서 복사해도 상관없다. 이것으로 blazeds를 사용하기 위한 최소한의 과정이 끝난셈이다. 주의할 것은 blazeds.war를 지우지 말자 그럼 생성된 blazeds폴더도 자동삭제된다. 참 똑똑한 Tomcat이다. 고양이 녀석 ㅋㅋ

사용자 삽입 이미지
blazeds.war를 webapps폴더에 복사하여 설치하기


{톰켓설치폴더}/webapps/blazeds/ 아래 보면 META-INF 폴더와 WEB-INF 폴더가 있다. 중요한 것은 WEB-INF이다.
사용자 삽입 이미지
WEB-INF 정보

WEB-INF는 위에 그림처럼 구성되어 있는데 각각 설명해보면 다음과 같다. 숙지하도록 하자.

- /WEB-INF/classes : 웹 애플리케이션에서 사용하는 자바 클래스 파일들이 위치한다. src폴더에 코딩된 Java코드가 컴파일되면 여기에 위치하게 된다.
- /WEB-INF/flex : BlazeDS를 이용한 설정파일이 위치한다.
- /WEB-INF/lib : jar 파일이 위치한다. BlazeDS에 대한 클래스가 포함된다.
- /WEB-INF/src : 웹애플리케이션에서 사용되는 Java소스가 들어간다. Flex와 통신하기 위한 Java코드가 되겠다.
- web.xml : Web Application Deployment Descriptor로 불리며 웹 애플리케이션에 대한 각종 설정 정보를 포함한다.



WEB-INF 폴더는 BlazeDS뿐 아니라 모든 웹 애플리케이션에 포함된다. 앞서 설명했던 webapps폴더안에 있는 ROOT, docs, manager 등이 바로 웹애플리케이션이고 그 내부에는 WEB_INF가 있다.

Tomcat과 Servlet, JSP의 관계

Servlet과 JSP는 PHP와 ASP와 같이 서버에서 동작하며 DB에 접근하든지 비지니스 로직처리를 수행하기 위한 Java언어를 사용하는 Server Side Script 언어이다.

Tomcat은 웹서버상에서 Java코드를 이용하기 위한 엔진 혹은 컨테이너이다. 즉, Java기반인 JSP, Servlet을 이해하기 위해 Tomcat과 같은 자바를 이용하는 엔진이 필요한 것이다.

Servlet은 Tomcat이 이해할 수 있는 순수 Java 코드로만 이루어진 웹서버용 클래스이다. 일반적인 Java 코드와 같으며 HTML형태로 출력하기 위해 print() 메소드 같은 것을 사용한다. 이 때문에 Servlet은 PHP와 ASP에 비해 코딩하기가 복잡하다. 이러한 단점을 보완하기 위해 나온것이 JSP이다. JSP는 PHP나 ASP처럼 HTML코드와 혼용되서 사용한다. Tomcat은 JSP코드를 컴파일할때 Servlet코드로 전환하여 컴파일을 진행하게 된다. 그래서 Tomcat을 Servlet/JSP 컨테이너라고 한다.



5. Editplus로 Java개발 환경 구축

일반 메모장으로 코딩하는 것보다는 Java코딩을 지원하고 컴파일까지 해주는 툴을 이용하는 것이 좋을 것이다. 처음 Java를 접했을때 대부분 Eclipse를 사용하지만 한번쯤은 메모장이나 에디터 플러스와 같은 툴을 이용해서 해보는 것도 나쁘지 않을 것이다.

http://editplus.co.kr/ 로 가서 Editplus 최신버전을 다운로드 받는다. 30일 trial버전일 것이다.
설치후 메뉴에서 [도구]->[사용자 도구 구성]을 들어가 왼쪽 메뉴에 [사용자 도구]를 선택하면 아래와 같은 화면이 나온다. 이곳에 Java를 컴파일할 수 있는 환경을 만들고자 한다.

사용자 삽입 이미지
먼저 [그룹이름] 버튼을 눌러 "java" 그룹을 만든다. [추가(D)>>] 버튼을 눌러 [프로그램]을 선택한다음
그아래 Text창에 다음 내용을 입력한다.

 - 메뉴제목 : Java 컴파일
 - 명령 : C:/Program Files/Java/jdk1.6.0_07/bin/javac.exe
 - 인수 : -classpath {blazeds설치경로}/WEB-INF/classes -d {blazeds설치경로}/WEB-INF/classes $(FilePath)
 - 디렉토리 : $(FileDir)

-classpath에서 {blazeds설치경로}는 톰켓 설치 폴더가 "c:/Tomcat" 이고 webapps폴더에 blazeds라는 이름의 웹 애플리케이션을 설치했다면 "c:/Tomcat/webapps/blazeds/" 식으로 넣어주면 되겠다.

"명령"은 Java를 컴파일하기 위한 프로그램이다. [...]버튼을 눌러 찾길 바란다. "인수"는 컴파일시 옵션을 넣는 창이다. 컴파일된 결과물은 WEB-INF/classes 폴더에 들어간다는 것을 언급했었다. BlazeDS를 이용해 Java프로그램의 결과물은 classes폴더에 위치해야 Flex의 RemoteObject로 접근이 가능하겠다. 결국, 입력한 인수옵션은 그 경로에 따라 컴파일 되도록 설정한 것이다.

[출력내용캡쳐]를 check해야 컴파일/실행시 CMD창이 안뜨고 Editplus 하단에 결과가 나오게 된다.
모두 설정했으면 [확인]을 누르자.


메뉴에서 [보기]->[사용자 도구 모음]을 클릭하면 아래 화면과 같이 종이모양과 망치모양이 나열되어 있는 사용자 도구 모음이 붙는다.
사용자 삽입 이미지

첫번째 망치모양을 클릭(또는 Ctrl+1)하면 Java로 코딩된 것을 컴파일 할 수 있고 에러가 있을때 에러메세지도 보여준다.
이로써 Editplus를 이용한 Java 개발 환경을 완료했다.

(주의점)앞서 설명했지만 Tomcat 설치시 Program Files 밑에 Tomcat을 설치하면 Program과 Files 중에 들어간 1칸의 공백으로 컴파일 에러를 발생할 수 있다. Tomcat 설치시 설치경로에 공백이 안생기도록 해야하겠다.
 

6. BlazeDS 환경설정




지금부터 본격적으로 BlazeDS 환경 설정에 대해서 공부해보겠다.


BlazeDS의 web.xml

BlazeDS의 configuration 파일들을 살펴보겠다.
{톰켓설치폴더}/webapps/blazeds/WEB-INF 안에 web.xml이 있는 것을 확인할 수 있다.  이것은 Web Application Deployment Descriptor로 불리며 웹 애플리케이션에 대한 각종 설정 정보를 포함한다. BlazeDS도 웹 애플리케이션이라고 했다. 그러므로 BlazeDS에 대한 각종 설정 정보를 보려면 먼저 web.xml을 살펴봐야 한다.

blazeds/WEB-INF/web.xml (Language : xml)
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  3. <web-app>
  4.     <display-name>BlazeDS</display-name>
  5.     <description>BlazeDS Application</description>
  6.     <!-- Http Flex Session attribute and binding listener support -->
  7.     <listener>
  8.         <listener-class>flex.messaging.HttpFlexSession</listener-class>
  9.     </listener>
  10.     <!-- MessageBroker Servlet -->
  11.     <servlet>
  12.         <servlet-name>MessageBrokerServlet</servlet-name>
  13.         <display-name>MessageBrokerServlet</display-name>
  14.         <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
  15.         <init-param>
  16.             <param-name>services.configuration.file</param-name>
  17.             <param-value>/WEB-INF/flex/services-config.xml</param-value>
  18.        </init-param>
  19.         <load-on-startup>1</load-on-startup>
  20.     </servlet>
  21.     <servlet-mapping>
  22.         <servlet-name>MessageBrokerServlet</servlet-name>
  23.         <url-pattern>/messagebroker/*</url-pattern>
  24.     </servlet-mapping>
  25.     <welcome-file-list>
  26.         <welcome-file>index.html</welcome-file>
  27.         <welcome-file>index.htm</welcome-file>
  28.     </welcome-file-list>
  29.     <!-- for WebSphere deployment, please uncomment -->
  30.     <!--
  31.     <resource-ref>

  •         <description>Flex Messaging WorkManager</description>
  •         <res-ref-name>wm/MessagingWorkManager</res-ref-name>
  •         <res-type>com.ibm.websphere.asynchbeans.WorkManager</res-type>
  •         <res-auth>Container</res-auth>
  •         <res-sharing-scope>Shareable</res-sharing-scope>
  •     </resource-ref>
  •     -->
  • </web-app>

  • 9~11줄은 <listener>로 flex.messagingHttpFlexSession을 등록했다. HttpFlexSession은 HttpSessionListener 및 Session관련 리스너들을 모두 구현한 클래스이다. 가령, HttpFlexSession은 Flex에서 로그인 관련처리를 위해 쓸 수 있다. 관련 예제는 [머드초보님의 예매시스템1 - 로그인부분(FlexSession사용)]을 참고하면 되겠다.

    14~23 줄을 보면 <servlet>으로 flex.messaging.MssageBrokerServlet을 등록한 것을 볼 수 있다. MessageBrokerServlet은 Flex 데이타 서비스의 메시징 및 RPC 요청을 처리해 주는 서블릿이다. MessageBrokerServlet 에 대한 설정파일은 WEB-INF/flex/services-config.xml이라는 것을 확인할 수 있다.

    25~28 줄에서 <servlet-mapping>으로 <servlet>에서 설정한 MessageBrokerServlet의 접근 경로로 /messagebroker/*를 설정한다. 이 말은 /messagebroker/* 형태로 접근하는 모든 url은 MessageBorkerServlet에서 담당하게 된다.

    14~28줄까지는 Servlet Mapping에 관련된 것이다. 이는 Java WAS환경에서 제공하는 것으로 간단한 예제는 http://blog.naver.com/seungbeomi/50016300457를 참고하여 그 개념을 알 수 있다. Servlet Mapping은 여러가지 용도로 응용할 수 있는데 더 공부해둘 필요가 있겠다.

    blazeds/WEB-INF/web.xml 설정된 MessageBrokerServlet을 통해 Flex와 BlazeDS간에 메시지 및 RPC통신을 할 수 있다는 것을 인식하는게 필요하다.


    BlazeDS의 Architecture

    설정 파일에 대해 설명하기에 앞서 먼저 BlazeDS의 아키텍처에 대해 잠깐 살펴보겠다.

    BlazeDS Client라고 하면 Flex이다. 아래 그림은 Flex에서 BlazeDS에 통신하기 위한 컴포넌트(RemoteObject, HttpService, WebService, Producer, Consumer)와 통신할때 쓰이는 Channel을 보여주고 있다. channel의 종류에는 AMFChannel, HttpChannel등이 있다는 것을 알 수 있고 HTTP Protocol을 통해서 AMFChannel인 경우 AMF방식, HTTPChannel인 경우는 AMFX방식(AMF in XML)으로 데이타를 송수신한다.


    사용자 삽입 이미지
    BlazeDS 클라이언트 아키텍쳐(클릭하면 크게 볼 수 있음)

    아래 그림은 BlazeDS 서버측 구조이다. Flex에서 data가 channel을 통해 들어오면 그에 대한 처리를 할 수 있는 endpoint를 MessageBrokerServlet에서 담당한다.

    web.xml에서 지정한 <servlet>과 <servlet-mapping>으로부터 MessageBrokerServlet으로 접속하는 url을 /messagebroker/*라고 했다. 만약 Flex에서 http://localhost/messagebroker/amf로 channel을 통해 접근하면 MessageBrokerServlet이 이 url에 맞는 endpoint를 찾아 처리할 수 있도록 한다.

    Flex는 BlazeDS의 endpoint와 통신하기 위해 channel을 사용한다는 것을 알 수 있겠다. 이 개념을 숙지하는게 중요하다.
    사용자 삽입 이미지
    BlazeDS 서버 아키텍쳐(클릭하면 크게 볼 수 있음)


    channel과 endpoint의 종류는 항상 1:1 매칭이 되어야 한다. 만약 Flex에서 channel의 한 종류인 AMFChannel을 사용하여 통신하고자 한다면 endpoint도 AMF 메시지 형태를 처리하는 AMFEndpoint를 사용해야 한다. 같은 예로 AMFX 메시지 형태에 대해서는 HTTPChannel이면 HTTPEndPoint이어야 한다. Steaming에 대한 Channel이면 Endpoint도 Streaming이어야 한다.

    일단 Channel을 통해 Endpoint로 들어온 요청 메세지는 MessageBroker로 디코드 되어 전송되고 여기서 메시지의 종류에 따라서 Service->Destination->Adapter로 전송된다음 그 결과를 다시 MessageBroker와 MessageBrokerServlet을 통해 클라이언트(Flex)로 전송한다.

    BlazeDS의 services, destinations, adapters와 Flex Component관계는 다음과 같이 연결되어 통신하게 된다.

    Component Service Destination Adapter
    HTTPService HTTPProxyService HTTPProxyDestination HTTPProxyAdapter
    WebService HTTPProxyService HTTPProxyDestination SOAPAdapter
    RemoteObject RemotingService RemotingDestination JavaAdapter
    Producer/Consumer MessageService MessageDestination ActionScriptAdapter
    JMSAdapter
    Custom adapter

    Service, Destination, Adapter에 대한 자세한 설명은 BlazeDS 라이브 독을 참고하면 되겠다.

    이 정도로 BlazeDS 아키텍쳐 및 web.xml에 대한 설명을 끝내겠다.


    BlazeDS의 service-config.xml 설정파일

    그럼 BlazeDS의 config파일들을 살펴보자.
    WEB-INF/flex/에 보면 다음과 같은 config파일들이 있다.

    사용자 삽입 이미지

    WEB-INF/flex/service-config.xml에서 <services>를 보면 다음과 같다.

    WEB-INF/flex/service-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <services-config>
    3.     <services>
    4.         <service-include file-path="remoting-config.xml" />
    5.         <service-include file-path="proxy-config.xml" />
    6.         <service-include file-path="messaging-config.xml" />       
    7.     </services>
    8.     ...(생략)
    9. </services-config>

    LCDS의 경우에는 데이타 관리 서비스를 포함하므로 data-managerment-config.xml도 추가된다.
    service-config.xml의 <service-include>에 설정된 file-path에 설정된 각 xml 파일의 역할은 다음과 같다.

    - remoting-config.xml : RemoteObject를 통해 접속할 때 사용하는 서비스명과 자바빈즈의 이름에 대한 정의
    - proxy-config.xml : WebService와 HTTPService를 이용해 접속할때 Proxy에 대한 정의
    - messaging-config.xml : Producer,Consumer등을 통해 메시지 서비스를 사용하는 서비스 이름과 속성들에 대해 정의
    - data-management-config.xml : 데이터 관리 서비스에서 사용하는 서비스명 및 자바빈즈에 대한 정의

    어떤 서비스를 지원할 것인가에 따라서 해당 config를 설정하면 되겠다.

    service-config.xml에 대해서 좀더 살펴보자.

    WEB-INF/flex/service-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <services-config>
    3.     ...(생략)
    4.     <security>
    5.         <login-command class="flex.messaging.security.TomcatLoginCommand" server="Tomcat"/>
    6.         <!-- Uncomment the correct app server
    7.         <login-command class="flex.messaging.security.TomcatLoginCommand" server="JBoss">


  •         <login-command class="flex.messaging.security.JRunLoginCommand" server="JRun"/>       
  •         <login-command class="flex.messaging.security.WeblogicLoginCommand" server="Weblogic"/>
  •         <login-command class="flex.messaging.security.WebSphereLoginCommand" server="WebSphere"/>
  •         -->
  •         <!--
  •         <security-constraint id="basic-read-access">
  •             <auth-method>Basic</auth-method>
  •             <roles>
  •                 <role>guests</role>
  •                 <role>accountants</role>
  •                 <role>employees</role>
  •                 <role>managers</role>
  •             </roles>
  •         </security-constraint>
  •          -->
  •     </security>
  •     ...(생략)
  • </services-config>

  • service-config.xml에 설정된 <security>는 보안에 관련된 내용으로 Tomcat인 경우는 그대로 사용해도 되지만 라는 WAS인 Weblogic이나 WebSphere의 경우 해당 클래스를 찾아 주석을 풀어줘서 사용해야 한다.


    WEB-INF/flex/service-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <services-config>
    3.     ...(생략)
    4.     <channels>
    5.         <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
    6.             <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
    7.         </channel-definition>
    8.         <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
    9.             <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
    10.             <properties>
    11.                 <add-no-cache-headers>false</add-no-cache-headers>
    12.             </properties>
    13.         </channel-definition>
    14.         <channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
    15.             <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/>
    16.             <properties>
    17.                 <polling-enabled>true</polling-enabled>
    18.                 <polling-interval-seconds>4</polling-interval-seconds>
    19.             </properties>
    20.         </channel-definition>
    21.         <!--
    22.         <channel-definition id="my-http" class="mx.messaging.channels.HTTPChannel">

  •             <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/>
  •         </channel-definition>
  •         <channel-definition id="my-secure-http" class="mx.messaging.channels.SecureHTTPChannel">
  •             <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/httpsecure" class="flex.messaging.endpoints.SecureHTTPEndpoint"/>
  •             <properties>
  •                 <add-no-cache-headers>false</add-no-cache-headers>
  •             </properties>
  •         </channel-definition>
  •         -->
  •     </channels>
  •     ...(생략)
  • </services-config>

  • <channels>는 앞서 설명했던 channel과 endpoint를 등록하는데 쓰인다. channel을 등록하기 위해 <channel-definition>을 사용한다. 또 그에 대응하는 endpoint는 <channel-definition>내에 <endpoint>로 넣게 된다. 다른 속성이 있으면 <properties>안에 넣으면 되겠다. 각각의 channel 마다 사용방법이 약간씩 다르다. 기본적으로 아래와 같이 channel 정의 방법은 동일하다.

    channel 정의 방법
    1. <channel-definition id="" class="{Channel클래스명}">
    2.     <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/{이름}" class="{Endpoint클래스명}"/>
    3. </channel-definition>

    web.xml에서 /messagebroker/* 형태로 들어오는 모든 url을 MessageBrokerServlet에서 처리한다고 했다. 그렇기 때문에 endpoint가 /messagebroker/* 형태로 정의된 것이다. 이 url로 접근하면 MessageBrokerServlet이 알아서 해당 endpoint 찾아서 처리준다.


    /WEB-INF/flex/service-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <services-config>
    3.     ...(생략)
    4.     <system>
    5.         <redeploy>
    6.             <enabled>false</enabled>
    7.             <!--
    8.             <watch-interval>
    20</watch-interval>
  •             <watch-file>{context.root}/WEB-INF/flex/services-config.xml</watch-file>
  •             <watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watch-file>
  •             <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watch-file>
  •             <watch-file>{context.root}/WEB-INF/flex/messaging-config.xml</watch-file>
  •             <watch-file>{context.root}/WEB-INF/flex/data-management-config.xml</watch-file>
  •             <touch-file>{context.root}/WEB-INF/web.xml</touch-file>
  •              -->
  •         </redeploy>
  •     </system>
  •     ...(생략)
  • </services-config>

  • serivce-config.xml의 <system>의 <redeploy>는 다시 설정된 정보를 적용을 할 것인가 결정하는 역할을 한다. 만약 <enabled>를 true로 설정하고 <watch-interval>20</watch-interval>을 설정하면 20초마다 수정된 정보가 있는지 확인해서  있으면 적용시키는 역할을 한다.




    7. Http 서비스 예제

    HTTPSerivce와 WebSerivce에 대한 BlazeDS 설정은 proxy-config.xml에서 할 수 있다.

    proxy-config.xml은 프록시(Proxy)로서 BlazeDS를 활용할때 쓰인다.
    즉, HttpService/WebService에서 url 정보대신 proxy-config.xml내 설정한 destination속성을 지정해서 접근하는 방식을 이용하는 것이다.

    보통 HttpService는 <HTTPService id="httpServ" url="http ://jidolstar.com/a.php"/> 이런식으로 사용한다. 반면에 proxy-config.xml을 이용할 때는 <HTTPService id="httpServ" destination="myProxy" useProxy="true"/>로 사용하여 proxy-config.xml에 정의된 destination을 참고하여 그안에 설정되어 있는 url로 접근할 수 있게 된다.


    WEB-INF/flex/proxy-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <service id="proxy-service"
    3.     class="flex.messaging.services.HTTPProxyService">

  •     <properties>
  •         <connection-manager>
  •             <max-total-connections>100</max-total-connections>
  •             <default-max-connections-per-host>2</default-max-connections-per-host>
  •         </connection-manager>
  •         <allow-lax-ssl>true</allow-lax-ssl>
  •     </properties>
  •     <adapters>
  •         <adapter-definition id="http-proxy" class="flex.messaging.services.http.HTTPProxyAdapter" default="true"/>
  •         <adapter-definition id="soap-proxy" class="flex.messaging.services.http.SOAPProxyAdapter"/>
  •     </adapters>
  •     <default-channels>
  •         <channel ref="my-amf"/>
  •         <channel ref="my-http"/>
  •     </default-channels>
  •     <destination id="jidolstarRSS">
  •         <properties>
  •             <url>http://blog.jidolstar.com/rss</url>
  •         <properties>
  •     </destination>
  • </service>

  • proxy-config에 20줄에 <channel>로 my-http를 추가했고 23~27줄에 <destination>으로 jidolstarRSS로 등록했다. 또 해당 url을 http://blog.jidolstar.com/rss로 했다. service-conifg.xml에는 아래처럼 my-http이름으로 channel을 추가한다. Http Service이므로 class로 HTTPChannel과 HTTPEndpoint를 사용한다.

    WEB-INF/flex/service-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <services-config>
    3.     ...(생략)
    4.         <channel-definition id="my-http" class="mx.messaging.channels.HTTPChannel">
    5.             <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/>
    6.         </channel-definition>
    7.     ...(생략)
    8. </services-config>

    <endpoint>의 url에 messagebroker/http부분은 다른 channel에 정의한 endpoint의 url과 중복되서는 안된다.

    Flex는 다음과 같이 코딩이 가능하겠다.

    BlazeDS를 Http Proxy 서버로 설정하여 HttpService를 사용하는 방법
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    3.     <mx:HTTPService
    4.         id="httpServ"
    5.         showBusyCursor="true"
    6.         destination="jidolstarRSS"
    7.         fault="trace(event.toString())"
    8.         result="dg.dataProvider=httpServ.lastResult.rss.channel.item"
    9.         useProxy="true">

  •     </mx:HTTPService>   
  •     <mx:DataGrid id="dg" width="100%" height="100%">
  •         <mx:columns>
  •             <mx:DataGridColumn headerText="제목" dataField="title"/>
  •             <mx:DataGridColumn headerText="날짜" dataField="pubDate"/>
  •             <mx:DataGridColumn headerText="카테고리" dataField="category"/>
  •         </mx:columns>
  •     </mx:DataGrid> 
  •     <mx:Button label="읽어오기" click="httpServ.send()"/>
  • </mx:Application>

  • 중요한 점은 컴파일시 -service 옵션을 주어야 한다는 것이다. 가령 mxmlc -services "C:/Tomcat/webapps/blazeds/WEB-INF/flex/service-config.xml" 형태로 옵션을 주어야 설정한 destination에 대한 channel과 endpoint에 맞게 컴파일이 가능하겠다.

    앞서 설명했듯이 Flex에서 <HTTPService>에 url을 직접 등록하지 않고 BlazeDS의 <destination>에 url을 설정함하게 되는 것은 BlazeDS를 HTTP Proxy서버로서 쓰겠다는 이야기이다. 이렇게 Proxy 서버를 이용했을때 다음과 같은 유용한 점이 있다.

    1. Flex안에 URL정보가 없으므로 Flex는 호출해야할 URL정보를 몰라도 된다.
    2. 서버내 URL이 바뀌었을 경우 BlazeDS로 프록시 서버를 설정하여 사용하고 있다면 SWF의 URL 경로를 수정할 필요가 없이도 서버측의 URL만 바꾸면 된다. 물론 destination은 바뀌면 안되겠다.
    3. 악의적인 목적으로 SWF를 볼려고 해도 URL주소가 없다.


    위 Flex코드를 이용하여 프로젝트를 다음 순서로 작성하고 실행해보자.

    1. service-config.xml과 proxy-config.xml을 위와 같이 설정한다.
    2. services-config.xml이나 proxy-config.xml을 수정했기 때문에 Tomcat을 중지했다가 다시 시작한다.
    http://localhost/manager/html 에 접속해서 각 웹애플리케션별로 시작(start)/중지(stop)/재시작(reload)/삭제(undeploy)를 할 수 있다. 접속해서 사용할때 Reload버튼을 눌러 재시작하면 해당 웹애플리케이션의 자바빈즈 및 각종 설정을 다시 재로드해준다. 삭제(undeploy)는 선택하지 않도록 주의하자.

    3. Flex Builder를 실행하고 [File]->[New]->[Flex Project]를 선택한다.

    4. 아래 그림처럼 Project name은 HttpProxyTest, Application type은 Web application, Server technology는 J2EE를 선택한다. 우리는 BlazeDS서비스를 사용할 것이므로 Use remote object access service 부분 check를 한다.

    사용자 삽입 이미지


    5. Server location을 설정한다.
    아래와 같은 화면이 나오면 Web root 우측에 [Browse...] 버튼을 클릭하여 blazeds를 설치한 경로를 찾아준다.
    그리고 Root URL에 blazeds 의 접속 URL을 아래 그림과 같이 넣는다. Context root를 넣어준 다음 [Validate Configuration] 버튼을 눌러 유효한 설정인지 확인한다. 유효하다면 윗부분에 "The web root folder and root URL are valid" 메시지가 나오게 된다.

    이렇게 입력하면 Flex 컴파일 경로가 자동적으로 Output folder에 들어가게 되는데 프로젝트명-debug형태로 만들어지는 것을 알 수 있다. Flex Builder에서 실행할 때 이와 같은 설정으로 인해 http://localhost/blazeds/프로젝트명-debug/프로젝트명.html 형태로 접근하게 된다.

    [Finish] 버튼을 눌러 프로젝트를 만든다.

    사용자 삽입 이미지


    6. HttpProxyTest.mxml에 위에서 작성한 Flex 코드를 복사하여 붙여넣고 저장한다.
    7. Flex 코드를 실행하면 다음과 같은 화면을 볼 수 있다.
    정상적으로 http://blog.jidolstar.com/rss를 읽어온 것을 확인할 수 있다.

    사용자 삽입 이미지
    HttpService를 BlazeDS의 Http Proxy와 연계한 결과

    몇가지 더 확인해보자. Flex Builder에서 Flex Navigator에 방금 생성한 프로젝트인 HttpProxyTest에 아래 화면처럼 마우스 오른쪽 버튼을 눌러 Context메뉴의 하단에 Properties를 선택해자.
    사용자 삽입 이미지

    아래와 같은 창이 나오면 왼쪽 Flex Server를 선택해보자. 처음 프로젝트 만들때 Flex Server설정이 입력 되어 있는 것을 알 수 있다. 필요하다면 수정해서 사용할 수 있다.
    사용자 삽입 이미지

    이번에는 아래 이미지 같이 좌측메뉴에 Flex Compiler를 보자. 이 부분은 컴파일 옵션 및 Flex SDK를 선택하는 부분이다. Additional compiler arguments에 보면 보통 프로젝트를 만들때와 달리 -service 옵션이 붙어 있는 것을 볼 수 있다.

    -services "C:/Tomcat/webapps/blazeds/WEB-INF/flex/services-config.xml"

    이는 Tomcat의 BlazeDS에 설정한 service-config.xml을 참고하여 컴파일 하겠다는 뜻이다.
    HttpService에서 destination 정보만 가지고 어떻게 BlazeDS와 어떻게 통신할 수 있는가가 여기에 답이 있는거다.

    사용자 삽입 이미지

    만약 서버쪽에 설정한 destination의 url을 바꾸면 저게 소용없지 않느냐하고 반문할 수 있다. 궁금하면 실제로 바꿔보길 바란다. 그리고 웹애플리케이션을 재로드하고 Flex를 수정하지 않은 상태에서 다시 실행해보자. 정상적으로 바뀐 url을 로드하는 것을 확인할 수 있을 것이다. 즉, Flex 컴파일러는 컴파일 옵션인 -service에 지정된 service-config.xml에 관련된 설정을 분별하면서 적용한다는 뜻이기도 하다.  url정보까지 flex컴파일시 담아두는 역할을 하지 않는것이 어찌보면 당연한거다.



    8. Remote 서비스 예제

    Remote 서비스는 Flex의 RemoteObject를 이용한 서비스를 지칭한다. RemoteObject를 이용할때는 BlazeDS의 remoting-config.xml을 설정하면 되겠다.

    remoting-config.xml은 Flex의 RemoteObject로 부터 설정된 destination으로 접근하여 AMF형태로 데이타를 송수신하기 위한 설정을 포함한다.


    WEB-INF/flex/remoting-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <service id="remoting-service"
    3.     class="flex.messaging.services.RemotingService">

  •     <adapters>
  •         <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
  •     </adapters>
  •     <default-channels>
  •         <channel ref="my-amf"/>
  •     </default-channels>
  •     <destination id="jidolstarRO">
  •         <properties>
  •             <source>com.jidolstar.JidolstarTest</source>
  •         </properties>
  •         <channels>
  •             <channel ref="my-amf"/>
  •         </channels>
  •     </destination>
  • </service>

  • <default-channels>에 <channel>로 my-amf를 쓰고 있다.

    WEB-INF/flex/service-config.xml
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <services-config>
    3.     ...(생략)
    4.     <channels>
    5.         <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
    6.             <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
    7.         </channel-definition>
    8.     </channels>
    9.     ...(생략)
    10. </services-config>

    my-amf channel은 service-confing.xml에 설정되어 있다. Remote서비스를 지원해야하므로 AMFChannel/AMFEndpoint를 class로 설정한 것을 알 수 있다.

    remoting-config.xml에 <destination>의 id로 jidolstarRO로 설정했다. 그리고 <properties>로 com.jidolstar.JidolstarTest로 설정했는데 이것은 Flex에서 접근하는 자바빈즈이다. Flex에서 RemoteObject의 destination이 jidolstarRO로 되어 있다면 RemoteObject는 com.jidolstar.JidolstarTest에서 정의한 public 메소드를 호출하여 결과값을 자바객체형태로 받을 수 있다. 이때 통신 객체는 AMF형태로 주고받게 된다.

    가령 Flex를 다음과 같처럼 코딩했다고 하자.

    RemoteObject를 이용해 BlazeDS에서 설정한 destination인 jidolstarRO로 통신
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    3.     <mx:RemoteObject
    4.         id="ro"
    5.         destination="jidolstarRO"
    6.         showBusyCursor="true"
    7.         result="dg.dataProvider=event.result"
    8.         fault="trace(event.toString())"/>

  •     <mx:DataGrid id="dg" width="100%" height="100%"/>
  •     <mx:Button label="읽어오기" click="ro.read()"/>
  • </mx:Application>

  • 위 Flex 소스에서 destination을 jidolstarRO로 했으므로 앞서 remoting-config.xml에 설정한 대로 자바빈즈 com.jidolstar.JidolstarTest로 접근하게 되고 버튼을 클릭하면 com.jidolstar.JidolstarTest에 정의된 read() 메소드를 호출하게 된다. read()함수의 반환값은 RemoteObject의 result 이벤트가 호출될때 event.result로 부터 얻을 수 있는데 그 값을 DataGrid에 출력하고 있다.

    서버측 자바 프로그램은 /WEB-INF/src/com/jidolstar에 다음과 같은 Java코드를 넣는다.

    Member.java
    1. package com.jidolstar;
    2. import java.io.Serializable;
    3. public class Member implements Serializable
    4. {
    5.     public String userId;
    6.     public int age;
    7.     public String userName;
    8.     public Member(String userId, int age, String userName)
    9.     {
    10.         this.userId = userId;
    11.         this.age = age;
    12.         this.userName = userName;
    13.     }
    14. };


    JidolstarTest
    1. package com.jidolstar;
    2. import java.util.*;
    3. public class JidolstarTest
    4. {
    5.     public List read()
    6.     {
    7.         ArrayList al = new ArrayList();
    8.         al.add( new Member("jidolstar",30,"지돌스타") );
    9.         al.add( new Member("joykim",31,"조이킴") );
    10.         return al;
    11.     }
    12. }

    Editplus에서 ctrl+1을 눌러 Member.java, JidolstarTest.java 순서로 컴파일 한다. Editplus하단에 에러가 없는지 꼭 확인하자. 그리고 컴파일된 결과물은 WEB-INF/classes에 들어가 있는지 꼭 확인해보자.

    위와 같이 설정을 마친뒤 Java컴파일을 하고 톰켓을 다시 시작한다. 그리고 J2EE기반의 Server Technology를 서포트해주는 Flex프로젝트를 만들고 Flex를 구동해보면 아래와 같은 화면을 볼 수 있다.
    사용자 삽입 이미지


    이 예제도 앞서 설명한 Http 서비스에서 Flex 프로젝트를 만들때와 마찬가지로 J2EE를 Server Technology로 선택하고 만들면 되겠다.



    9. Message 서비스 예제

    Message 서비스를 하기 위해서는 messaging-config.xml을 설정하면 된다. 앞서 설명한 remoting-config.xml과 크게 다를 것없다. Message 서비스는 Flex의 Producer와 Consumer를 이용해서 사용한다. 관련예제는 시중 서적이나 BlazeDS의 turnkey 다운로드 버전에 sample.war을 참고 바란다.



    참고내용

    BlazeDS 사용해보기 : http://blog.jidolstar.com/362
    BlazeDS 공식페이지 :
    http://opensource.adobe.com/blazeds
    BlazeDS 개발자 가이드 :
    http://livedocs.adobe.com/blazeds/1/blazeds_devguide/
    Chocodonut의 데이터 연동 : http://chocodonut.tistory.com/235
    Chocodonut의 HTTPService : http://chocodonut.tistory.com/240
    Chocodonut의 WebService : http://chocodonut.tistory.com/242
    Chocodonut의 RemoteService : http://chocodonut.tistory.com/253


    정리하며...



    Java에 대해서 잘 모르면서 BlazeDS를 하다보니 개념 설명을 많이 했다. WAS, Servlet, JSP, J2EE등 말은 들어봤지만 개념조차도 잘 몰랐던 내용들이였다. 덕분에 어느정도 개념이 잡혔고 더불어 BlazeDS의 전반적인 구조 및 활용 방법에 대해서도 공부할 수 있었다.

    스타플(http://starpl.com)에 BlazeDS를 적용할려고 하는데 몇가지 봉착하는 문제가 있다. SWF와 BlazeDS의 서버가 다를때 RemoteObject로 어떻게 접근하고 설정을 해야하는가? 이에 대한 경험이 있는 고수님은 답변주시면 정말 큰절드리겠습니다. ^^

    이 글을 보시고 질문할 사항이나 보완할 내용이 있다면 언제든지 댓글 달아주세요. 정보 공유의 힘을 믿어보겠습니다. ^^


    글쓴이 : 지돌스타(http://blog.jidolstar.com/363)
     http://www.dude.co.kr

    P 이경철님의 파란블로그에서 발행된 글입니다.

    댓글 없음:

    댓글 쓰기