[EJB] 객체지향과 컴포넌트 프로그래밍 [출처] [EJB] 객체지향과 컴포넌트 프로그래밍|작성자 젠센쭈
| Computer_language/Comfile 2009. 1. 12. 02:26어렸을 때 뮤직 컴포넌트를 처음보고 검은색 레코드 판에서 음악이 흘러나온다는 것보다는 서로 다른 기능을 하는 기기들이 선으로 복잡하게 연결되어 하나의 훌륭한 음악을 만들어 낸다는 것에 감동했습니다. 프로그래밍을 하면서 문득 프로그램도 뮤직 컴포넌트처럼 서로 연결해 새로운 프로그램을 만들 수 있다면 좋겠다고 생각했습니다. 그러던 어느 날 컴포넌트 프로그래밍이라는 것이 있다는 사실을 알았을 때 무척이나 흥분됐습니다. 객체지향 궁합도 잘 맞을 것 같다는 생각이 들었습니다. 과연 그럴까요?
우리나라에서도 컴포넌트에 대한 관심이 많이 높아지고 있습니다. 이것은 객체지향과 더불어 하나의 새로운 패러다임이라고도 합니다. 컴포넌트는 소프트웨어를 이제까지처럼 계획, 설계, 분석, 구현, 테스트하는 순차적인 개발 과정으로 보는 것이 아니라 레고 블럭이나 자동차 부품처럼 조립하는 개념으로 간주하기 때문에 현재 IT 산업을 이루고 있는 기존 틀과 구조를 가내 수공업 형태에서 ‘표준화’하고 ‘산업화’하는 데 그 의미가 있다고 하겠습니다.
이러한 컴포넌트는 인터넷이라는 환경의 부상으로 더욱 강력한 위치를 차지하게 됐습니다. 그것은 개발자에게도 새로운 개발 환경을 이해하도록 요구하고 있습니다. 컴포넌트 프로그래밍에서는 특정한 환경의 국소적인 이해보다는 시스템에 대해 전체적으로 이해할 수 있어야만 좋은 프로그램을 제작할 수 있습니다. 하지만 컴포넌트를 쉽게 이해할 수 있는 방법이 마땅히 있지 않습니다. 이번 연재에서는 객체지향과 컴포넌트를 연계해서 이해하고 간단하게 컴포넌트 환경을 살펴보겠습니다.
컴포넌트의 등장
컴포넌트라 함은 말 그대로 서로의 인터페이스를 연결하면 하나의 시스템으로 동작할 수 있는 환경의 구성 요소를 의미합니다. 몇 가지 컴포넌트의 결합으로 새로운 소프트웨어를 만들 수 있다는 생각은 그리 새로운 것은 아닙니다. 실제 우리 생활에서도 뮤직 컴포넌트처럼 서로 공통의 인터페이스로 연결해 새로운 시스템을 만드는 경우가 많습니다. 어릴 적 즐겨 가지고 놀았던 합체 로봇도 컴포넌트 시스템입니다. 그리고 비디오, 오디오, TV로 만드는 AV 시스템 역시 훌륭한 컴포넌트 시스템의 예입니다. 서로 다른 기능을 하는 두 요소를 결합해 새로운 기능을 만든다면 그것을 컴포넌트 시스템이라고 말할 수 있습니다.
우리가 사용하는 컴퓨터 시스템도 또 다른 컴포넌트 시스템의 예입니다. 컴퓨터 시스템은 컴퓨터 본체, 모니터, 키보드, 마우스, 스피커로 구성되고 사전에 규정된 모니터 케이블, PS/2 마우스, 키보드 포트, 오디오 잭 등을 통해 컴포넌트의 결합을 이룹니다. 하드웨어적인 컴포넌트는 표준화를 통해 산업화하는 하나의 전형적인 메커니즘입니다.
소프트웨어에서도 컴포넌트라고 하면 마찬가지 개념으로 생각해 볼 수 있습니다. 소프트웨어에 있어서 컴포넌트라는 개념은 RAD 툴의 등장과 더불어 탄생했다고 할 수 있습니다. RAD 툴의 등장 자체가 프로그래밍의 산업화 과정이라고 할 수 있습니다. 물론 소프트웨어 컴포넌트라는 개념이 갑자기 만들어진 것은 아닙니다. 이미 컴포넌트 이전에 라이브러리가 그러한 기능을 하고 있었습니다. 사전에 필요한 함수들을 만들어 놓고 프로그래밍에서 활용할 수 있도록 만들어 두는 것이 라이브러리인데, 컴포넌트를 이해하기에 앞서 우선 라이브러리를 이해하는 것이 좋습니다.
소프트웨어 라이브러리
소프트웨어 라이브러리는 매우 중요한 프로그래밍 자원으로 프로그래밍에 자주 쓰이는 함수나 클래스를 함께 묶어놓은 것입니다. 라이브러리 안에 있는 코드를 사용하기 위해서는 필요한 함수나 클래스의 사용법을 미리 숙지하고, 정의된 인터페이스를 통해 프로그래밍 모듈을 작성하고, 컴파일 과정에서 라이브러리와 작성한 모듈을 링크하는 작업이 필요합니다.
라이브러리를 많이 가지고 있는 친구는 빠르게 프로그램을 완성할 수 있는 반면에 라이브러리를 가지고 있지 않거나 기본적으로 언어 개발 툴에서 제공하는 라이브러리를 잘 이해하지 못하는 경우에는 이미 라이브러리에 있는, 그러나 본인은 알지 못하는, 함수를 직접 구현하기 위해 많은 시간을 소비하면서도 프로그램을 완성하지 못하기도 합니다.
기껏 만들고 있으면, 다른 친구가 “야, 이건 이미 기본 라이브러리에 있는 기능이야”라고 말해 당사자를 실망하게 만듭니다. 상황이 이렇다 보니, 한때는 소프트웨어 개발자들이 가지고 있는 소프트웨어 라이브러리의 양이 좋은 개발자와 나쁜 개발자로 나누는 기준이 되기도 했습니다.
일부 개발자 중에서는 편집광적으로 소프트웨어 라이브러리를 모으는 경우도 쉽게 찾아볼 수 있었습니다. 하지만, 개발 툴이 커지고 대규모가 되면서 대부분의 필요한 라이브러리들은 개발 툴에 포함되어 제공됐습니다. 최근에는 개발 툴이 제공하지 않는 추가적인 라이브러리를 이용하는 비중은 틈새시장 정도로 무척이나 작아졌습니다. 그만큼 소프트웨어 라이브러리가 정형화됐다고 할 수 있습니다. 하지만, 여전히 라이브러리에 대한 충분한 사전 지식 없이 소프트웨어 라이브러리를 쉽게 사용한다는 것은 어려운 일입니다.
컴포넌트와 라이브러리
인터넷의 보급과 더불어 누구나 쉽게 라이브러리를 인터넷에서 찾아 사용할 수 있게 됐고 부담 없는 수준에서 라이브러리를 구입할 수 있습니다. 그리고 오픈 소스 정책으로 인해 많은 라이브러리 소스가 공개되면서 라이브러리의 가치는 지속적으로 떨어졌습니다. 하지만 이것은 다른 한편으로 게으른 개발자를 양산했습니다. 그냥 모든 것은 인터넷에 있다고 생각하는 나머지 라이브러리 사용법조차 알지 못하는 개발자가 많아진 것입니다.
이러한 문제점을 새롭게 해결하고자 나온 것이 바로 컴포넌트입니다. 컴포넌트는 컴포넌트 스스로가 어떤 인터페이스를 가지고 있는지 개발자에게 알려줄 수 있습니다. 그리고 속성을 변경해 자신의 초기값을 조정할 수 있기 때문에 커스터마이징이 쉽습니다. 이러한 사용자 환경이 만들어낸 것이 애플리케이션을 빠르게 제작할 수 있는 RAD 툴입니다. RAD 툴 안에서는 미리 작성되어 있는 컴포넌트들을 통해 애플리케이션을 쉽게 작성할 수 있습니다.
컴포넌트의 기본적인 개념은 소프트웨어 라이브러리와 유사합니다. 라이브러리가 사전에 필요한 코드를 작성해놓고 나중에 컴파일 과정에서 연결해 사용하는 것이라면, 컴포넌트는 사전에 정의된 컴포넌트 인터페이스를 만족하도록 작성되고, 이를 통해 프로그래밍 과정에서 연결해 사용할 수 있게 되어 있습니다. 따라서 컴포넌트의 동작 상황을 개발 당시에 확인할 수 있다는 장점이 있습니다. 그리고 대부분 비주얼한 컴포넌트를 제공하기 때문에 GUI까지 한꺼번에 해결해주기도 합니다.
최근에 나온 개발 툴은 대부분 자신들의 컴포넌트를 제공합니다. 하지만 컴포넌트가 단지 최신 라이브러리라는 의미는 아닙니다. 그것은 현재 시스템이 점점 복잡해지면서 시스템을 구축할 때 모든 기능을 새롭게 구축하면 비용이 많이 들기 때문에 필수적이고 복잡한 환경은 사전에 만들어 놓고 적용하려는 시스템에 따라 변화되는 부분만을 새롭게 작성하여 동작할 수 있도록 하는 데 사용하는 것입니다. 아마도 이것은 뮤직 컴포넌트 개념보다는 DVD 플레이어와 DVD의 관계라고 말할 수 있을 것입니다.
컴포넌트의 구성
그렇다면 소프트웨어 컴포넌트는 무엇으로 구성될까요? 컴포넌트는 우선 서로 다른 컴포넌트를 연결하는 입출력 인터페이스가 필요합니다. 그리고 기본적인 상태를 정의할 수 있는 프로퍼티가 있습니다. 컴포넌트는 잘 정의된 인터페이스를 통해 사전에 구현한 소프트웨어 모듈입니다. 예전에는 특정한 툴 환경에서만 의미 있는 컴포넌트들이 있었는데, 지금은 특정한 언어와 상관없이 사용할 수 있는 컴포넌트 구조들도 있습니다.
대표적으로 COM(Common Object Model)은 윈도우 환경에서 빼놓을 수 없는 핵심적인 컴포넌트 구조를 제공합니다. COM은 윈도우의 핵심 커널을 제외하고는 대부분의 환경에서 사용되는 모델입니다.
그리고 EJB(Enterprise Java Beans)는 자바 프로그래밍 언어를 통해 미들웨어를 구현할 수 있도록 제공하는 모델입니다. 트랜잭션, 보안, 데이터베이스 접속 등을 쉽게 이용할 수 있도록 하는 환경을 제공하고, 이를 컴포넌트화해 소프트웨어 모듈을 개발할 수 있게 하는 것입니다.
객체지향과 컴포넌트
객체지향은 소프트웨어를 행동과 상태 기반의 객체로 정의해 재사용성을 높이는 것이 목표입니다. 컴포넌트는 사전에 정의된 인터페이스를 통해 즉각 실행할 수 있는 컴포넌트로 생산하여 재사용성을 높이는 것입니다. 재새용성을 높인다는 것에 대해서는 그 목적이 동일하지만 접근 방법의 차이가 있다고 할 수 있습니다. 객체지향에서는 새로운 데이터 형을 작성하는 것부터 출발하는데, 컴포넌트는 잘 짜여진 인터페이스를 사전에 정의하고, 이를 통해 필요한 동작을 구현하는 것부터 출발합니다.
◆ 클래스 = 데이터 + 메쏘드
◆ 컴포넌트 = 특성 + 인터페이스 + 로직 + 이벤트
이와 같이 컴포넌트는 서로의 기능을 쉽게 연결할 수 있는 인터페이스가 가장 중요한 위치를 차지합니다. 객체지향과 컴포넌트가 만나는 위치는 인터페이스입니다. 컴포넌트의 인터페이스는 객체지향의 메쏘드와 유사합니다. 물론 객체지향 언어에서 메쏘드와 인터페이스는 엄밀한 의미에서 구별되지만 실제로는 그 기능이 비슷하다고 할 수 있습니다.
차이점은 인터페이스가 아니라 접근 방법에 있습니다. 컴포넌트는 컨테이너라는 컴포넌트가 동작할 수 있는 환경을 제공하고, 이 구조에 맞는 다른 컴포넌트들이 서로 연결되어 동작할 수 있게 해주는 개발 환경이라면, 객체지향의 기본 개념은 메쏘드 재정의나 클래스 확장을 통해 기존 클래스를 재사용할 수 있도록 하는 것입니다.
컴포넌트 소프트웨어 환경
컴포넌트는 크게 비주얼 컴포넌트와 미들웨어 컴포넌트로 나눌 수 있습니다. 비주얼 컴포넌트는 대부분의 RAD 툴이 제공하는 각종 UI와 이를 이용한 기능성 컴포넌트입니다. 반면에 미들웨어 컴포넌트는 미들웨어 위에서 동작하는 컴포넌트로 특별한 UI없이 동작할 수 있습니다. 최근 웹 환경 개발이 강화되면서 중요한 컴포넌트로 자리를 잡았습니다. 여기서 중요한 것은 비주얼 컴포넌트와 미들웨어 컴포넌트는 개념상 비슷하지만 그 내용은 크게 다르다는 것입니다.
비주얼 컴포넌트
비주얼 컴포넌트는 말 그대로 시각적인 컴포넌트입니다. 비주얼 컴포넌트 소프트웨어로는 델파이, 비주얼 베이직, 비주얼 에이지 등이 대표적입니다. 이들은 대부분 비슷한 GUI를 가지고 컴포넌트를 마우스를 통해 소프트웨어 폼에 쉽게 부착하고, 프로퍼티를 조절하고, 다른 컴포넌트와 연결해 새로운 소프트웨어를 만들 수 있습니다. 비주얼 컴포넌트는 대부분 사용자 인터페이스와 관련이 있습니다. 여기서는 이에 대해 구체적으로 다루는 것은 생략하겠습니다.
미들웨어 컴포넌트
미들웨어 컴포넌트는 시각적인 인터페이스를 제공하지 않는 컴포넌트입니다. 미들웨어 컴포넌트는 컴포넌트 환경이 제공하는 다양한 기능을 이용해 실제 데이터의 동작에 대한 로직만을 제공해 소프트웨어가 완성될 수 있게 합니다. 미들웨어 컴포넌트는 대부분 웹 인터페이스를 통해 사용자와 인터페이스하기 때문에 사용자는 웹 브라우저로 웹 서버에 접속하면 내부적인 미들웨어 컴포넌트에 의해 동작되는 결과들을 확인할 수 있습니다. 아마도 최근에 비주얼 컴포넌트보다 미들웨어 컴포넌트가 더 강화되는 이유가 이 때문이 아닐까 생각합니다. 미들웨어 컴포넌트의 대표적인 두 가지가 COM+와 EJB입니다.
COM+
COM+는 마이크로소프트의 MTS(Microsoft Transaction Server)의 최신 버전입니다. 1999년에 발표됐으므로 약 3년 정도의 시간이 지났습니다. COM+는 닷넷 기반의 애플리케이션과 COM을 하나로 묶는 것으로 관리 기능, JITA(Just-In-Time Activation), 객체 풀링, 트랜잭션 처리, 동기화, 보안, 컴포넌트 큐 관리, 이벤트 처리 등 다양한 기능을 제공합니다. COM+에는 다음과 같은 구성 요소가 있습니다.
◆ COM+ 대리 실행 모듈(dllhost.exe)
◆ COM+ 클래스 로딩 및 리모트 프레임워크(ole32.dll)
◆ 컨텍스트 오브젝트와 랩퍼 프록시
◆ COM+ 서버 컴포넌트
◆ COM+ 클라이언트
◆ COM+ 런타임, 서비스 컨트롤 관리자(SCM), 분산 트랜잭션 관리자(MS-DTC), 메시지큐(MSMQ), 트랜잭션 통합 관리자(COM-TI)
COM+는 조금 복잡한 동작을 요구합니다. 기본적으로 COM+ 서버 컴포넌트는 OLE32.DLL 및 DLLHOST.EXE로 구성된 컨테이너에 의해 호출되고, 다시 컨텍스트 객체에 의해 처리되도록 고안됐습니다. 이것은 COM+가 기존 MTS 및 다른 환경도 함께 수용할 수 있는 환경을 만들다 보니 더 복잡한 환경을 제공하는 것으로 보이지만 실제로는 기존 COM 환경에서 그리 많은 변화가 있던 것은 아닙니다.
COM+의 특징 중 하나는 스스로 자신을 설명할 수 있는 컴포넌트라는 점입니다. 이것은 프로퍼티와 달리 애트리뷰트를 제공합니다. 애트리뷰트는 컴포넌트에 런타임 특성을 설정할 수 있는 것을 의미합니다. 이것은 특정한 기능이 작동하도록 컴포넌트를 조절할 수 있는 기능입니다. 예를 들어, 데이터베이스 연결에 사용하는 문자열을 런타임 환경에서는 관리자에 의해 변화할 수 있는 값이 되는데 이것은 자바 환경에서 상태 저장·복원과 관련이 있는 것입니다.
COM+는 또한 큐 컴포넌트 기능을 제공합니다. 큐 컴포넌트는 컴포넌트와 애플리케이션의 상호작용이 실시간에 이루어지지 않더라도 큐를 이용해 컴포넌트가 다시 기동했을 때 상호작용이 다시 일어날 수 있게 하는 것입니다. 이벤트 메커니즘은 자바의 이벤트 리스너 모델처럼 다양한 이벤트 채널을 통해 이벤트를 전달할 수 있게 되어 있습니다. 이 밖의 다른 기능은 COM+의 참고자료를 이용하기 바랍니다.
EJB
EJB는 자바 표준 미들웨어 컴포넌트 구조입니다. EJB는 다음과 같은 구성요소로 이루어져 있습니다.
◆ EJB 서버
◆ EJB 컨테이너(EJB 서버 위에서 동작)
◆ EJB(EJB 컨테이너 위에서 동작)
◆ EJB 클라이언트
◆ 기타 구성 요소 : JNDI(Java Naming and Directory Inter face), JTS(Java Transaction Service)
이를 그림으로 표현하면 <그림 4>와 같습니다. EJB 서버는 CORBA의 ORB(Object Request Broker)와 비슷한 기능을 제공합니다. 시스템 실행환경을 제공하고, 멀티프로세싱, 부하분산, 장치제어, 네이밍 및 트랜잭션 처리 등을 제공하며, EJB 컨테이너를 올릴 수 있게 해줍니다. EJB 컨테이너는 EJB와 외부 세계의 인터페이스를 제공합니다. EJB 클라이언트는 결코 직접 EJB와 연결되지 않습니다. EJB를 연결할 수 있는 메쏘드를 EJB 클라이언트에 제공하는 것이 바로 EJB 컨테이너입니다.
EJB는 크게 두 종류가 있습니다. EJB의 상태가 지속적으로 유지되는 경우와 매번 초기화되는 경우가 있습니다. EJB의 상태가 유지되려면 가장 최근의 EJB 속성을 저장하거나 복구하는 기능을 제공해야 합니다. 이러한 기능은 EJB 컨테이너 인터페이스를 통해 EJB 서버가 제공합니다. EJB 클라이언트는 컴포넌트를 이용하는 주체이며, EJB는 컴포넌트 자체입니다. 이러한 구조는 대부분의 컴포넌트 구조의 특징입니다.
EJB는 EJB 클라이언트의 요청에 의해 그때마다 생성되는 세션 빈과 상태를 공유하는 엔티티 빈으로 나눌 수 있습니다. 엔티티 빈은 항상 상태를 가지고 있으며, 시스템이 동작하는 한 계속 살아있는 상태가 됩니다. 세션 빈은 상태를 가지고 있을 수도 있고, 상태가 없을 수도 있습니다. 이러한 상태 저장 및 복구는 그 주체가 누구이냐에 따라 컨테이너 관리형 상태 유지와 빈 관리형 상태 유지로 나눌 수 있습니다. 쉽게 이야기하면 저장 및 복구를 컨테이너가 하면 컨테이너 관리형 상태 유지이고, 저장 및 복구가 빈에 의해 수행되면 빈 관리형 상태 유지입니다. EJB는 *.ser 파일에 의해 동작 가능하도록 배치(deploy)할 수 있습니다. 이 파일은 다음과 같은 엔트리로 지정되어 동작합니다.
Name: ~bean/CompanyAccssRight.ser
Enterprise-Bean: True
컴포넌트의 미래
정보통신부는 컴포넌트 산업을 육성하기 위해 향후 3년간 공용 컴포넌트 개발은 물론 공용 컴포넌트 뱅크 마련, 컴포넌트 유통 시스템 구축, 컴포넌트 품질 평가 및 인증제도 확립, 컴포넌트 가격 산정 및 라이선스 규정 수립, 관련 인력 양성 등에 박차를 가할 계획이라고 합니다.
현재 국내 시장에 나와 있는 컴포넌트는 약 150종에 불과하지만 올해 말이면 1000개 가량의 컴포넌트가 개발될 것이라고 예견하기도 합니다. 현재 국내 신생 업체들을 중심으로 자바 컴포넌트 기술을 이용해 상용 애플리케이션을 개발하는 사례가 늘고 있으며 특히 전사적자원관리 시스템부터 개발 툴, XML 솔루션, 검색엔진, 통신용 소프트웨어, 인터넷 구축 툴, 언어처리 모듈, 지식관리, 고객관리 등의 분야에 이르기까지 다양한 분야에서 개발이 진행되고 있다고 합니다.
하지만 컴포넌트가 일반적인 개발 환경이 되기 위해서는 넘어야 할 과정이 많이 있습니다. 아직 교육 환경이 컴포넌트 개발 환경에 맞게 빠르게 제공되지 못하는 실정입니다. 대부분의 개발자는 전체 컴포넌트 환경을 이해할 수 있는 수준이 되지 못하고 있습니다. 그것은 소프트웨어 시장의 요구를 교육 환경이 미처 뒷받침해줄 수 없을 정도로 빠르게 변화하고 있다는 것을 의미합니다. 필자의 생각으로는 컴포넌트가 일반적인 개발 환경에 되려면 좀더 많은 시간이 필요할 것입니다. 객체지향이 20년이 지나서야 일반적인 개발환경이 되는 것을 보면 새로운 개념이 쉽게 보편화되지는 않기 때문입니다. 하지만 컴포넌트가 일반화되는 데 20년이 걸릴 것이라는 것은 아닙니다. 그보다 훨씬 빠른 시간에 도달할 것입니다. 하지만 이 자리에서 그 시기가 언제라고 언급하는 것은 별 의미가 없다고 생각합니다.
컴포넌트에 대한 깊은 이해와 적용 필요
컴포넌트와 객체지향은 밀접한 관계가 있다고 말할 수 없지만, 그 목적이 비슷하기 때문에 객체지향과 컴포넌트가 연결되는 다양한 시도가 있었습니다. 대부분의 개발 툴이 객체지향 언어를 지원하고 컴포넌트 구조를 제공함으로써 더욱 편리하게 프로그래밍이 가능하도록 하고 있습니다. 비주얼 컴포넌트는 대부분의 개발 툴이 제공하는 요소가 됐습니다. 하지만 이것은 특정한 개발 환경에서만 사용할 수 있는 경우가 많고, 대부분 웹 인터페이스를 사용하기 때문에 미들웨어 컴포넌트의 중요성이 더 커지고 있습니다. 미들웨어 컴포넌트는 윈도우 기반의 COM 계열, 자바 기반의 EJB 계열, OMG의 CORBA 계열이 있습니다.
이들을 간략하게 살펴보았는데, 실제 체계적인 학습 없이 빠른 시간에 컴포넌트 환경을 이해한다는 것은 매우 어려운 일입니다. 개발자들이 컴포넌트 환경을 이해하고 업무에 활용하기 위해서는 앞으로 많은 교육 기회가 주어져야 할 것으로 보입니다. 그런 의미에서 서로 다른 컴포넌트 환경은 경쟁자라기보다는 컴포넌트라는 하나의 거대한 목표를 향해 달리는 협력 주자라고 할 수 있습니다.
정리 : 송우일 wooil@sbmedia.co.kr
출처 : http://www.imaso.co.kr/
우리나라에서도 컴포넌트에 대한 관심이 많이 높아지고 있습니다. 이것은 객체지향과 더불어 하나의 새로운 패러다임이라고도 합니다. 컴포넌트는 소프트웨어를 이제까지처럼 계획, 설계, 분석, 구현, 테스트하는 순차적인 개발 과정으로 보는 것이 아니라 레고 블럭이나 자동차 부품처럼 조립하는 개념으로 간주하기 때문에 현재 IT 산업을 이루고 있는 기존 틀과 구조를 가내 수공업 형태에서 ‘표준화’하고 ‘산업화’하는 데 그 의미가 있다고 하겠습니다.
이러한 컴포넌트는 인터넷이라는 환경의 부상으로 더욱 강력한 위치를 차지하게 됐습니다. 그것은 개발자에게도 새로운 개발 환경을 이해하도록 요구하고 있습니다. 컴포넌트 프로그래밍에서는 특정한 환경의 국소적인 이해보다는 시스템에 대해 전체적으로 이해할 수 있어야만 좋은 프로그램을 제작할 수 있습니다. 하지만 컴포넌트를 쉽게 이해할 수 있는 방법이 마땅히 있지 않습니다. 이번 연재에서는 객체지향과 컴포넌트를 연계해서 이해하고 간단하게 컴포넌트 환경을 살펴보겠습니다.
컴포넌트의 등장
컴포넌트라 함은 말 그대로 서로의 인터페이스를 연결하면 하나의 시스템으로 동작할 수 있는 환경의 구성 요소를 의미합니다. 몇 가지 컴포넌트의 결합으로 새로운 소프트웨어를 만들 수 있다는 생각은 그리 새로운 것은 아닙니다. 실제 우리 생활에서도 뮤직 컴포넌트처럼 서로 공통의 인터페이스로 연결해 새로운 시스템을 만드는 경우가 많습니다. 어릴 적 즐겨 가지고 놀았던 합체 로봇도 컴포넌트 시스템입니다. 그리고 비디오, 오디오, TV로 만드는 AV 시스템 역시 훌륭한 컴포넌트 시스템의 예입니다. 서로 다른 기능을 하는 두 요소를 결합해 새로운 기능을 만든다면 그것을 컴포넌트 시스템이라고 말할 수 있습니다.
우리가 사용하는 컴퓨터 시스템도 또 다른 컴포넌트 시스템의 예입니다. 컴퓨터 시스템은 컴퓨터 본체, 모니터, 키보드, 마우스, 스피커로 구성되고 사전에 규정된 모니터 케이블, PS/2 마우스, 키보드 포트, 오디오 잭 등을 통해 컴포넌트의 결합을 이룹니다. 하드웨어적인 컴포넌트는 표준화를 통해 산업화하는 하나의 전형적인 메커니즘입니다.
소프트웨어에서도 컴포넌트라고 하면 마찬가지 개념으로 생각해 볼 수 있습니다. 소프트웨어에 있어서 컴포넌트라는 개념은 RAD 툴의 등장과 더불어 탄생했다고 할 수 있습니다. RAD 툴의 등장 자체가 프로그래밍의 산업화 과정이라고 할 수 있습니다. 물론 소프트웨어 컴포넌트라는 개념이 갑자기 만들어진 것은 아닙니다. 이미 컴포넌트 이전에 라이브러리가 그러한 기능을 하고 있었습니다. 사전에 필요한 함수들을 만들어 놓고 프로그래밍에서 활용할 수 있도록 만들어 두는 것이 라이브러리인데, 컴포넌트를 이해하기에 앞서 우선 라이브러리를 이해하는 것이 좋습니다.
소프트웨어 라이브러리
소프트웨어 라이브러리는 매우 중요한 프로그래밍 자원으로 프로그래밍에 자주 쓰이는 함수나 클래스를 함께 묶어놓은 것입니다. 라이브러리 안에 있는 코드를 사용하기 위해서는 필요한 함수나 클래스의 사용법을 미리 숙지하고, 정의된 인터페이스를 통해 프로그래밍 모듈을 작성하고, 컴파일 과정에서 라이브러리와 작성한 모듈을 링크하는 작업이 필요합니다.
라이브러리를 많이 가지고 있는 친구는 빠르게 프로그램을 완성할 수 있는 반면에 라이브러리를 가지고 있지 않거나 기본적으로 언어 개발 툴에서 제공하는 라이브러리를 잘 이해하지 못하는 경우에는 이미 라이브러리에 있는, 그러나 본인은 알지 못하는, 함수를 직접 구현하기 위해 많은 시간을 소비하면서도 프로그램을 완성하지 못하기도 합니다.
기껏 만들고 있으면, 다른 친구가 “야, 이건 이미 기본 라이브러리에 있는 기능이야”라고 말해 당사자를 실망하게 만듭니다. 상황이 이렇다 보니, 한때는 소프트웨어 개발자들이 가지고 있는 소프트웨어 라이브러리의 양이 좋은 개발자와 나쁜 개발자로 나누는 기준이 되기도 했습니다.
일부 개발자 중에서는 편집광적으로 소프트웨어 라이브러리를 모으는 경우도 쉽게 찾아볼 수 있었습니다. 하지만, 개발 툴이 커지고 대규모가 되면서 대부분의 필요한 라이브러리들은 개발 툴에 포함되어 제공됐습니다. 최근에는 개발 툴이 제공하지 않는 추가적인 라이브러리를 이용하는 비중은 틈새시장 정도로 무척이나 작아졌습니다. 그만큼 소프트웨어 라이브러리가 정형화됐다고 할 수 있습니다. 하지만, 여전히 라이브러리에 대한 충분한 사전 지식 없이 소프트웨어 라이브러리를 쉽게 사용한다는 것은 어려운 일입니다.
컴포넌트와 라이브러리
인터넷의 보급과 더불어 누구나 쉽게 라이브러리를 인터넷에서 찾아 사용할 수 있게 됐고 부담 없는 수준에서 라이브러리를 구입할 수 있습니다. 그리고 오픈 소스 정책으로 인해 많은 라이브러리 소스가 공개되면서 라이브러리의 가치는 지속적으로 떨어졌습니다. 하지만 이것은 다른 한편으로 게으른 개발자를 양산했습니다. 그냥 모든 것은 인터넷에 있다고 생각하는 나머지 라이브러리 사용법조차 알지 못하는 개발자가 많아진 것입니다.
이러한 문제점을 새롭게 해결하고자 나온 것이 바로 컴포넌트입니다. 컴포넌트는 컴포넌트 스스로가 어떤 인터페이스를 가지고 있는지 개발자에게 알려줄 수 있습니다. 그리고 속성을 변경해 자신의 초기값을 조정할 수 있기 때문에 커스터마이징이 쉽습니다. 이러한 사용자 환경이 만들어낸 것이 애플리케이션을 빠르게 제작할 수 있는 RAD 툴입니다. RAD 툴 안에서는 미리 작성되어 있는 컴포넌트들을 통해 애플리케이션을 쉽게 작성할 수 있습니다.
컴포넌트의 기본적인 개념은 소프트웨어 라이브러리와 유사합니다. 라이브러리가 사전에 필요한 코드를 작성해놓고 나중에 컴파일 과정에서 연결해 사용하는 것이라면, 컴포넌트는 사전에 정의된 컴포넌트 인터페이스를 만족하도록 작성되고, 이를 통해 프로그래밍 과정에서 연결해 사용할 수 있게 되어 있습니다. 따라서 컴포넌트의 동작 상황을 개발 당시에 확인할 수 있다는 장점이 있습니다. 그리고 대부분 비주얼한 컴포넌트를 제공하기 때문에 GUI까지 한꺼번에 해결해주기도 합니다.
최근에 나온 개발 툴은 대부분 자신들의 컴포넌트를 제공합니다. 하지만 컴포넌트가 단지 최신 라이브러리라는 의미는 아닙니다. 그것은 현재 시스템이 점점 복잡해지면서 시스템을 구축할 때 모든 기능을 새롭게 구축하면 비용이 많이 들기 때문에 필수적이고 복잡한 환경은 사전에 만들어 놓고 적용하려는 시스템에 따라 변화되는 부분만을 새롭게 작성하여 동작할 수 있도록 하는 데 사용하는 것입니다. 아마도 이것은 뮤직 컴포넌트 개념보다는 DVD 플레이어와 DVD의 관계라고 말할 수 있을 것입니다.
컴포넌트의 구성
그렇다면 소프트웨어 컴포넌트는 무엇으로 구성될까요? 컴포넌트는 우선 서로 다른 컴포넌트를 연결하는 입출력 인터페이스가 필요합니다. 그리고 기본적인 상태를 정의할 수 있는 프로퍼티가 있습니다. 컴포넌트는 잘 정의된 인터페이스를 통해 사전에 구현한 소프트웨어 모듈입니다. 예전에는 특정한 툴 환경에서만 의미 있는 컴포넌트들이 있었는데, 지금은 특정한 언어와 상관없이 사용할 수 있는 컴포넌트 구조들도 있습니다.
대표적으로 COM(Common Object Model)은 윈도우 환경에서 빼놓을 수 없는 핵심적인 컴포넌트 구조를 제공합니다. COM은 윈도우의 핵심 커널을 제외하고는 대부분의 환경에서 사용되는 모델입니다.
그리고 EJB(Enterprise Java Beans)는 자바 프로그래밍 언어를 통해 미들웨어를 구현할 수 있도록 제공하는 모델입니다. 트랜잭션, 보안, 데이터베이스 접속 등을 쉽게 이용할 수 있도록 하는 환경을 제공하고, 이를 컴포넌트화해 소프트웨어 모듈을 개발할 수 있게 하는 것입니다.
객체지향과 컴포넌트
객체지향은 소프트웨어를 행동과 상태 기반의 객체로 정의해 재사용성을 높이는 것이 목표입니다. 컴포넌트는 사전에 정의된 인터페이스를 통해 즉각 실행할 수 있는 컴포넌트로 생산하여 재사용성을 높이는 것입니다. 재새용성을 높인다는 것에 대해서는 그 목적이 동일하지만 접근 방법의 차이가 있다고 할 수 있습니다. 객체지향에서는 새로운 데이터 형을 작성하는 것부터 출발하는데, 컴포넌트는 잘 짜여진 인터페이스를 사전에 정의하고, 이를 통해 필요한 동작을 구현하는 것부터 출발합니다.
◆ 클래스 = 데이터 + 메쏘드
◆ 컴포넌트 = 특성 + 인터페이스 + 로직 + 이벤트
이와 같이 컴포넌트는 서로의 기능을 쉽게 연결할 수 있는 인터페이스가 가장 중요한 위치를 차지합니다. 객체지향과 컴포넌트가 만나는 위치는 인터페이스입니다. 컴포넌트의 인터페이스는 객체지향의 메쏘드와 유사합니다. 물론 객체지향 언어에서 메쏘드와 인터페이스는 엄밀한 의미에서 구별되지만 실제로는 그 기능이 비슷하다고 할 수 있습니다.
차이점은 인터페이스가 아니라 접근 방법에 있습니다. 컴포넌트는 컨테이너라는 컴포넌트가 동작할 수 있는 환경을 제공하고, 이 구조에 맞는 다른 컴포넌트들이 서로 연결되어 동작할 수 있게 해주는 개발 환경이라면, 객체지향의 기본 개념은 메쏘드 재정의나 클래스 확장을 통해 기존 클래스를 재사용할 수 있도록 하는 것입니다.
컴포넌트 소프트웨어 환경
컴포넌트는 크게 비주얼 컴포넌트와 미들웨어 컴포넌트로 나눌 수 있습니다. 비주얼 컴포넌트는 대부분의 RAD 툴이 제공하는 각종 UI와 이를 이용한 기능성 컴포넌트입니다. 반면에 미들웨어 컴포넌트는 미들웨어 위에서 동작하는 컴포넌트로 특별한 UI없이 동작할 수 있습니다. 최근 웹 환경 개발이 강화되면서 중요한 컴포넌트로 자리를 잡았습니다. 여기서 중요한 것은 비주얼 컴포넌트와 미들웨어 컴포넌트는 개념상 비슷하지만 그 내용은 크게 다르다는 것입니다.
비주얼 컴포넌트
비주얼 컴포넌트는 말 그대로 시각적인 컴포넌트입니다. 비주얼 컴포넌트 소프트웨어로는 델파이, 비주얼 베이직, 비주얼 에이지 등이 대표적입니다. 이들은 대부분 비슷한 GUI를 가지고 컴포넌트를 마우스를 통해 소프트웨어 폼에 쉽게 부착하고, 프로퍼티를 조절하고, 다른 컴포넌트와 연결해 새로운 소프트웨어를 만들 수 있습니다. 비주얼 컴포넌트는 대부분 사용자 인터페이스와 관련이 있습니다. 여기서는 이에 대해 구체적으로 다루는 것은 생략하겠습니다.
미들웨어 컴포넌트
미들웨어 컴포넌트는 시각적인 인터페이스를 제공하지 않는 컴포넌트입니다. 미들웨어 컴포넌트는 컴포넌트 환경이 제공하는 다양한 기능을 이용해 실제 데이터의 동작에 대한 로직만을 제공해 소프트웨어가 완성될 수 있게 합니다. 미들웨어 컴포넌트는 대부분 웹 인터페이스를 통해 사용자와 인터페이스하기 때문에 사용자는 웹 브라우저로 웹 서버에 접속하면 내부적인 미들웨어 컴포넌트에 의해 동작되는 결과들을 확인할 수 있습니다. 아마도 최근에 비주얼 컴포넌트보다 미들웨어 컴포넌트가 더 강화되는 이유가 이 때문이 아닐까 생각합니다. 미들웨어 컴포넌트의 대표적인 두 가지가 COM+와 EJB입니다.
COM+
COM+는 마이크로소프트의 MTS(Microsoft Transaction Server)의 최신 버전입니다. 1999년에 발표됐으므로 약 3년 정도의 시간이 지났습니다. COM+는 닷넷 기반의 애플리케이션과 COM을 하나로 묶는 것으로 관리 기능, JITA(Just-In-Time Activation), 객체 풀링, 트랜잭션 처리, 동기화, 보안, 컴포넌트 큐 관리, 이벤트 처리 등 다양한 기능을 제공합니다. COM+에는 다음과 같은 구성 요소가 있습니다.
◆ COM+ 대리 실행 모듈(dllhost.exe)
◆ COM+ 클래스 로딩 및 리모트 프레임워크(ole32.dll)
◆ 컨텍스트 오브젝트와 랩퍼 프록시
◆ COM+ 서버 컴포넌트
◆ COM+ 클라이언트
◆ COM+ 런타임, 서비스 컨트롤 관리자(SCM), 분산 트랜잭션 관리자(MS-DTC), 메시지큐(MSMQ), 트랜잭션 통합 관리자(COM-TI)
COM+는 조금 복잡한 동작을 요구합니다. 기본적으로 COM+ 서버 컴포넌트는 OLE32.DLL 및 DLLHOST.EXE로 구성된 컨테이너에 의해 호출되고, 다시 컨텍스트 객체에 의해 처리되도록 고안됐습니다. 이것은 COM+가 기존 MTS 및 다른 환경도 함께 수용할 수 있는 환경을 만들다 보니 더 복잡한 환경을 제공하는 것으로 보이지만 실제로는 기존 COM 환경에서 그리 많은 변화가 있던 것은 아닙니다.
COM+의 특징 중 하나는 스스로 자신을 설명할 수 있는 컴포넌트라는 점입니다. 이것은 프로퍼티와 달리 애트리뷰트를 제공합니다. 애트리뷰트는 컴포넌트에 런타임 특성을 설정할 수 있는 것을 의미합니다. 이것은 특정한 기능이 작동하도록 컴포넌트를 조절할 수 있는 기능입니다. 예를 들어, 데이터베이스 연결에 사용하는 문자열을 런타임 환경에서는 관리자에 의해 변화할 수 있는 값이 되는데 이것은 자바 환경에서 상태 저장·복원과 관련이 있는 것입니다.
COM+는 또한 큐 컴포넌트 기능을 제공합니다. 큐 컴포넌트는 컴포넌트와 애플리케이션의 상호작용이 실시간에 이루어지지 않더라도 큐를 이용해 컴포넌트가 다시 기동했을 때 상호작용이 다시 일어날 수 있게 하는 것입니다. 이벤트 메커니즘은 자바의 이벤트 리스너 모델처럼 다양한 이벤트 채널을 통해 이벤트를 전달할 수 있게 되어 있습니다. 이 밖의 다른 기능은 COM+의 참고자료를 이용하기 바랍니다.
EJB
EJB는 자바 표준 미들웨어 컴포넌트 구조입니다. EJB는 다음과 같은 구성요소로 이루어져 있습니다.
◆ EJB 서버
◆ EJB 컨테이너(EJB 서버 위에서 동작)
◆ EJB(EJB 컨테이너 위에서 동작)
◆ EJB 클라이언트
◆ 기타 구성 요소 : JNDI(Java Naming and Directory Inter face), JTS(Java Transaction Service)
이를 그림으로 표현하면 <그림 4>와 같습니다. EJB 서버는 CORBA의 ORB(Object Request Broker)와 비슷한 기능을 제공합니다. 시스템 실행환경을 제공하고, 멀티프로세싱, 부하분산, 장치제어, 네이밍 및 트랜잭션 처리 등을 제공하며, EJB 컨테이너를 올릴 수 있게 해줍니다. EJB 컨테이너는 EJB와 외부 세계의 인터페이스를 제공합니다. EJB 클라이언트는 결코 직접 EJB와 연결되지 않습니다. EJB를 연결할 수 있는 메쏘드를 EJB 클라이언트에 제공하는 것이 바로 EJB 컨테이너입니다.
EJB는 크게 두 종류가 있습니다. EJB의 상태가 지속적으로 유지되는 경우와 매번 초기화되는 경우가 있습니다. EJB의 상태가 유지되려면 가장 최근의 EJB 속성을 저장하거나 복구하는 기능을 제공해야 합니다. 이러한 기능은 EJB 컨테이너 인터페이스를 통해 EJB 서버가 제공합니다. EJB 클라이언트는 컴포넌트를 이용하는 주체이며, EJB는 컴포넌트 자체입니다. 이러한 구조는 대부분의 컴포넌트 구조의 특징입니다.
EJB는 EJB 클라이언트의 요청에 의해 그때마다 생성되는 세션 빈과 상태를 공유하는 엔티티 빈으로 나눌 수 있습니다. 엔티티 빈은 항상 상태를 가지고 있으며, 시스템이 동작하는 한 계속 살아있는 상태가 됩니다. 세션 빈은 상태를 가지고 있을 수도 있고, 상태가 없을 수도 있습니다. 이러한 상태 저장 및 복구는 그 주체가 누구이냐에 따라 컨테이너 관리형 상태 유지와 빈 관리형 상태 유지로 나눌 수 있습니다. 쉽게 이야기하면 저장 및 복구를 컨테이너가 하면 컨테이너 관리형 상태 유지이고, 저장 및 복구가 빈에 의해 수행되면 빈 관리형 상태 유지입니다. EJB는 *.ser 파일에 의해 동작 가능하도록 배치(deploy)할 수 있습니다. 이 파일은 다음과 같은 엔트리로 지정되어 동작합니다.
Name: ~bean/CompanyAccssRight.ser
Enterprise-Bean: True
컴포넌트의 미래
정보통신부는 컴포넌트 산업을 육성하기 위해 향후 3년간 공용 컴포넌트 개발은 물론 공용 컴포넌트 뱅크 마련, 컴포넌트 유통 시스템 구축, 컴포넌트 품질 평가 및 인증제도 확립, 컴포넌트 가격 산정 및 라이선스 규정 수립, 관련 인력 양성 등에 박차를 가할 계획이라고 합니다.
현재 국내 시장에 나와 있는 컴포넌트는 약 150종에 불과하지만 올해 말이면 1000개 가량의 컴포넌트가 개발될 것이라고 예견하기도 합니다. 현재 국내 신생 업체들을 중심으로 자바 컴포넌트 기술을 이용해 상용 애플리케이션을 개발하는 사례가 늘고 있으며 특히 전사적자원관리 시스템부터 개발 툴, XML 솔루션, 검색엔진, 통신용 소프트웨어, 인터넷 구축 툴, 언어처리 모듈, 지식관리, 고객관리 등의 분야에 이르기까지 다양한 분야에서 개발이 진행되고 있다고 합니다.
하지만 컴포넌트가 일반적인 개발 환경이 되기 위해서는 넘어야 할 과정이 많이 있습니다. 아직 교육 환경이 컴포넌트 개발 환경에 맞게 빠르게 제공되지 못하는 실정입니다. 대부분의 개발자는 전체 컴포넌트 환경을 이해할 수 있는 수준이 되지 못하고 있습니다. 그것은 소프트웨어 시장의 요구를 교육 환경이 미처 뒷받침해줄 수 없을 정도로 빠르게 변화하고 있다는 것을 의미합니다. 필자의 생각으로는 컴포넌트가 일반적인 개발 환경에 되려면 좀더 많은 시간이 필요할 것입니다. 객체지향이 20년이 지나서야 일반적인 개발환경이 되는 것을 보면 새로운 개념이 쉽게 보편화되지는 않기 때문입니다. 하지만 컴포넌트가 일반화되는 데 20년이 걸릴 것이라는 것은 아닙니다. 그보다 훨씬 빠른 시간에 도달할 것입니다. 하지만 이 자리에서 그 시기가 언제라고 언급하는 것은 별 의미가 없다고 생각합니다.
컴포넌트에 대한 깊은 이해와 적용 필요
컴포넌트와 객체지향은 밀접한 관계가 있다고 말할 수 없지만, 그 목적이 비슷하기 때문에 객체지향과 컴포넌트가 연결되는 다양한 시도가 있었습니다. 대부분의 개발 툴이 객체지향 언어를 지원하고 컴포넌트 구조를 제공함으로써 더욱 편리하게 프로그래밍이 가능하도록 하고 있습니다. 비주얼 컴포넌트는 대부분의 개발 툴이 제공하는 요소가 됐습니다. 하지만 이것은 특정한 개발 환경에서만 사용할 수 있는 경우가 많고, 대부분 웹 인터페이스를 사용하기 때문에 미들웨어 컴포넌트의 중요성이 더 커지고 있습니다. 미들웨어 컴포넌트는 윈도우 기반의 COM 계열, 자바 기반의 EJB 계열, OMG의 CORBA 계열이 있습니다.
이들을 간략하게 살펴보았는데, 실제 체계적인 학습 없이 빠른 시간에 컴포넌트 환경을 이해한다는 것은 매우 어려운 일입니다. 개발자들이 컴포넌트 환경을 이해하고 업무에 활용하기 위해서는 앞으로 많은 교육 기회가 주어져야 할 것으로 보입니다. 그런 의미에서 서로 다른 컴포넌트 환경은 경쟁자라기보다는 컴포넌트라는 하나의 거대한 목표를 향해 달리는 협력 주자라고 할 수 있습니다.
정리 : 송우일 wooil@sbmedia.co.kr
출처 : http://www.imaso.co.kr/
'Computer_language > Comfile' 카테고리의 다른 글
[Tip] win32k.sys 덤프가 뜰 경우..(메모리 테스트 프로그램들) [출처] [Tip] win32k.sys 덤프가 뜰 경우..(메모리 테스트 프로그램들) (0) | 2009.01.12 |
---|---|
프로그램 덤프 뜨기... (0) | 2009.01.12 |
[디버깅] core dump file을 분석해 보자 (0) | 2009.01.12 |
NS2 - 무선환경 시뮬레이션 (0) | 2009.01.12 |