시소당
[4th Seoul Workshop]Java Beans - Java Component Architecture
김형일
경기도 용인시 기흥읍 서천1리
경희대학교 전자계산공학과 운영체제 연구실
E-mail : hikim@oslab.kyunghee.ac.kr
URL : http://oslab.kyunghee.ac.kr/~hikim/
Abstract:
Java Beans API는 컴포넌트 소프트웨어 개발을 위한 표준 API이다. 사용자는 Java Beans을 이용하여 개발된 소프트웨어 컴포넌트들을 자신의 프로그램에 쉽게 연결하여 사용할 수 있으며, 개발자들은 Java가 아닌 다른 플랫폼의 소프트웨어 컴포넌트까지 연결하여 사용할 수 있는 기능을 제공하여 준다. 따라서, Java Beans는 개발자들에게는 표준화된 인터페이스 규격을 제공하며, 사용자에게는 간단하게 사용할 수 있는 방법을 제공하고 있다. 현재, Java Beans은 1.0 스펙이 완성된 상태이다.
Keywords:
Java, Java Bean, Component Architecture, Events, Method, Interface
1. 서론
1.1 Java Bean이란?
Java Beans API는 컴포넌트 소프트웨어 개발을 위한 표준 API이다. 컴포넌트 소프트웨어란 마이크로소프트사의 Visual Basic 언어의 VBX나 볼렌드사의 델파이 컴포넌트와 같이 자동차의 부속품 같이 여러 응용 프로그램을 만드는데 사용될 수 있는 작은 단위의 소프트웨어를 말한다. 이러한 컴포넌트 소프트웨어는 재사용성을 높이려는 객체지향 프로그래밍에 잘 부합한다고 할 수 있다. Java Beans는 이와 같은 컴포넌트 소프트웨어들을 서로 연결시켜주는 중립적인 API로, 개발자들은 이를 이용하여 Java가 아닌 다른 플랫폼의 소프트웨어 컴포넌트를 자바에서 사용할 수 있으며, 사용자는 개발된 소프트웨어 컴포넌트들을 자신의 프로그램에 쉽게 연결하여 사용할 수 있다.
1.2 Java Platform의 특징 과 확장
Java Beans를 소개하기 앞서, 우선 자바가 가지는 장점에 대하여 생각해보자.
뛰어난 이식성: 자바는 이식성이 뛰어난 인터인트라넷 에플랫과 에플리케이션을 개발할 때 유용하게 사용되는 플랫폼이다. 거의 모든 웹 브라우저에서 자바를 지원하고 있으며 앞으로는 운영체제에서 직접 자바를 지원하는 방향으로 자바 환경이 변화하고 있다.
강력하고 간결한 환경: 자바 개발 환경은 객체지향 언어의 특징을 강력하게 지원하고 있으며, 기존의 프로그래밍 환경이 복잡하였다는 것에 반하여 단순하고 사용이 편리한 사용 방법을 제공해준다. 또한, 단순한 메카니즘으로 실행되기 때문에 PDA와 같은 시스템에 임베디드되거나 PC나 워크스테이션에서까지 폭넓은 응용 분야를 가지고 있다.
네트워크 환경지원: 자바는 그 개념에서부터 네트워크를 지원하고 있다. TCP/IP는 기본적으로 지원한다. 또한, 애플랫의 경우 클라이언트의 데이터를 보호하는 메카니즘도 가지고 있다. 또한, 기존의 응용 프로그램이 복잡한 설치작업을 거처야 하는 것에 비하여 네트워크 상에서 간편하게 다운로딩하여 사용할 수 있다.
Java Beans는 이러한 자바 환경을 바탕으로 더 좋은 개발 환경으로 확장하는 것이다. 현재의 자바 애플랫은 단순한 정적 컴포넌트 모델만을 제공하고 있다. 즉, 애플랫은 웹 상에 존재할 수 있지만, 이들이 다른 페이지나 다른 애플랫과 상호작용없이 단독으로만 실행된다는 것이다.
Java Beans는 현재의 정적인 자바 애플랫들 간에 상호작용을 할 수 있도록 확장한 것이다. Java Beans는 다양한 방법으로 재사용 가능한 컴포넌트를 만들고, 만들어진 컴포넌트를 핫자바, 네스케이프, 익스플로어 같은 부라우저 환경에서 뿐 아니라, 비쥬얼 베이직, 클라리스 웍스 같은 애플리케이션 환경에서 서로 조합하여 새로운 응용 포르그램을 개발할 수 있도록 해주는 역할을 한다.
Java Beans는 그래픽 인터페이스를 가질 수 있으나, 눈에 보이지 않는 기능과 서비스 만으로 구성될 수도 있다. 또한, 간단한 몇 가지 기능만 가지거나 완벽한 하나의 응용 프로그램으로 존재할 수도 있다. 각각의 컴포넌트들은 서로 다른 시간에 서로 다른 개발자에 의해서 만들어 질 수도 있다. 즉, 컴포넌트들이 하나의 응용 프로그램 안에 합쳐질 필요가 없다는 것을 의미하며, 그들간에는 동적인 통신이 이루어지게 된다.
1.3 Java Beans의 예
Java Beans를 이해하기 위해서, 구체적인 예를 들어 설명해보자. 온라인 뱅킹 서비스를 웹상에서 자바를 이용하여 제공한다고 하자. 자바 프로그램은 이윤을 계산해서 화면에 차트로 만들어 제공해주는 것이 주 목적이다. 이때 두 가지 컴포넌트를 이용한다. 하나는 이윤 계산 컴포넌트이고, 다른 하나는 차트 컴포넌트이다. 미래의 한 시점에서 사용자가 지금까지의 거래 내용을 확인해주는 새로운 컴포넌트를 개발하였다고 가정하자. 새롭게 만들어진 거래 내역 컴포넌트를 위해 또 다른 차트 컴포넌트를 만들 필요가 없으며, 단지 기존의 차트 컴포넌트를 그대로 이용하게 된다. 이런 방식의 프로그래밍이 가능하기 위해서는 이전에 개발된 컴포넌트와 새로 개발된 컴포넌트간에 통신이 동적으로 가능해야 하며 이를 Java Beans API가 지원하는 것이다. 예를 들어, 차트 컴포넌트와 이율 계산 컴포넌트는 소프트웨어 전문 개발 회사에서 만들고, 거래 내역 컴포넌트는 해당 은행애서 만들 수 있으며, 이들 간에는 마치 하나의 소프트웨어로 컴파일 한 것과 같이 서로 유연한 연결이 가능하게 된다.
이와같이, Java Beans는 앞으로 자바 환경을 더 역동적이고 유연하며 재사용이 편리한 환경으로 확장하는 목적을 가지고 있다.
1.4 Java Beans의 강점
Java Beans가 가지는 강점을 다음과 같이 요약할 수 있다.
사용하기 쉽다.
개발하기 쉽다.
네트워크 환경에 강하다.
완벽한 이식성을 제공한다.
간편한 사용법: 우선적으로 Java Beans는 자바 개발툴에게 비쥬얼 컴포넌트라는 가장 강력한 개발 기능을 제공해준다. 즉, 컴포넌트를 눈으로 확인하면서 이들을 이용해 완벽한 하나의 응용 프로그램을 만들 수 있는 사용하기 쉬운 비쥬얼 개발 툴에 대한 핵심적인 모델을 지원한다.
편리한 컴포넌트 개발: 이미 대중화되어 있는 프로그램 환경에서 Java Beans를 얼마든지 재사용할 수 있도록 지원한다. 핫자바, 네스케이프, 델파이, 익스플로어, 비쥬얼 베이직, 워드, 클라리스 웍스 등에서도 Java Beans는 사용될 수 있다.
네트워크 환경 지원과 완벽한 이식성: 자바와 상충되는 것이 없이 완벽하게 서로 호환되므로 네트워크 환경 지원과 완벽한 이식성이라는 자바 고유의 장점을 그대로 가지게 된다.
2 . Java Beans의 기본 골격
Java Beans의 API를 설명하는 것에 앞서, Java Beans의 기본적이고 핵심적인 요소를 살펴보자.
2.1 컴포넌트 모델
자바는 기본적으로 컴포넌트 모델을 따르고 있다. 컴포넌트 모델이란 개발자가 상호간에 동적으로 연결될 수 있는 컴포넌트 소프트웨어를 개발할 수 있도록 제공되는 API들과 그 구조를 말한다. 컴포넌트 모델은 크게 두가지 요소, 즉, 컴포넌트(component)와 컨테이너(container)로 나눌 수 있다. 여기서, 컴포넌트라고 함은 아주 단순한 버튼 컴포넌트에서, 하나의 애플리케이션인 HTML 브라우저까지 그 크기와 기능면에서 광범위한 개념이라고 할 수 있으며, 컨테이너는 컴포넌트들의 집합 또는 다른 컨테이너의 집합이라고 할 수 있다.
2.2 컴포넌트 모델 서비스
컴포넌트가 제공하는 다섯가지 주요 기능
컴포넌트 등록 (Component Interface Publishing and Discouvery)
이벤트 처리 (Event Handling)
영구보관 (Persistance)
레이아웃 (Layout)
애플리케이션 빌터 지원 (Application Builder Support)
컴포넌트 등록: 컴포넌트가 동적으로 호출될 수 있고, 이벤트 알림을 동적으로 수행할 수 있도록 컴포넌트 등록 기능을 제공한다. 예를 들어, 온라인 뱅킹 시스템의 경우 현재의 예금 구좌에 대한 상황을 차트로 나타내기 위하여 차트 컴포넌트를 호출하는 것으로, 차트 컴포넌트는 인터페이스를 컴포넌트 환경에 등록하고, 동적으로 이를 호출함으로써 두 컴포넌트 간에 연결이 이루어진다.
이벤트 처리: 이벤트를 발생(raise)하거나 방송(broadcast)하는 메카니즘이 바로 이벤트 처리이다. 예를 들어, 온라인 뱅킹 시스템의 경우 차트 컴포넌트에서 막대 그래프나, 선 그래프 등의 종류를 선택하려고 할 때, 사용자는 특정한 버튼을 누르게 된다. 버튼 컴포넌트의 버튼을 누르면 이벤트 처리 시스템이 버튼이 눌러졌다는 이벤트를 차트 컴포넌트에게 전달하게 된다. 이벤트는 마우스 클릭과 같은 시스템이 지원하는 이벤트 뿐만아니라 사용자 정의 이벤트도 처리할 수 있다. 일반적인 사용자 정의 이벤트는 특정한 데이터의 값이 변경되었을 때, 이를 알려주는 이벤트이다. 어떤 조건이 변경되었을 때 이벤트를 시스템 이벤트처럼 동일하게 사용할 수 있도록 해주는 메카니즘을 가지고 있다.
상태저장: 마치 플래쉬 메모리 처럼 컴포넌트 상태를 저장하는 메카니즘을 제공해준다. 컴포넌트 상태란 컴포넌트로 구성된 컨테이너의 내용과 다른 컴포넌트와 관련된 정보를 말한다. 예를 들어, 온라인 뱅킹의 경우, 사용자의 계정 정보와 어떤 차트를 선택하였는지를 저장하길 원할 경우 영구보관 메카니즘을 사용할 수 있다.
레이아웃: 컴포넌트 모델을 지원하는 레이아웃에는 크게 두 가지 종류가 있다. 하나는 컴포넌트 모델이 자신의 영역내에서 고정적인 위치를 확보하도록 지원하는 것이고 다른 하나는 컨테이너 안에서 상대적인 위치를 자동적으로 설정해주는 것이다. 또한, 컴포넌트가 수행되었을 경우에는 거기에 알맞는 처리를 해주어야 한다. 예를 들어, 메뉴바를 병합하는 기능이 여기에 해당된다. 애플리케이션의 주요 기능중의 하나는 컨테이너에 포함되어 있는 컴포넌트의 레이아웃을 처리하는 것이다. 대부분의 컴포넌트는 각각의 컴포넌트가 일정한 사각 영역을 확보하고 거기에 처리되는 것을 원한다. 이와 달리, 버튼 컴포넌트들은 논리적으로 그 상황에 맞게 레이아웃이 자동적으로 정해는 것이 바람직하다. 즉, 최종 사용자가 실행시간에 불필요하게 레이아웃을 조정해야하는 일을 할 필요가 없다.
애플래케이션 바인더 지원: 애플리케이션 바인더 지원는 컴포넌트의 특성과 동작을 개발 툴을 이용하여 자유롭게 변경시킬 수 있도록 하는 것을 말한다. 개발 툴을 이용하여 각각의 컴포넌트들을 서로 연결 시킬 때, 각 컴포넌트가 가지고 있는 특성들의 초기값이나 상호간에 인터페이스 연결 등을 임의대로 변경시킬 수 있어야 한다. 예를 들어, 온라인 뱅킹 서비스에서 버튼과 차트 컴포넌트는 막대 버튼과 선 버튼을 통해서 어떤 차트가 그려질 것인가가 결정되게 된다. 또한, 이러한 애플리케이션을 개발할 때 특성 에디터를 이용하여, 버튼의 색상, 크기, 레이블과 차트의 종류의 초기값을 설정해 놓을 수 있다. 또한, 개발자는 애플리케이션 개발 툴의 메카니즘에 따라 버튼 클릭 이벤트와 차트 형식의 관계를 지정할 수도 있다.
2.3 분산 컴퓨팅 환경
다섯가지 컴포넌트 서비스에 추가적으로 컴포넌트 모델은 분산 컴퓨팅 환경에서의 컴포넌트 사용에 대한 전략을 제공하기도 한다. 예를 들어, 공장의 기계들의 동작 상태를 점검하는 모니터 컴포넌트가 서버 컴퓨터에서 동작한다고 가정하자. 만약 데이터가 변경될 경우에 서버 컴포넌트는 데스크탑 컴퓨터에게 네트워크를 통하여 이벤트를 전달한다. 데스크탑 컴포넌트는 이에 메시지를 화면에 출력한다는가, 그래프의 형태를 변경한다던가 하는 적절한 대응을 하게 된다. 이런 방법은 단일 컴퓨터 환경에서 처리하는 것과 명백한 차이점을 가지고 있다. 대신에 네트워크를 이용하는데 따르는 안전성과 효율성의 문제는 새롭게 해결해야 하는 부담을 가지게 된다.
어째든, 단일 컴퓨팅 시스템을 이기종간의 분산 네트워크 환경으로 변화하려고 하는 많은 노력들이 존재해 왔으며, 이런 문제는 서로 상충되는 문제점을 가지고 있다. 즉, 데스크탑 컴포넌트 모델은 복잡한 API와 실행 환경을 요구하고, 분산 컴퓨팅에서는 안전성과 같은 관점에서는 다소 부족한 것이 현실이다. 따라서, 컴포넌트 모델은 완벽한 분산 컴퓨팅 기능을 제공하려는 것에 대한 다양한 노력들이 진행되고 있다. 예를 들어, CORBA와 같은 분산 컴퓨팅 환경을 지원하는 방법들을 고려할 수 있다. 즉, 단일 컴퓨터의 컴포넌트 모델은 단순하고 작게 유지하고, 분산 환경 기능은 CORBA와 같은 애플리케이션이 처리하게 하는 것이다.
2.4 Java Beans API 하이라이트
Java Beans은 동작 자바 컴포넌트와 컨테이너 기능을 사용하고 개발할 수 있는 구조와 플랫폼에 중립적인 API로 이루어져 있다. 앞서 설명한 다섯가지 컴포넌트 모델의 서비스를 지원한다.
컴포넌트 등록 (Component Interface Publishing and Discouvery)
이벤트 처리 (Event Handling)
상태저장 (Persistance)
레이아웃 (Layout)
애플리케이션 빌터 지원 (Application Builder Support)
Java Beans 컴포넌트 모델 서비스는 특정 컴포넌트 모델 간의 다리 역할을 수행하게 되는데 여기에는 마이크로소프트의 OLE/COM, CI Lab의 OpenDoc, 네스케이프의 Live Connect를 포함한다. 또한, Java Beans는 자바소프트의 내장 JavaOS에서도 동작한다. Java Bean API와 다른 여러 종류의 컴포넌트 모델에 대한 연결을 위한 라이브러리가 개발될 것이다.
따라서, 개발자들은 Java Beans API를 이용하는 것으로 자바 환경에서 완벽한 컴포넌트들을 개발할 수 있게 된다. 개발자들은 다른 컴포넌트 모델을 위한 추가적인 작업이 불필요하며, 이들 컴포넌트들은 자바 환경에서 유연하게 동작한다. 또한, Java Beans 컨포넌트들은 한번만 개발하고 어디서든 사용할 수 있는 새로운 레벨을 제공해준다. Java Beans는 Live Connect나 Javascript를 사용하는 네스케이프나, 핫자바와 다른 자바 컨테이너, Explorer, 비주얼베이직, 윈도우 쉘, MS 워드와 같은 마이크로소프트 컨테이너, OpenDoc 컨테이너, PowerBuilder와 같은 OLE 컨테이너, 델파이와 OLE/COM을 지원하는 다른 비쥬얼 빌더 툴에서 유연하게 사용할 수 있다.
Java Beans 서비스는 자바 플랫폼의 일부이므로 Java Beans는 이용하기 위한 특별한 외부 라이브러리가 필요없다. 단지 추가적으로 Java Beans이 외부 컨테이너와 자바 애플랫 간에 동적으로 통신이 가능하도록 해주면 된다.
또한, Java Beans 플랫폼과 구조가 중립적인 API 이므로 다른 컴포넌트 모델과 같이 특별한 플랫폼이나 하드웨어에 종속되지 않기 때문에 Java Beans를 이용한 프로그램 상품들이 광범위한 시장을 형성할 것으로 기대된다. 더구나, Java Beans의 사용자는 컴포넌트를 다루는 특별한 기술을 필요로 하지 않기 때문에 폭넓은 인터넷 응용 분야가 존재하며, 최근 각광을 받고 있는 인트라넷, 클라이언트/서버 응용 프로그램 영역까지 활용할 수 있다.
2.5 Java Beans 설계의 목적
Java Beans API와 구현을 위하여 설계를 시작하였을 때 목적은 다음과 같은 것으로 집약될 수 있다.
Java Beans API는 생성과 사용이 쉽고 간결한 컴포넌트를 만드는데 있다.
Java Beans는 완전한 이식성을 가진다.
Java Beans는 Java 플랫폼이 가지는 많은 장점들을 그대로 수용한다.
Java Beans는 강력한 분산 컴퓨팅 환경을 제공한다.
유연성있는 개발 시간 컴포넌트 에디터를 제공한다.
2.6 Java Beans 개발자가 되기 위한 준비
Java Beans의 개발자가 되기 위해서는 무엇보다도 자바에 대한 명확한 이해가 있어야 하고, 이에 대한 시간 투자를 게을리 하지 말아야 한다.
특히 개발자는 자바 AWT의 장점을 잘 활용할 수 있어야 하며, 자바의 serialization을 잘 이해하고 있어야 한다.
보다 복잡하고 분산 환경에 적합한 자바 응용 프로그램의 개발과 설계를 수행해야 한다. 자바의 RMI (remote method invocation)에 대한 방법과 CORBA의 표준 IDL을 사용법을 숙지해아한다.
3. Java Beans의 기초 개념
3.1 Java Beans와 클래스 라이브러리
유용한 모든 소프트웨어 모듈이 모두 Java Beans에 해당되지 않는다. 이들 모듈 중에 비쥬얼 환경을 제공하며, 특성을 임의대로 변경할 수 있는 모듈이 이에 해당한다. 클래스 라이브러리는 사용자에게 유용한 환경을 제공해주지만 비쥬얼 환경에 직접적으로 영향을 주는 것은 아니다.
3.2 특성, 이벤트, 메소드
Java Beans가 가지는 가장 큰 특징 세가지가 바로 특성(property), 이벤트(event), 메소드(method)이다.
특성이라 함은 특성과 관련된 메소드를 호출하여 값을 읽거나 변경할 수 있는 상태들의 집합이다. 예를 들어, 배경색과 관련된 메소드 getBackgroundColor()는 배경색 특성을 읽어오는 메소드이며, setBackgroundColor()는 배경색 특성을 변경하는 메소드가 된다.
메소드는 다른 컴포넌트 또는 다른 스크립트 환경에서 호출 가능한 인터페이스로, Java Beans에서는 모든 메소드는 public으로 정의되며, 이들 메소드 중에서 필요한 메소드만 선택하여 사용할 수 있다.
이벤트는 어떤 컴포넌트가 다른 컴포넌트에게 무엇인가 관심을 기울일만한 일이 발생하였다는 것을 알려준다. 새로운 AWT 이벤트 모델에서는 이벤트 소스가 이벤트 청취자 객체를 등록하여 사용할 수 있다. 이벤트 소스에 의해서 관심있는 사건이 발생하면 객체 컨테이너에서 적절한 메소드를 호출하게 된다.
3.3 디자인 시간과 실행 시간
Java Beans 컴포넌트는 다양한 환경에서 동작할 수 있는 기능을 가지고 있어야 한다. 하지만, 다른 환경에서 동작하더라도 제공되는 기능의 일관성은 가지고 있어야 한다. 서로 다른 환경이라고 생각할 수 있는 경우는 크게 두 가지 경우이다.
첫째, 개발 툴 안에서 동작하는 경우로 이를 디자인 환경 (design environment) 또는 개발 환경이라고 말할 수 있다. 이때에는 컴포넌트의 특성을 개발 툴이 이해할 수 있는 기능을 가지고 있어야 한다. 이는 개발자가 컴포넌트를 자기가 원하는대로 이용할 수 있도록 해주기 때문에 매우 중요하다. 이를 커스터마이징(custermizing)이라고 하는데 이러한 기능은 마치 마이크로소프트의 위저드(wizard) 기능과 유사하다. 즉, 사용자는 컴포넌트의 지시대로 하나씩 선택해 나가면, 최종적으로 커스터마이징이 완료되는 자동화된 기능들을 제공하기 위해서는 내부적으로 복잡한 작업이 이루워지게 된다. 하지만, 이러한 기능들은 두번째 경우에 해당하는 실행 시간에는 아무런 의미가 없다. 따라서, 디자인 시간에 필요한 코드 부분과 실행 시간에 필요한 코드 부분을 나눌 수 있어서 실행시간에는 디자인 시간에 필요한 코드가 쓸모없이 로딩되는 것을 막아야 한다.
이를 위해서, Java Beans는 디자인 시간 인터페이스와 실행 시간 인터페이스로 나누는 기능을 가지고 있다.
3.4 인증에 관련된 문제
Java Beans는 기본적으로 자바 플랫폼과 동일한 환경에서 동작한다. 따라서, 인증에 관한 문제에 있어서도 자바 플랫폼과 동일한 관계를 갖는다.
특히, Java Beans가 애플랫으로 동작할 경우에는 신뢰할 수 없는 환경이기 때문에 지역 저장 시스템을 제어한다던가, 임의의 호스트와 통신한다는 것은 불가능하다. 하지만, Java Beans가 독자적으로 애플리케이션으로 동작할 경우에는 자바 플랫폼과 마찬가지로 파일 제어와 호스트 통신이 가능하다.
일반적으로 Java Beans는 애플랫으로 동작한다는 것을 가정한다. 이에 대한 Java Beans의 제한적인 특징을 다음과 같이 설명할 수 있다.
자기확인(Introspection): Java Beans는 개발자에게 고수준의 자기확인 API와 저수준의 반향(reflection) API를 디자인 시간에 제한없이 사용할 수 있게 해주지만, 실행시간에는 엄격하게 제한한다. 일반적으로 디자인 시간에는 자바 애플릿은 신뢰성을 갖고 수행하게 되므로 public 뿐 아니라 private 특성들도 변경가능하고, 실행시간에는 자바 애플릿이 신뢰성을 가지고 있지 않으므로 오직 public 메소드만을 통하여 접근할 수 있다.
상태저장(Persistence): Java Beans는 디자인 시간과 실행 시간 모두 직렬화와 비직렬화를 시킬 수 있다. 그렇지만 실행 시간 환경에서는 직렬화된 스트림이 부모 애플리케이션으로부터 생성되어야 하고, 단지 파일의 입출력은 직렬화되진 않는다. 때문에 브라우저에 의해서 파일 입출력이 직렬화되어야 하나, 애플랫이 파일을 램덤하게 접근하지 않는다는 것을 가정하고 있다.
GUI 머징(GUI merging): 일반적으로 신뢰성이 없는 애플랫은 부모 애플리케이션과 어떤 종류의 GUI 머징도 불가능하다. 따라서, 애플랫으로 실행된 Java Beans는 신뢰성이 없으므로 메뉴에 대한 GUI 머징이 불가능하며 단지 별개의 메뉴만을 사용할 수 있다.
이는 Java 애플리케이션에는 해당되지 않은 제한 사항이며 Java 애플랫에서만 갖는 특수한 제한 사항이다.
3.5 Java Beans과 원격 접속
Java Beans는 WWW와 같은 분산 환경에서 잘 동작하도록 설계되었다. 분산 시스템의 핵심적인 기술은 어떻게 기능들을 분산 시켜놓을 것인가 하는데 있다. 지역 안에서는 매우 빠르게 통신이 가능하나, 네트워크를 통한 접근은 그 속도가 매우 느릴 수 있기 때문이다. 이를 해결하기 위하여 분산 시스템을 설계할 때 가급적 원격지 간의 통신량은 최소화하고, 상호 전달해야할 메시지는 데이터 캐쉬등을 통하여 트래픽 량을 줄이는 방향으로 진행되어야 한다.
따라서, 이러한 분산 환경에 Java Beans를 이용하면, 네트워크를 통하녀 원격지 간의 통신을 매우 간단하게 처리할 수 있다. Java Beans가 지원하는 통신 메카니즘에는 다음과 같이 세 가지가 존재한다.
Java RMI (Remote Method Invocation): Java RMI는 분산 자바 환경에 적합한 메카니즘이다. 분산 시스템 간의 통신은 클라이언트/서버 모델로 Java Beans를 이용하게 되며, 원격지 간의 호출은 자동적으로 Java Beans에 의해서 이루어진다. 이러한 접근 방법은 자바 개발 환경에서는 매우 일상적인 현상이 될 것이다.
Java IDL: Java IDL은 산업표준인 OMG CORBA 분산 객체 모델을 구현해 준다. 모든 시스템 인터페이스는 CORBA IDL로 정의 되고, 자바에 해당하는 부분의 IDL 인터페이스의 일부로 포함되게 된다. Java Bean 클라이언트는 IDL 서버를 호출하거나 호출될 수 있다. CORBA IDL은 다중 언어, 다중 업체의 분산 컴퓨팅 환경을 제공하기 때문에 자바를 이용하지 않은 다른 환경의 IDL 서버와 통신이 가능하다.
JDBC: 자바 데이터베이스 API로써 JDBC는 SQL 데이터베이스 서버에 접근이 가능하도록 해준다. 데이터베이스는 클라이언트로 같은 시스템 안에서 동작하거나 원격지 데이터베이스로 동작할 수 있다. 이를 위하여 개별 Java Beans는 특정한 데이터베이스 테이블에 접근할 수 있도록 수정될 수 있다.
3.6 비가시적인 Java Beans
많은 Java Beans가 GUI로 나타내지겠지만, 아무런 GUI를 가지지 않은 Java Beans가 존재할 수 있다. 이러한 Java Beans도 여전히 매소트, 이벤트, 영구보존 등의 기능이 가능하며, GUI 빌더에 의하여 표준 특성들은 변경될 수 있다. 단지, 가시적인 Java Beans와의 차이라면, 화면에 보지지 않은다는 것 뿐이다.
3.7 멀티스레딩
Java Beans는 멀티스레딩 환경에서 동작하므로 서로 다른 스레드가 동시에 이벤트를 전달하거나, 메소트를 호출하거나, 특성을 설정할 수 있다. 따라서, Java Beans가 멀티스레딩 환경에서 잘 동작할 수 있도록 지원한다.
3.8 국제화
Java 1.1 규약에 따라 국제화를 위한 API가 존재하며, 이를 Java Beans에 그대로 적용할 수 있다. 예를 들어, setColor()를 sColor()로 getColor()를 gColor()로 변경하여 Java Beans의 개발에 적용할 수 있다. 하지만, 이렇게 지역화된 인터페이스나 함수 이름은 원래의 함수명으로 변경되어 호출되게 된다.
4. 윈도우 환경에 관한 문제
JDK 1.1에는 특히 AWT와 관련된 여러 기능이 대폭 강화된다. 이중에서 특히 Java Beans와 관련된 부분이 많이 있기 때문에 핵심적인 기술을 확인해 보자.
4.1 균일 데이터 전송 (UDT, Uniform Data Transfer) 메카니즘
객체간에 구조화된 데이터를 상호 전달할 수 있는 기본적인 메카니즘이 바라 UDT이다. 고수준에서는 UDT 메카니즘을 이용하여 자르고 붙이기 (Cut, Copy & Paste) 또는 드래그 엔 드롭 기능을 이용할 수 있다. UDT 메카니즘의 목적은 다음과 같다.
데이터 은닉, 데이터 상호 교환에 대한 간단하고 개념적인 프레임워크 제공.
현존하거나 앞으로 개발될 데이터 교환 모델에 대한 일반적인 API 제공
효과적인 동적 생성, 등록이 가능하며 풍부한 데이터 형을 지원
프로세스 경계를 넘어서는 데이터 교환 기능 지원
자바 환경과 플랫폼에 종속적인 환경 간의 데이터 교환 기능 지원
UDT 메카니즘은 기능적인 면에서 데이터 전송이 가능한지를 나타내는 transferable 인터페이스와 데이터 형을 결정하는 DataFlavor 클래스로 구성된다. 현재, 제안된 데이터형의 기본적인 구조는 MIME 네임스페이스를 사용한다.
4.2 클립보드/선택 서비스
클리보드/선택 서비스는 UDT 메카니즘에 포함되어 있는 기능이다. Clipboard 클래스 개념을 통하여 소스와 목적지 간의 데이터 전송 기능을 제공한다. ClipboardOwner 인터페이스는 클립보디의 상태가 변경되는 경우 이를 처리하는 기능을 제공한다.
4.3 드래그 앤 드롭 (Drag and Drop)
드래그 앤 드롭은 UDT 모델에서 추상화된 데이터 상호 교환이라고 할 수 있다. 드래그 앤 드롭 API의 목적은 다음과 같이 요약될 수 있다.
드래그 앤 드롭의 단순한 활용을 위한 API 제공
모든 플랫폼에서 동작하고 이와 관련된 전 기능을 제공하는 드래그 앤 드롭 지원
이와 관련된 API는 다음과 같다.
DragSource: 드래그가 시작된 객체의 동작을 캡슐화한 인터페이스
DragContext: 드래그 상태가 캡슐화된 클래스
DropTarget: 드롭이 발생한 객체의 동작을 캡슐화한 인터페이스
DropContext: 드롭 상태가 캡슐화된 클래스
5. 상태저장
5.1 상태저장의 목적
상태저장은 일반적인 기억장소 할당과 달리 현재의 객체 상태를 저장하였다가 다시 호출되었을 때 복원하는 방법으로 주기억 장치 뿐아니라 디스크와 같은 보조 기억장치를 이용하여 현재의 상태를 저장하는 것을 말한다. Java Beans는 상태저장과 같이 폭넓은 저장 방식을 지원한다. 즉, 현재의 데이터 상태를 다른 컴포넌트 OLE나 OpenDoc 문서에 집어넣는 것이다. 이는 마치, 워드에 Excel 문서가 포함되는 것과 유사하다고 생각하면 된다. 이러한 방법이 Java Beans에서는 별로 어렵지 않은 작업이 될 것이다. 만약 Java Beans가 기본 자바 형식을 따른다면 플랫폼에 독립적으로 상태저장이 가능하다.
하지만, 모든 Java Beans가 상태 저장이 필요한 것은 아니다. 그러나, 일반적으로 특성이 편집될 수 있는 경우는 변경된 특성을 저장할 수 있도록 상태저장 기능이 필요하다.
5.2 해결 방법
상태 저장에 대한 목적은 크게 두가지로 현재의 상태에 대한 일반 데이터와 특성 값에 관련된 특성데이타를 저장하는데 있다. 이러한 서로 다른 목적을 만족하기 위해서는 Java Beans가 지원하는 자동화된 순서화 메카니즘을 이용하거나 외부화(externalization) 스트림 메카니즘을 제공해야 한다. Java Beans 1.0에서는 자바 객체 순서화 메카니즘에 의해서 자동화된 내부 상태 저장 및 복원이 이루어진다. 외부화 스트램 메카니즘은 아직 계획 단계에 있는 것으로써 앞으로 자바 API에 포함될 계획이다. 이렇게 되면 자바 객체가 상태 저장이 완벽하게 이루어질 수 있으며, 일반 데이터 뿐 아니라 구조화된 데이터의 저장되 가능하다.
5.3 저장되는 내용
Java Beans가 상태저장을 선택하였다면, 나중에 다시 호출되었을 때 그 상태와 가장 유사하게 복원되어야 한다. 기본적으로 외부로 노출되어 있는 특성들이 모두 저장된다. 또한, 내부적으로 영향을 받은 특성도 저장된다. 이러한 저장 기능은 커스터마이징이나 개발 시에도 제공되어야 한다. 하지만, Java Beans가 외부 Java Beans를 지시하는 포인터는 저장하지 않는다. 이는 더 높은 수준에서 현재 Java Beans의 관계가 유지되어야 한다는 것을 암시한다. 이러한 저장 방법은 "transient" 키워드를 이용하면 컨테이너는 핸재의 Java Beans 관계의 상태를 유지할 책임을 갖게 된다. 같은 이유로 정상적인 이벤트 아답터는 내부 필드를 transient로 해야한다. 모든 애플리케이션 빌더가 내부상태 저장을 위한 순서화 메카니즘을 갖고 있어야 하는데, 자바가 지원하는 순서화 메카니즘 이외에 애플리케이션 빌더가 독립적으로 이러한 상태저장 메카니즘을 지원할 수도 있다.
5.4 비순서화
순서화 되어 있는 오브젝트는 ".ser"파일로부터 다시 비순서화시킬 수 있다. ".ser" 파일을 사용한 클래스 로더는 기본 클래스 로더를 위한 ".class" 개개를 다신 로딩할 수 있다. 즉, 단둑으로 .class 파일만을 사용할 수 있다.
6. 이벤트
이벤트는 Java Beans의 핵심적인 구조이다. 이벤트는 애플리케이션 빌더를 이용하여 서로 연결 시켜주게 된다. 즉, 소스가 되는 Java Beans와 이벤트를 전달 받는 listener에 해당하는 Java Beans로 이벤트가 처리된다.
6.1 목적
개념적으로 이벤트는 소스 객체와 목적지 listener 객체 사이에 상태 변화를 알려주는 메카니즘이다. 이벤트는 매우 다양하게 사용될 수 있으며 일반적으로 윈도우 시스템 툴킷에서 마우스 액션, 위굘 업데이트, 키보드 상태 변경에 대한 알림 기능을 수행한다. Java Beans의 이벤트 메카니즘은 다음과 같다.
확장가능한 이벤트 형과 유연한 전달 모델, 폭넓은 응용이 가능하도록 이벤트 메카니즘 지원
자바 환경에 잘 어울리는 이벤트 메카니즘 지원
스크립트 환경에서도 모든 이벤트 처리 가능
이벤트 소스와 이벤트 listener가 디자인 시간에도 직접 조작이 가능
복잡한 애플리케이션 개발 툴에서 사용은 권장하지 않음
또한, 특별히 이벤트 설계는 다음과 같이 되어 한다.
특정한 객체 클래스가 생성되었다는 이벤트를 얻을 수 있어야 한다.
특정한 객체 클래스가 관찰하였다는 이벤트를 얻을 수 있어야 한다.
이벤트 소스와 이벤트 listener 간의 관계를 동적으로 조작할 수 있는 공통의 이벤트 등록 메카니즘 지원
가상 머신이나 언어를 변경하지 않고 구현이 가능해야 함
소스와 listener 간의 이벤트 전달 속도 향상
Java Beans 이벤트와 다른 일반적인 컴포넌트 구조와의 자연스런 이벤트 매핑 기능 지원
6.2 이벤트 메카니즘의 개괄
Java Beans에서 이용하는 기본적인 이벤트 메카니즘은 다음과 같다.
기본적으로 이벤트 알림은 목적하는 listener 객체의 자바 메소드 호출 기능에 의해서 전달된다.
서로 다른 이벤트 알림의 경우에는 각각 서로 다른 자바 메소드를 사용하는 것으로 한다. 만약 같은 이벤트를 받는 listener의 경우에는 java.util.EventListener로부터 EventListener 인터페이스를 상속 받아 묶어서 사용할 수 있다.
이벤트 listener 클래스는 EventListener 인터페이스의 집합을 구현함으로써 특정한 이벤트 집합에 대하여 묶어서 처리할 수 있다.
이벤트 알림과 연관된 상태는 정상적으로 java.util.EventObject로부터 상속받은 이벤트 상태 객체에 의해서 캡슐화되어 있다. 이벤트 상태 객체는 이벤트 메소드에게 단일 인자를 넘겨주게 된다.
이벤트 소스는 특정한 디자인 패턴에 대하여 확인하는 등록 메소드를 정의함으로써 특정한 이벤트에 대한 같은 소스로 취급될 수 있다. 또한, 특정한 EventListener 인터페이스를 참조할 수 있다.
특정한 인터페이스를 구현할 수 랴는 listener의 경우나 몇몇 추가적인 동작이 필요한 경우에는 커스텀화된 아답터 클래스의 인스탄스가 하나 이상의 listener와 소스 간의 관계를 설정하는 사이에서 동작할 수 있다.
6.3 이벤트 상태 객체
특정한 이벤트 알림관 관계된 정보는 java.util.EventObject에서 파생된 이벤트 상태 클래스에 캡슐화되어 있다. 일반적으로 이벤트 상태 클래스는 Event라는 이름으로 주어진다. 이벤트 상태 객체는 변하지 않는다. 따라서, 직접 public 메소드를 통한 제어는 불가능하며 제어자 메소드를 통하여 이벤트 상태 객체의 내용을 얻는데 사용될 수 있다. 그러나, 이벤트 상태 객체가 수정을 요구할 경우에는 이러한 수정이 요구되는 수정에 영향을 주는 적절한 메소드에 의해서 캡슐화되거나 새로운 이벤트 상태 객체가 적절한 수정을 반영하여 발생하게 된다.
이러한 제어자 메소드는 반드시 읽기 전용, 읽기-쓰기, 쓰기 전용 등으로 적절한 디자인 패턴을 따라야 한다. 이는 특별히 자바와 다른 컴포넌트 구조 사이의 이벤트를 서로 전달할 때 구별되는 프래임워크의 기본을 이루기 때문에 매우 중요하다.
6.4 EventListener 인터페이스
새로운 자바 이벤트 모델은 이벤트 핸들링 메소드를 정의하고 그룹화하는데 따르는 메소드 호출에 근간하고 있다. 이벤트 헨들링 메소드는 EventListener 인터페이스로 정의되며 이것은 java.util.EventListener로부터 상속된 것이다. 그냥 간단히 EventLister 인터페이스는 "Listener"로 표기한다.
이벤트 집합을 핸들하기위한 클래스는 EventListener 인터페이스가 구현되고 정의되어 있어야 가능하다. 이벤트 핸들링 메소드는 EventListener 인터페이스에 의해서 정의되고 표준 디자인 패턴에 정상적으로 확인되어야 한다. 확인 작업이 필요한 이유는 인터페이스가 제 3의 프로그램에 의해서 동작될 수 있도록 하기 위한 것이다.
특별히, 관련있는 이벤트 핸들링 메소드는 같은 EventListener 인터페이스로 그룹화된다. 예를 들어, mouseEntered, mouseMoved, mouseExited 등은 같은 EventListener 인터페이스를 사용한다. 여기서, 확실히 알아두어야 할 것은 그렇다고 각 이벤트마다 처리할 수 있는 인터페이스가 따로 정해져 있는 것이 아니라는 점이다. 또한, 관련있는 이벤트가 매우 많을 경우에는 계층적인 분류 방법으로 이를 분류해 낼 수 있다. EventListener의 계층구조는 실제 이벤트를 처리하는 역할을 하는 Listener 들을 자신의 EventListener 인터페이스에 노출시키고, 상속 관계를 이용하여 계층화시키게 된다.
인수 리스트를 이용한 이벤트 메소드
일반적으로 이벤트 핸들링 메소드는 java.util.EventObject의 서브 타입으로 하나의 인수만을 가질 수 있다. 그러나, 특정한 환경에서는 하나 이상의 인수가 필요하게 되는데 이런 경우에는 이벤트를 다른 쪽으로 포워딩하여 외부에서 인수를 처리하게끔 하는 메카니즘을 이용할 수 있다. 이는 일반적인 환경이 아니기 때문에 특수한 경우 한하여 사용된다.
6.5 이벤트 Listener 등록
잠재적인 EventListener를 등록하기 위해서는 적절한 이벤트 소스가 존재해야하며 소스에서 listener까지 이벤트 흐름이 완성되게 된다면 반드시 이벤트 소스 클래스는 이벤트 listener의 등록과 등록취소 메소드가 제공되어야 한다. 등록 메소드는 Java Beans의 자기확인 API와 애플리케이션 빌더 도구를 이용하여 확인할 수 있다.
등록 순서와 이벤트 전달 순서의 관계는 정의된데로 수행된다. 추가적으로 같은 이벤트 listener 객체는 하나 이상의 같은 이벤트 소스에 의해서 수행되거나 제거되는 것들 모두도 정의된 대로 수행된다.
단일 이벤트 listener 등록
이벤트 소스가 다중 이벤트 알림을 지원하는데 어떤 경우에는 단일 이벤트 알림만 가능해야 하는 경우가 존재한다. 이런경우에는 java.util.TooManyListenersException을 이용하여 단일 이벤트만이 처리되도록 정의할 수 있다. 만약 null값이 인수로 패싱될 경우에는 NullPoinerException이 수행된다.
이벤트 전달 방법
단일 이벤트 전달 (unicast) 과 다중 이벤트 전달 (multicast)
보통 이벤트는 다중 이벤트 전달 (multicast)이다. 각 이벤트 소스는 이벤트 listener를 차례대로 호출하게 된다. 하지만, 이벤트 listener가 예외 상황을 발생시켰을 때에는 나머지 listener를 계속 호출할 것인지 아니면 중단할 것인지를 판단해야 한다. 특별히, 몇 개의 이벤트 소스는 단지 한번만 이벤트를 전달하게 된다.
6.6 이벤트 아답터
이벤트 아답터는 자바 이벤트 모델에서 매우 중요한 역할을 한다.
특별히 애플리케이션 또는 애플리케이션 빌더 도구는 표준 이벤트 아답타 집합을 사용하게되며, 이는 이벤트 소스와 이벤트 listener 사이에서 올바로 이벤트가 전달되도록 도와주게 된다.
이벤트 전달과정에서 추가적인 동작이 필요한 경우에는 이벤트 아답터를 정의하고 이를 이벤트 소스와 이벤트 listener 사이에 끼어넣으면 된다. 이벤트 아답터의 주요 임무는 특별한 EventListener 인터페이스를 이벤트 소스와 실질적인 listener 사이에 잘 연결시켜주는 것이다.
이벤트 아답터의 몇가지 예는 다음과 같다.
소스와 listener 사이의 이벤트 큐잉 메카니즘 제공
필터 역할
다중 이벤트 소스에서 발생하는 이벤트를 하나의 이벤트 listener로 매핑
소스와 listener 사이의 일반적인 연결 매니저 역할
7. 결론
지금까지 Java Beans의 목적과 역할, 그리고 중요한 사항에 대하여 살펴보았다. Java Beans는 자바 플랫폼이 가지고 있는 장점과 컴포넌트 구조의 장점을 혼합하여 자바 환경이 실질적으로 확장될 수 있는 방안을 제시한 하나의 전략이라고 할 수 있다. 이러한 컴포넌트 메카니즘이 자바 환경의 매우 중요한 역할이 될 것으로 판단되며 실제 많은 기존의 컴포넌트까지도 흡수하여 통합할 수 있는 메카니즘으로 사용될 것이다. 그러나, Java Beans의 목적이 실제로 이루어지기 위해서는 다양한 Java Beans 개발자들이 생겨나야 할 것으로 본다.
출처 : http://www.javastudy.co.kr/docs/outsourcing/javacomponent.html
[2008년 03월 13일 11:26:46 수정되었습니다.]