본 시리즈에서는 Reverse Ajax 기술을 사용하여 이벤트 주도 웹 애플리케이션을 개발하는 방법을 보여준다. 파트 1에서는 Reverse Ajax, 폴링, 스트리밍, Comet 및 롱 폴링을 소개했다. 파트 2에서는 WebSocket을 사용하여 Reverse Ajax를 구현하는 방법을 설명하고 Comet과 WebSocket을 사용하는 웹 서버의 한계를 논했다. 파트 3에서는 여러 서버를 지원하거나 사용자가 자체 서버에 배치하기 위한 독립적 웹 애플리케이션을 제공할 필요가 있는 경우 고유의 Comet 또는 WebSockets 통신 시스템을 구현하기 어려울 수 있다는 점을 설명했다. 파트 3에서는 Socket.IO에 대해서도 설명했다.파트 4에서는 Java 기술 서버용으로 가장 잘 알려진 오픈 소스 Reverse Ajax 라이브러리인 Atmosphere와 CometD에 대해 설명했다.
지금까지는 이벤트를 통해 통신하는 컴포넌트를 작성하는 방법에 대해 학습했다. 본 시리즈의 마지막 파트에서는 이벤트 주도 개발의 원리를 적용하여 이벤트 주도 웹 애플리케이션 샘플을 빌드해보자.
이 기사에서 사용한 소스 코드를 다운로드할 수 있다.
JavaScript 및 Java에 대해 잘 알고 있고 약간의 웹 개발 경험이 있으면 이 기사에서 제공하는 정보를 최대한 활용할 수 있을 것이다. 또한, 이 기사에 있는 샘플을 실행하려면 Maven 및 JDK의 최신 버전도 필요하다(참고자료 참조).
이벤트 주도 아키텍처(EDA), EventBus 시스템, 메시징 시스템, 복잡한 이벤트 처리(CEP) 및 채널에 익숙한지 모르겠다. 이런 용어와 개념은 이미 오래 전에 등장했다. 해당 기술의 발전과 함께 이런 용어에 대해 더 많은 얘기를 듣게 될 것이다. 이 섹션에서는 이런 개념을 간단히 설명한다.
- 이벤트
- 시스템에서 어떤 일이 일어나는 것을 의미한다. 이벤트에는 보통 발생 날짜(시간소인), 소스 또는 위치(클릭한 컴포넌트), 해당 이벤트를
설명하는 데이터와 같은 속성이 있다. 시스템에 따라, 이벤트는 선택적으로 다른 속성을 가질 수 있다.
- 이벤트 처리 아키텍처(EDA)
- 이벤트 기반 프로그래밍이라고도 부르는 EDA는 애플리케이션이 이벤트를 주고받음으로써 통신하고 실행하는 컴포넌트로 구성되는 아키텍처
설계이다. Java Swing 그래픽 사용자 인터페이스(GUI)가 EDA의 한 예다. 각각의 Swing 컴포넌트는 이벤트를 청취하고, 청취한 이벤트에 반응하고, 다른 이벤트를
전송하는 등의 작업을 수행할 수 있다. EDA는 이벤트 프로듀서, 이벤트 컨슈머, 이벤트 및 처리 소프트웨어와 같이 여러 가지 요소로 구성된다.
- 이벤트 프로듀서 - 이벤트를 실행하는 컴포넌트. 본 기사의 예제에서는 양식 제출 단추가 이벤트 프로듀서이다.
- 이벤트 컨슈머 - 특정 이벤트를 청취하는 컴포넌트. 예를 들어, 예제 양식 제출 케이스에서 브라우저는 양식 제출 단추 클릭을 청취하여 양식 데이터를 서버로 보낸다.
- 이벤트 처리 소프트웨어 - 이벤트 프로듀서가 이벤트를 발행하고 이벤트 컨슈머가 이벤트를 수신하기 위해 자신을
등록하는 시스템 코어. 소프트웨어에 따라, 처리가 단순하거나(수신된 이벤트를 컨슈머에게 전달하기만 함) 복잡(CEP)할 수 있다. CEP에서는 소프트웨어가
이벤트 집계, 필터링 및 변환과 같이 다양한 처리 수단을 지원한다.
Esper가 그런 소프트웨어의 한 예다. 이벤트 처리 소프트웨어는 독립형 실행 애플리케이션을 나타낼 뿐 아니라, 애플리케이션에 통합된 라이브러리일 수도 있다.
- 메시징 시스템
- 이벤트 프로듀서가 채널에 메시지를 발행하고 이벤트 컨슈머가 채널에 구독 신청하는 일종의 이벤트 주도 애플리케이션.
이벤트 프로듀서 및 컨슈머는 서로에 대한 링크가 없고 완전히 독립적이다. 이런 유형의 이벤트 주도 애플리케이션에서는 이벤트 대신
메시지라는 용어를 종종 사용한다.
- 채널
- 메시징 시스템에서 이벤트를 분류하는 방법. 채널은 이벤트 프로듀서가 이벤트를 보내려는 대상을 나타낸다. 예를 들어, 채팅방
애플리케이션에서는 /chatapplication/chatrooms/asdrt678과 같은 것이 채널이 된다. 이 채널은 이벤트 프로듀서가 메시지를 보낼 수 있고 그래픽 컴포넌트가
새로 도착한 메시지를 표시하기 위해 구독하는 특정 채팅방을 식별한다.
일부 메시징 시스템에서는 큐와 토픽라는 두 가지 유형의 채널을 제공한다.
- 큐 - 메시지가 큐로 배달될 때, 오직 한 이벤트 컨슈머만 이를 받아 처리한다. 다른 컨슈머는 이 메시지를 보지 못할 것이다. 확실하게 배달하기 위해 큐를 지속적으로 만들 수 있다. 가장 좋은 큐의 예는 메일링 요청일 것이다. 웹 애플리케이션은 사용자가 등록할 때 /myapp/mail/user-registration 큐에 메시지를 발행한다. 이 큐에 여러 개의 메일링 애플리케이션이 구독될 수 있다. 하나도 없는 경우에는 메시지가 손실되지 않을 것이다.
- 토픽 - 메시지가 어떤 토픽으로 배달될 때 모든 구독자가 이 메시지를 수신한다. 토픽은 보통 지속적이지 않다. /event/system/cpu/usage를 모니터링 소프트웨어에 대한 토픽의 예로 들 수 있으며, 여기서 프로듀서는 정기적으로 CPU 사용 정보를 보낸다. 한편, 관심사에 따라 구독자가 0명 또는 그 이상일 수 있다.
- 발행/구독
- 이벤트 주도 솔루션은 발행/구독 패턴을 구현한다. 이벤트 프로듀서는 처리 소프트웨어에서 이벤트를 발행하고 이벤트 컨슈머는 이를 구독하여
수신한다. 이벤트 컨슈머가 구독하는 방식은 소프트웨어에 따라 다르다. 메시징 애플리케이션에서는 이벤트 컨슈머가 채널을 구독한다(또한, 예컨대 선택적으로
이벤트 유형에 관한 필터링 규칙 적용). Esper와 같은 CEP에서는 SQL과 같은 요청을 통해 구독을 완료하여 어떤 이벤트에 관심이 있는지 정의할 수 있다.
전통적인 통신 스킴에서는 시스템 A가 시스템 B로부터 정보를 요구하는 경우 B로 요청이 전송된다. 그러면 시스템 B가 그 요청을 처리하고, 시스템 A는 응답을 위해 보류한다. 처리가 완료되면 시스템 A로 응답을 되돌려 보낸다. 이 동기 통신 모드에서는 응답을 기다리는 동안 손실되는 처리 시간 때문에 자원 소비가 효율적으로 이루어지지 않는다.
비동기 모드에서는 시스템 A가 시스템 B로부터 원하는 정보를 구독한다. 그런 다음 시스템 A가 시스템 B로 선택적으로 알림 메시지를 보내어 즉시 리턴하면, 시스템 A가 다른 것을 처리할 수 있게 된다. 이 단계는 선택적이다. 보통, 이벤트 주도 애플리케이션에서는 이벤트가 무엇인지 모르기 때문에 다른 시스템에 이벤트를 보내줄 것을 요구할 필요가 없다. 시스템 B가 응답을 발행하면 시스템 A가 이를 즉시 수신한다.
이벤트 주도 아키텍처의 한 가지 이점은 더 나은 확장성이 허용된다는 점이다. 확장성은 시스템이 본연의 목적을 충족하면서도 수요, 볼륨 또는 강도의 변화에 맞춰 적응하는 능력이다. 일시정지 시간을 제거하는 방법으로, 이벤트 주도 아키텍처는 보통 더 나은 성능을 발휘하고 처리 속도가 더욱 빨라진다.
또 다른 이점은 애플리케이션의 개발 및 유지보수에 있다. 이벤트 주도 솔루션에서는 애플리케이션의 각 컴포넌트를 완전히 격리 및 분리할 수 있다.
이벤트 주도 솔루션은 통신 대기 시간이 짧기 때문에 최상의 반응 시간을 실현할 수 있다.
과거에는 웹 프레임워크가 일반적인 요청-응답 패턴에 늘 의존했으며, 이로 인해 페이지 새로 고치기를 수행할 수밖에 없는 구조였다. 그러나 Ajax, Reverse Ajax는 물론이고, CometD 및 Atmosphere와 같은 강력한 프레임워크가 등장함에 따라, 이제는 웹에 이벤트 주도 아키텍처의 개념을 손쉽게 적용하여 분리, 확장성 및 반응성의 이점을 살릴 수 있다.
GUI 개발을 위해 클라이언트 측에 이벤트 주도 아키텍처를 적용할 수 있다. 전통적인 웹 페이지를 작성하는 대신, 컨테이너로 작동하는 단일 웹 페이지를 작성할 수 있다. 각 컴포넌트(페이지의 각 파트)를 분리할 수 있다. 가젯을 포함한 Google 페이지와 같이, 웹에 Java Swing GUI를 구현할 수 있다(링크는 참고자료 참조).
이벤트 버스가 필요할 것이다. 예를 들어, 각각의 페이지 컴포넌트가 채널을 구독하고 발행할 수 있도록 하는 JavaScript 이벤트 버스를 개발할 수 있다. 또한, 둘 이상의 이벤트가 수신된 후의 조치를 트리거하기 위해 이벤트를 동기화할 수도 있다. 한 페이지 내부의 로컬 이벤트에 대해 이벤트 버스를 사용할 수 있지만, CometD 또는 Socket.IO를 사용하여 원격 이벤트를 지원하기 위한 플러그인을 가질 수도 있다.
서버 측에는 이벤트 주도 아키텍처를 지원하는 Reverse Ajax 프레임워크를 설정해야 한다. 본 시리즈의 이전 파트에서 검토한 것 중에서, CometD에만 이벤트 주도 접근 방식이 있다. 다른 프레임워크의 경우, 사용자 정의 지원을 추가해야 하는데 이는 단순한 문제가 아니다. JMS(예: Apache ActiveMQ)와 같은 써드파티 메시징 시스템 또는 Esper와 같은 CEP를 추가할 수도 있다. 더 간단한 솔루션은 기본적인 발행/구독을 지원하는 Redis이다.
이 시리즈는 이벤트 주도 웹 및 Reverse Ajax에 관한 것이므로, 클라이언트 파트에 집중하기로 하고 복잡한 메시징 시스템을 설정하지는 않겠다.
이 기사에서 작성해볼 예제는 연결된 사용자의 목록을 포함한 사용자 패널이 있는 채팅방 웹 애플리케이션이다. 사용자 이름은 굵게 표시되고, 활성 사용자(20초 후에도 활성 상태인 사용자)는 녹색으로 표시되고, 20초 후에 비활성 상태인 사용자는 주황색으로 표시된다. 사용자가 연결하거나 연결을 끊으면 목록이 새로 고쳐진다.
보안상, web.xml 파일에 세션 제한시간이 2분으로 구성되어 있다. 비활성 상태로 2분 후에는 팝업 창이 나타나고 로그인 페이지로 전환된다.
더 이상의 세션이 없는 것으로 확인되는 즉시 또는 아직 연결하지 않은 경우 로그인 페이지로 전환된다. 로그인 페이지에서는 사용자 이름을 요구하고 사용자가 입력한 사용자 이름으로 채팅방에 로그인할 수 있는지 확인한다.
일단 로그인되면 채팅방에 있는 모든 사용자에게 메시지를 보낼 수 있다. 콘솔도 있으며 수신된 모든 이벤트를 로그에 기록한다.
이 웹 애플리케이션은 이벤트를 기반으로 한다. 위 정보로 다음과 같은 여러 가지 이벤트를 손쉽게 정의할 수 있다.
- 사용자가 연결됨
- 사용자의 연결이 끊김
- 세션이 만료됨
- 채팅 메시지가 수신됨
- 로그인되어 있지 않은 경우 보안 필터가 요청을 차단했음
- 사용자가 비활성 상태가 됨
- 사용자가 활성 상태가 됨
- UI 조정과 관련된 다른 모든 이벤트
일부 이벤트는 웹 애플리케이션에 대해 로컬일 뿐이다. 이런 이벤트는 리스트 1에 표시된 것처럼 로컬 버스에서 식별한다.
리스트 1. 버스 설정
bus = {
local: new EventBus({
name: 'EventBus Local'
}),
remote: EventBus.cometd({
name: 'EventBus Remote',
logLevel: 'warn',
url: document.location.href.substring(0,
document.location.href.length -
document.location.pathname.length) + '/async',
onConnect: function() {
bus.local.topic('/event/bus/remote/connected').publish();
},
onDisconnect: function() {
bus.local.topic('/event/bus/remote/disconnected').publish();
}
})
};
|
다른 이벤트는 원격이며, 이는 CometD와 같은 Reverse Ajax 시스템을 모든 클라이언트 사이에서 발행해야 한다는 뜻이다. 그림 1 은 예제 애플리케이션을 나타낸 것이다.
그림 1. 예제 애플리케이션
예제 애플리케이션을 다운로드할 수 있다. 많은 클래스가 보안이나 세션 및 사용자 관리를 위한 연결 클래스(plumbing class)이다. 이 기사에서는 코드의 가장 중요한 파트를 보여주지만, 코드의 작동 방식을 더욱 깊이 이해하려면 예제 애플리케이션을 다운로드하여 실행해보는 것이 좋다.
이 웹 애플리케이션은 채팅방, 사용자 목록 및 콘솔과 같이 서로 다른 컴포넌트로 구성된다. 각각의 컴포넌트는 완전히 독립적이며 다른 컴포넌트에 영향을 주지 않고 제거할 수 있다.
로컬과 원격으로 이벤트 주도 시스템을 설정하기 위해, 예제에서는 Ovea의 EventBus 시스템을 사용한다. 이 시스템은 로컬 이벤트 버스, 원격 이벤트를 위한 CometD용 브릿지, 이벤트를 조정할 방법(여러 이벤트가 완료된 후 조치를 트리거하기 위해)을 제공한다. 물론, 개발자의 선택에 따라 다른 시스템을 대신 사용할 수 있다. 리스트 1에 나타낸 것처럼, 예제 설정은 JavaScript로 이루어진다.
버스가 설정되면 애플리케이션과 컴포넌트가 이벤트를 기반으로 하게 된다. 리스트 2에 나타낸 것처럼, 이 예제에서는 IDLE 탐지 시스템이 설정된다.
리스트 2. IDLE 탐지 시스템
bus.local.topic('/event/dom/loaded').subscribe(function() {
$.idleTimer(20000);
$(document).bind('idle.idleTimer', function() {
bus.local.topic('/event/idle').publish('inactive');
});
$(document).bind('active.idleTimer', function() {
bus.local.topic('/event/idle').publish('active');
});
})
|
리스트 2의 코드를 이용해, IDLE 시스템은 어떤 활동을 발견할 때 이벤트를 보낸다. IDLE 시스템을 필요로 하는 어떤 애플리케이션에서든 이 코드를 사용할 수 있다. 이런 경우, 사용자 활동에 대해 원격 이벤트에서 이 코드를 변환할 필요가 있다. 리스트 3에 나타낸 것처럼, 이 역시 JavaScript로 완료된다.
리스트 3. 사용자 활동 관리
bus.local.topic('/event/idle').subscribe(function(status) {
bus.remote.topic('/event/user/status/changed').publish({
status: status == 'active' ? 'online' : 'away'
});
});
bus.remote.topic('/event/user/status/changed').subscribe(function(evt) {
if(evt.user != me.name) {
$('#users li').filter(function() {
return evt.user == $(this).data('user').name;
}).removeClass('online')
.removeClass('away')
.addClass(evt.status);
}
});
|
첫 번째 구독은 IDLE 시스템에서 이벤트를 수신하고 사용자 상태를 서버로 전송한다. 다른 구독은 서버로부터 사용자 상태 이벤트를 수신했다. 따라서 사용자 상태가 변경되자마자 사용자 목록의 사용자 색상이 녹색이나 주황색으로 바뀐다.
리스트 4에 표시된 것처럼, 사용자가 연결하거나 연결을 끊으면 이벤트가 전송된다.
리스트 4. 사용자 목록 관리
bus.remote.topic('/event/user/connected').subscribe(function(user) {
$('#users ul').append(row(user));
});
bus.remote.topic('/event/user/disconnected').subscribe(function(evt) {
$('#users li').filter(function() {
return evt.user == $(this).data('user').name;
}).remove();
});
|
애플리케이션 코드가 단순하고 분리 및 격리되어 있다. 수많은 Ovea의 기술을 다시 사용함으로써, 이벤트 주도 웹 애플리케이션을 빠르게 작성할 수 있다. 하지만, 다른 시스템을 대신 사용할 수 있으므로 필수적인 것은 아니다. 이 예제를 개발하는 데는 하루밖에 걸리지 않았고, 그 중 절반은 다음을 포함한 연결 코드이다.
- 프로젝트를 빌드하기 위한 Maven
- 보안 기능(로그인, 로그아웃, 세션 제한시간)
- Jersey를 사용하는 RES 서비스
이 시리즈에서는 훌륭한 사용자 경험을 제공하고 응답성과 확장성이 뛰어난 애플리케이션을 빌드하는 방법을 보여주었다. 이벤트 주도 웹 애플리케이션은 상당히 새로운 개념이다. 어떤 웹 프레임워크에서는 이런 애플리케이션을 내부적으로 사용하지만, 이 기사에서는 그런 애플리케이션을 빌드하기 위해 웹 프레임워크가 필요한 것은 아니라는 점을 보여주었다. 전문화되고 훌륭한 라이브러리를 사용하는 것은 Java 개발자와 웹 디자이너 간의 책임을 분명히 구분하는 데 있어 충분하다는 것 이상의 의미를 가진다. 이벤트 주도 개발을 일상적인 루틴 작업의 일부로 만드는 방법을 더욱 깊이 이해하는 기회가 되기 바란다. 이는 매우 중독성이 강한 일로서, 한번 직접 해보면 기존의 프레임워크로 되돌아가고 싶지 않을 것이다.
| 설명 | 이름 | 크기 | 다운로드 방식 |
|---|---|---|---|
| Article source code | reverse_ajaxpt5_source.zip | 925KB | HTTP |
교육
- 이 시리즈의 이전 파트를 읽어보자.
-
iGoogle: 웹 상의 Java Swing GUI 예제를 살펴보자.
-
CometD: 이 이벤트 주도 Reverse-Ajax 솔루션에 대한 모든 내용을 읽어보자.
- 위키피디아에서 다음에 대한 내용을 읽어보자.
- AJAX
- Reverse-Ajax
- 이벤트 주도 아키텍처와 프로그래밍
-
Opher Etzion 박사와 Peter Nibblet이 공동 집필한 Event Processing in
Action에서는 이벤트 처리 애플리케이션을 사용, 설계 및 빌드하는 방법을 설명한다.
- "Google AppEngine uses Jetty!"에서는
Google의 Jetty 사용자 정의에 관해 설명한다.
- Jetty
Continuation과 기능에 대해 자세히 읽어보자.
-
Exploring Reverse AJAX: 몇 가지
Reverse-Ajax 기술을 소개한다.
-
JSONP를 사용한 도메인 간 통신,
파트 1: JSONP와 jQuery의 결합으로 강력한 매시업 빠르게 만들기(developerWorks, 2009년 2월): 모호한 상호 도메인 호출 기술(JSONP)과 유연성이 뛰어난
JavaScript 라이브러리(jQuery)를 결합하여 강력한 매시업을 매우 빠르게 만들 수 있는 방법을 확인할 수 있다.
-
Build
Ajax applications with Ext JS(developerWorks, 2008년 7월): Ext JS 배후의 오브젝트 지향 JavaScript 설계 개념의 개요에 대해 알아보고, 리치 인터넷 애플리케이션 UI 요소를
위해 Ext JS 프레임워크를 사용하는 방법에 대해 배워보자.
-
Compare JavaScript frameworks(developerWorks, 2010년 2월): JavaScript 개발을 엄청나게 강화하는
프레임워크의 개요에 대해 알아보자.
-
Ajax 마스터하기, 파트 2: JavaScript와 Ajax를 이용한 비동기식 요청(developerWorks, 2006년 1월): Ajax 및 서버가
응답하도록 사용자가 대기하게 두지 않는 요청/응답 모델을 작성하는 XMLHttpRequest 오브젝트를 사용하는 방법에 대해 배워보자.
-
모바일 웹용 Ajax 애플리케이션 작성하기(developerWorks, 2010년 3월): Ajax를 사용하여 크로스 브라우저
스마트폰 웹 애플리케이션을 빌드하는 방법에 대해 알아보자.
-
애플리케이션 개발시 Ajax를 사용해야 할 부분과 시점(developerWorks, 2008년 2월): Ajax를 사용해
불편한 사용자 경험을 제거하여 웹 사이트를 증진시키는 방법을 확인할 수 있다.
-
Web 2.0 애플리케이션의 성능 향상시키기(developerWorks, 2009년 12월): 다양한 브라우저 측 캐시 메커니즘을
알아보자.
- "Introducing
JSON"(JSON.org): JSON 구문에 대한 개론을 살펴보자.
-
developerWorks 웹 개발 영역: 다양한 웹 기반 솔루션을 다루고 있는 기사를 찾아보자.
-
developerWorks podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
-
developerWorks technical events and webcasts: developerWorks 기술 행사 및 웹 캐스트를 통해 최신 정보를 얻을 수 있다.
제품 및 기술
- Ovea의
GitHub에 대해 CometD 프로젝트에 Ovea가 기고한 글을 읽어보자.
- JavaScript Event-Bus(Ovea의
GitHub에서 제공): 로컬 및 원격에서 JavaScript로 작성된 이벤트 주도 솔루션에 대한 정보를 제공한다.
- JavaScript event
synchronization(Ovea의 GitHub에서 제공): 비동기 이벤트를 동기화하자.
- Esper 다운로드: 복잡한 이벤트 처리
소프트웨어다.
- Apache에서 ActiveMQ 메시징 시스템을
다운로드하자.
-
Redis: 비동기 기능이 있는 메모리 캐싱 시스템을 구할 수 있다.
-
Event-Driven Web Sample:
이 기사에 사용된 예제의 소스 코드를 다운로드할 수 있다.
-
CometD 소스 코드: 웹 메시징을 위한 확장성 있는 Comet(서버 밀어넣기) 구현을 위한 프로젝트를
다운로드하자.
-
CometD 확장:
Ovea에서 Jetty 8 WebSocket 및 Google Guice 지원을 위해 CometD 확장 패키지를 다운로드하자.
-
Jetty: Jetty, 웹 서버 및 javax.servlet 컨테이너와 WebSocket을 위한 지원을 받을 수 있다.
- Apache Tomcat
Advanced I/O (documentation): 중요한 링크, 사용자 안내서, 참조 자료 및 Apache Tomcat 개발 지시사항을 확인할 수 있다.
-
Grizzly NIO Framework: Java NIO API를 사용하는 데 도움이 되는 정보를 얻을 수 있다.
-
Grizzly Comet
Sample: 애플리케이션을 처음부터 새로 빌드하기 전에 기존 애플리케이션에서 변경할 필요가 있는 사항을 살펴보자.
-
Glassfish Application Server: 주요 GlassFish Server Open Source Edition을
다운로드할 수 있다.
-
Socket.IO Java:
원래 프로젝트와 Ovea의 최근 업데이트 버전을 다운로드할 수 있다.
- Apache Maven: 소프트웨어 프로젝트 관리
및 종합 도구인 Maven을 구할 수 있다.
-
Java Development Kit, Version 6: 데스크탑 및 서버는
물론, 오늘날과 같이 조건이 까다로운 임베디드 환경에서도 Java 애플리케이션을 개발하고 배치할 수 있게 해주는 Java SE(Java Platform, Standard
Edition)를 구할 수 있다.
- 무료로 IBM 소프트웨어를 체험해보자. 시험판을 다운로드하고 온라인 시험판에 로그인하며
샌드박스 환경에서 제품으로 작업하거나 클라우드를 통해 이에 액세스하자. 100개 이상의 IBM 제품 체험판에서 선택하자.
토론
- 토론 포럼에 참여하자.
- 지금 developerWorks 프로파일을 작성하고 Ajax에 대한 관심목록을 설정해보자. developerWorks 커뮤니티에서 최신 정보를 확인하자.
- 웹 개발에 관심이 있는 다른 developerWorks 구성원을 찾아보자.
- 지식 공유: 웹 토픽을 중점적으로 다루는 developerWorks 그룹 중 하나에 참여하자.
- Roland Barcia는 자신의 블로그에서 Web 2.0 및 미들웨어에 대해 설명했다.
- developerWorks 멤버의 공유해
놓은 웹 토픽에 대한 책갈피를 따라가 보자.
- 빠른 해답: Web 2.0 Apps forum을 방문하십시오.
- 빠른 해답: Ajax forum을 방문한다.

Ovea의 Java 웹 아키텍트이자 컨설턴트인 Mathieu Carbou는 서비스 및 개발 솔루션을 제공하는 업무를 담당하고 있다. 그는 여러 가지 오픈 소스 프로젝트의 커미터 겸 리더, 각종 세미나나 행사에서의 연사, 몬트리올의 Java User Group 리더로서도 활발하게 활동하고 있다. Mathieu는 코드 설계 및 우수 사례에 풍부한 경력을 지니고 있고, 클라이언트 측에서 백엔드로의 이벤트 주도 웹 개발 전문가이기도 하다. 그는 규모 가변성이 뛰어난 웹 애플리케이션에서 이벤트 주도 및 메시징 솔루션을 제공하는 데 주력하고 있다. 그의 블로그를 살펴보는 것도 도움이 될 것이다.