J2EE는 엔터프라이용 웹 기반 애플리케이션을 개발 및 전개할 수 있는 플랫폼 독립의 환경이다. 이 플랫폼은 메타 언어나 언어 상위 세트로 연결되었다. 하지만, J2EE는 근본적으로 자바 프로그래밍 언어이고, 특정한 자바 클래스의 최소 세트이다. (참고자료)
J2EE는 멀티 티어, 웹 기반 애플리케이션들을 개발하는 애플리케이션 프로그램 인터페이스(API), 서비스, 프로토콜들로 구성된다. 이것은 복잡한 표준이고, 이를 단순화하는 것과 관련된 글을 쓴다는 것은 마치 미국 세법을 단순화 하는 것과 관련된 글을 쓰는 것과 같다. 쉬운 작업이 아니라는 뜻이다. 하지만, 제 1의 원리부터, 많은 구현 상세들까지 다루다 보면, 깨달음이 올 것이다. 이제 안전 벨트를 단단히 매고 출발해보자.
J2EE 멀티-티어 디자인의 클라이언트 레이어는 순수 HTML 프로토콜(JavaServer Pages (JSP)와 Java 서블릿으로 생성됨)로 표현되고, TCP/IP 전송 프로토콜로 자바 애플릿을 전개한다. 모든 표준 순응 웹 브라우저는 J2EE 시스템의 클라이언트처럼 잘 작동되어야 한다.
서버 레이어에는 엔터프라이즈 애플리케이션의 플랫폼 로직이 정의되는 Enterprise JavaBeans (EJB) 기술이 포함되어 있다. EJB 서버는 쓰레딩, 동시성, 메모리 관리, 보안 기능을 제공하고, 이러한 일들을 자동으로 수행하여 애플리케이션 프로그래머의 짐을 덜어준다. 바로 이것이 J2EE의 힘이다.
엔터프라이즈의 가장 귀중한 데이터들은 가장 낮은 레이어에 있는데, 여기에서 IBM® DB2®, Oracle, MySQL 같은 표준 데이터베이스 툴이나 Structured Query Language (SQL) 기반 데이터베이스 엔진이 Java Database Connectivity (JDBC) 인터페이스를 통해 액세스 된다.
J2EE는 웹 서비스에 상당히 집중하고 있다. 웹 서비스야 말로 두 개 이상의 애플리케이션들이 표준 기반 방식으로 서로 데이터를 통합 및 교환할 수 있는 놀라운 방식이다. J2EE는 값진 기술들의 집합소라 할 수 있다. J2EE 환경에서 커리어를 쌓기 위해 이 모든 기술들을 마스터 할 필요는 없지만, 이것을 배워두면 프로그래머들은 커리어를 높일 수 있다.
다음은 많은 J2EE 기술들의 일부이다. 이 모든 기술들을 마스터 한 프로그래머들은 오늘날 직업 시장에서 상당히 수요가 높다. 내가 중요하다고 생각하는 순서대로 나열했으며, 어디까지나 내 주관적인 생각이다.
내가 이 리스트를 공개하는 이유는 J2EE의 복잡성도 설명하고, 이러한 기술들을 배울 때 어떤 순서로 배워야 할 지에 대해서 대강의 개요를 제공하기 위해서이다. 중요한 기술들은 다음과 같다:
- JSP: 실행 전에 서블릿으로 컴파일 된 인라인 자바 코드를 가진 HTML 템플릿으로 된 파일.
- EJB: 엔터프라이즈 웹 애플리케이션의 플랫폼 로직을 나타낸다. 두 가지 유형의 EJB 기술로는 엔터티 빈(entity beans)과 세션 빈(session beans)이 있다.
- JDBC: 자바 환경에서 데이터베이스로 연결하는 API. Open Database Connectivity (ODBC) 대신 자바 프로그래머가 대안으로 사용할 수 있다.
- Java API for XML Processing (JAXP): XML 문서를 파싱 및 변형할 때 애플리케이션을 보조함.
- Java Naming and Directory Interface (JNDI): 애트리뷰트를 사용하는 객체를 검색하고, 애트리뷰트를 객체들과 제휴시키는 등의 디렉토리 연산을 수행하는 메소드를 정의함.
- Java API for XML-based Remote Procedure Call (JAX-RPC): 개발자가 Web Service Description Language (WSDL)에서 나타낸 클라이언트와 서비스를 만들 수 있도록 함. WSDL은 서비스를 메시지에 대해 연산을 수행하는 엔드포인트로서 기술하고, XML로 정의된다.
-
Java API for XML-based Web Services (JAX-WS): 개발자들이 WSDL에 의해 기술되는 클라이언트와 서비스를 구현할 수 있다는 점에서 JAX-RPC와 비슷하다. 하지만, JAX-WS는 웹 서비스 엔드포인트를 선언할 때
@WebService같은 주석을 사용하기 때문에 전개 디스크립터가 필요 없다. JAX-WS를 사용하면, 전개 디스크립터를 사용하지 않고 웹 서비스를 전개할 수 있다. - Java Architecture for XML Binding (JAXB): 바인딩 컴파일러와 런타임 프레임웍을 제공하여 자바 객체들을 XML 문서로 매핑한다. 시스템이 유효한 메시지들만 수락하여 처리하는지를 확인하는 것이 가능하다. 컴파일러는 World Wide Web Consortium (W3C) XML 스키마를 자바 클래스로 자동 변형하기 때문에, 여러분이 복잡한 파싱 코드를 작성할 필요가 없다.
- Java API for XML Messaging (JAXM): 애플리케이션들이 인터넷을 통해 XML 비즈니스 문서를 교환할 수 있다. 재고 리스트, 송장, 기타 수많은 비즈니스 문서 등이 예이다.
- Java API for XML Registries (JAXR): 웹 서비스를 구현, 전개, 발견하는데 유용한 다양한 종류의 XML 레지스터에 액세스하는 표준 API를 제공한다.
- Java Message Service (JMS): 많은 메시징 시스템 제품들의 일반 기능들에 액세스 하는 일관된 API로 메시지 기반 애플리케이션을 작성할 수 있도록 해준다.
- Java Management Extensions (JMX): J2EE 애플리케이션 서비스를 모니터링 및 관리하기 위해 만들어진 자바 표준.
J2EE는 엔터프라이즈 레벨 애플리케이션을 위해 만들어졌기 때문에 서버 인프라스트럭처는 많은 태스크들을 자동으로 핸들한다. 태스크 중에는 컨테이너-관리(Container-managed) 트랜잭션, 확장, 패일오버 관리, 보안 컨트롤 등이 있다.
컨테이너 관리 관계는 엔터티 빈들 사이에 일대일 및 일대다 관계를 지원한다. (엔터티 빈은 영속 저장 메커니즘에 비즈니스 객체들을 나타내는 자바 클래스이다. 예를 들어, 하나의 데이터베이스에 특정 행(row)) 일대다 관계의 경우, 엔터티 빈은 자바 컬렉션을 사용하여 다(many) 측면을 나타낸다. 이 같은 관계를 관리하는 기능은 관계형 데이터베이스 기술에서 관계 모델링의 개념과 비슷하다.
EJB 컨테이너는 모든 엔터티 빈 관계들의 참조 무결성을 관리하는데 있어 중요하다. 일대일 관계에서, 관계의 한 측을 변경하면 컨테이너는 자동으로 오래된 관계를 대체한다.
컨테이너 관리 트랜잭션의 중요성은 아무리 강조해도 지나치지 않는다. Apache Geronimo는 J2EE 표준에 순응하는데, J2EE 표준이 지정하는 컨테이너 클래스를 관리하는 커널을 제공한다.
Apache Geronimo 디자인에서 기본 컨테이너 클래스는 GBean.이다. 사실, Geronimo의 거의 모든 것은 GBean이다. 아파치 Geronimo 디자인에서, 프레임웍은 GBean 클래스의 라이프 사이클을 관리한다. 일부를 컨테이너에 전개하면, 이들을 시작 및 중지해야 한다. 더욱이, GBean은 의존성도 갖고 있다.
예를 들어, Bean Y는 Bean X가 실행되도록 준비해야 한다. Bean X가 Bean Y의 특정 서비스를 사용하여 올바르게 작동하도록 하기 위해 특정 서비스를 사용해야 한다. Geronimo 방식으로 이러한 일을 수행할 때, 프레임웍이 관리하는 모든 것, 특히 의존성을 패키징 한다. Geronimo 힘의 원천은 개발자가 J2EE 자산들을 사용하여 작업할 수 있는 프레임웍을 제공한다는 점이다.
기존 J2EE 리소스들을 GBean 컨트롤로 래핑함으로서, J2EE 표준의 라이프 사이클 요구 사항들을 채울 수 있다. Geronimo의 중심에는 GBean용 Inversion of Control (IoC) 프레임웍을 정의하는 커널이 있다. IoC 프레임웍은 프레임웍이 컴포넌트들 간 의존성을 자동으로 관리할 수 있는 환경을 만든다.
Listing 1은 Application X에서 사용하는 웹 서비스이다. (Application X의 상세에 대해서는 걱정하지 말라. 다음 클래스를 로딩하고, doit() 메소드를 호출하는 것으로 생각하면 된다.)
Listing 1. MessageContext
public class WebService {
public WebService(MessageContext msgc) {
public void doit() {
...
}
}
}
|
Application X에는 MessageContext라는 것이 있는데, 여기에는 모든 설정 정보들이 들어있다. WebService 클래스의 MessageContext를 사용하여, Application X는 클래스가 XX(MessageContext) 같은 컨스트럭터를 갖거나, setMessageContext(MessageContext msgctx) 같은 메소드를 사용한다면 MessageContext를 투입할 수 있다.
전형적인 J2EE 컨테이너에는 두 개의 중요한 클래스 유형들이 있다. EJB 컨테이너와 웹 컨테이너 같은 핵심 서비스 클래스들과, 핵심 서비스들이 전개하는 애플리케이션 클래스들이 바로 그것이다. 이러한 2-티어 아키텍처를 사용하여, 2차 클래스의 관리는 프레임웍이 제공하는 자동 프로세스들을 통해 간단해 진다.
GBean의 작동은 Geronimo 아키텍처의 본성을 드러낸다. GBean의 XML 직렬화에 필수적인 플랜(plan)을 사용하여, GBean이 로딩, 시작, 처리되어 애플리케이션 클래스들을 관리한다.
전개 디스크립터는 프레임웍이 관리하는 애플리케이션들을 정의하고, J2EE 애플리케이션 아카이브로 압축된다. Geronimo 전개자는 여기에서 GBean을 구현하는 것으로 이러한 아카이브들을 파싱한다. 전개자가 구현하는 GBean들이 시작된다. 애플리케이션을 사용할 수 있게 된 것이다. 결국, GBean은 직렬화 및 잘 저장되면서, 엔진이 다른 일들을 수행하는 동안, 상태를 보존한다. 이것은 서버를 재 시작 한 후에도 전개된 애플리케이션을 사용할 수 있도록 해준다.
GBean은 다음 상태들 중 한 상태로 존재한다:
- Stored: 스토리지 상태에 있을 때, GBean은 플랜(plan) 또는 설정 스토어에 존재한다.
- Loaded: GBean은 로딩될 때 관련 없는 이름으로 매핑되면서, 같은 GBean의 여러 인스턴스들이 존재할 수 있도록 한다.
- Running: GBean은 실행 상태에 있으면서, 애플리케이션 클래스들을 조정한다.
GBean 라이프 사이클 상태는 일반적으로 Listing 2처럼 구현된다.
Listing 2. GBeanLifecycle 메소드
public class AppFunction implements GBeanLifecycle {
public void doStart() throws Exception {
}
public void doStop() throws Exception {
}
public void doFail() {
}
}
|
GBean은 GBeanLifecycle 인터페이스를 구현하면서, Geronimo 프레임웍이 GBean 상태를 on/off로 전환하고, 이 상태 데이터나 실행 콘텍스트가 특정 순간에 머무르는 곳을 제어할 수 있도록 한다.
GBean을 작성할 때 염두 해야 할 몇 가지 팁들이다:
- 라이프 사이클 콜백을 얻으려면, GBean은
org.apache.geronimo.gbean.GBeanLifecycle옵션 인터페이스를 구현해야 한다. -
GET과SET메소드는 GBean에 애트리뷰트를 제공한다. - GBean의 컨스트럭터는
GBeanInfo에서 여러분이 선언한 멤버 함수들을 호출해서는 안된다. - GBean은 시그니처를 가진 메소드를 구현해야 한다.
public static GBeanInfo getGBeanInfo()
이 프레임웍은 GBean이 사용하거나 메소드에서 노출하는 중요한 메타데이터를 받는다. 작동, 레퍼런스, 기본 애트리뷰트에 대한 메타데이터는 정적 블록 이니셜라이저에서 초기화 된다. (Listing 3)
Listing 3. Metadata
public static final GBeanInfo GBEAN_INFO;
static {
GBeanInfoBuilder infoBuilder = new GBeanInfoBuilder("AppGbean", AppGbean.class);
infoBuilder.addAttribute("name", String.class, true);
infoBuilder.addAttribute("kernel", Kernel.class, false);
infoBuilder.addOperation("echo", new Class[]{String.class});
infoBuilder.setConstructor(new String[] {"kernel","Name"});
GBEAN_INFO = infoBuilder.getBeanInfo();
}
|
애트리뷰트와 레퍼런스의 이름을 정할 때, 표준 자바 네이밍 규약을 반드시 따라야 한다:
- 애트리뷰트는 언제나 소문자로 시작한다.
- 레퍼런스는 언제나 대문자로 시작한다.
이러한 규칙들을 지키면 GBean 설정이 단순해 진다.
Apache Geronimo 환경에서 효과적인 프로그래밍을 하려면, GBean을 이해해야 한다. (J2EE 표준의 기능적 요구 사항들에 대한 Geronimo의 순응 방식). Geronimo, Version 1.0은 이미 J2EE Certification Test Suite를 통과했고, J2EE 소프트웨어 기술의 표준이 되고 있다. 전 세계 여러 오픈 소스 프로젝트의 많은 엔지니어들과 개인 기여자들의 노력을 증명하고 있다. 충분히 배울 가치가 있는 기술이다.
교육
-
J2EE site
-
Apache Geronimo API
-
Dependency
injection in Apache Geronimo, Part 1" (developerWorks, February 2006)
-
Dependency injection
in Apache Geronimo, Part 2" (developerWorks, February 2006)
-
J2EE standard simplifies the creation of Web services.
-
Geronimo Wiki
-
developerWorks technical events and Webcasts.
-
Apache Geronimo project area
-
Get started now with Apache Geronimo
-
IBM Support for Apache Geronimo
-
디벨로퍼웍스 Korea 오픈 소스 존
-
Apache articles and free Apache tutorials
-
Safari bookstore.
제품 및 기술 얻기
- Download Apache Geronimo.
-
IBM trial software 다운로드
- Download your free copy of IBM WebSphere® Application Server Community Edition V1.0
토론
