[SOA] #2. 컴포넌트 기반의 개발(Component-Based Development; CBD)
소프트웨어의 개발에 있어, 유사한 코드와 알고리즘의 재개발은 비일비재 했던 일이고, 이것은 막대한 시간과 노력, 개발비의 낭비를 불러 일으켰다. 이런 점에서 객체지향프로그래밍은 개발자들로 하여금 다른 프로젝트간의 코드를 공유할 수 있도록 해주기 때문에 큰 인기를 얻었다. 하지만 코드 재사용이라는 것을 잘 이해하려면 보다 정확한 정의가 필요하다. 진정한 코드 재사용이란 코드가 동작하는 방식이나 하는 일을 사용자가 정의할 수 있으면서도, 보다 커다란 것을 만들 때는 재사용 하기에 충분할 만큼 정형화된 코드(normalized code)를 작성해야 한다는 것을 의미한다. 이러한 점에서 기존의 객체지향프로그래밍은 원래 개발자와 그 코드를 재사용하기를 원하는 사람이 동일한 프로그램 언어로 작업해야 한다는 문제가 있다. 예를 들어 클래스 라이브러리가 C++로 작성되었다면 다른 언어로 작성된 프로그램에서는 그 코드를 재사용한다는 것이 기본적으로 불가능하다. 마찬가지로 Java 클래스는 Java프로그램에서만 사용할 수 있는데, 이런 점은 객체지향프로그래밍 언어를 사용하여 보다 많은 소프트웨어 재사용성을 달성할 수 있지만 여전히 한계가 있다는 점을 드러내고 있다.
컴포넌트(Component)
컴포넌트는 객체지향프로그래밍에서의 객체와는 달리 다형성과 상속성을 배제하고 잘 정의된 인터페이스를 통해 소스 코드가 아닌 이진 형식(binary form)으로 재사용 함으로서, 소프트웨어의 재사용성을 극단적으로 높인 일종의 "소프트웨어 조각" 혹은 "소프트웨어의 빌딩블록(building block)"이라고 할 수 있다. 소프트웨어의 개발 과정에서 컴포넌트를 다시 컴파일을 하지 않아도 되기 때문에 컴포넌트의 사용에 있어 프로그래밍 언어의 제약을 받지 않을 수 있다. 이런 과정을 이진 재사용(binary reuse)이라고 하는데, 이것은 컴포넌트를 소스코드 수준에서 재사용 하는 것이 아니라 인터페이스에 기반을 두고 사용하고 있기 때문에 가능하다.
자동차 산업에서도 컴포넌트 사용과 유사한 예를 발견할 수 있다. 완성차 제조 업체는 협력 업체에서 생산한 타이어나, 트랜스 미션과 같은 별개의 자동차 부품을 구입해 조립 함으로서 자동차를 완성한다. 이와 마찬가지로 컴포넌트를 이용하면 외부 업체에서 개발한 소프트웨어 빌딩블록을 조립하여 하나의 완성된 소프트웨어를 보다 쉽게 개발할 수 있다.
컴포넌트의 특성
컴포넌트는 각각 명세(specification)를 가지고, 자신이 제공하는 서비스를 식별하도록 한다. 서비스는 기능을 구체화시켜 이를 통해 밖으로부터 접근할 수 있도록 인터페이스를 제공하는데 여기에는 서비스의 이름과 파라미터 목록이 포함되어 있다. 캡슐화(encapsulation)개념은 객체지향프로그래밍 기술에서와 마찬가지로 CBD에서도 근본을 이루고 이루는 중요한 요소지만, 컴포넌트에 접근해 기능을 수정할 수 있는 방법은 이미 정의된 인터페이스를 통하는 방법뿐이다. 이 "폐쇄 경계(closed boundary)" 개념은 컴포넌트 기술이 객체지향프로그래밍 기술과는 구별되는 특성이다.
객체지향프로그래밍 기술에서, 상속은 한 객체가 다른 객체를 효과적으로 수정할 수 있는 강력한 기능이지만, 객체 특성이 변경되면 해당 하위 객체는 모두 자동으로 변경을 상속 받게 된다. 상속은 강력하기는 하지만 기술을 습득하기가 매우 어렵고, 시스템 개발에서 또 다른 어려움을 야기시키는데, 이것은 설계가 바뀌면 객체의 경계를 넘어 통제하기 힘들 정도의 파급 효과를 불러오기 때문이다. 하지만 CBD는 캡슐화와 "폐쇄경계" 개념의 도입으로 시스템 설계에서의 관리 체계를 쉽게 세울 수 있다. 그것은 변경이 일어나도 해당 컴포넌트 내로 국한시킬 수 있고, 캡슐 밖으로는 어떤 영향도 주지 않기 때문이다.