SSISO Community

시소당

java Beans - Java Component Architecture

[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  수정되었습니다.]

748 view

4.0 stars