서비스지향 아키텍처(Services-Oriented Architecture; 이하 SOA)는 최근 각광받고 있는 웹 서비스, ebXML(electronic business XML)등의 모태가 되는 개념으로 새로운 소프트웨어 아키텍처로 주목 받고 있다. 시장조사업체 Gartner는 2006년까지 전 세계 비즈니스 애플리케이션의 80% 이상이 SOA를 기반으로 개발될 것이라고 전망하기도 했다. 앞으로 몇몇의 글을 통해 이러한 SOA가 어떻게 진화되어 왔는지의 과정과 SOA의 개념 및 특징, SOA의 디자인 원칙에 대해 살펴보고, SOA를 도입하면 얻을 수 있는 효과에 대해 기술할 것이다.
사실 SOA는 결코 새로운 개념이 아니다. 이미 SOA의 기본개념은 CORBA나 DCOM등의 분산 객체 컴퓨팅에도 기반이 되었으며, 그 이전부터의 소프트웨어의 생산성을 높이려는 여러 가지 시도들로부터 점진적으로 발전되어 온 것이다.
소프트웨어 위기(software crisis)
컴퓨터가 발명된 이후 소프트웨어의 수요는 기하급수적으로 증가해 왔으나, 개발자들의 생산성이나 인력의 공급은 산술급수적으로 밖에 성장하지 못했다. 다시 말해 컴퓨터가 모든 사회생활에 깊숙이 활용됨에 따라 사용자들은 컴퓨터에 대한 더 많은 지식과 서비스를 요구하고 있으나, 현재의 생산성은 이를 뒷받침해 주지 못하고 있다는 것이다. 이러한 소프트웨어에 대한 '수요와 공급 불균형'은 날이 갈수록 심화되고 있으며, 소프트웨어의 생산성이 향상되지 않는다면 이러한 소프트웨어 위기 현상은 점점 심화될 것이라는 우려를 낳고 있다. 하지만 이러한 위기를 극복하려는 노력이 끊임없이 진행되어 왔고, 현재 시점의 정점에 SOA가 위치하고 있는 것이다.
객체지향프로그래밍(Object-Oriented Programming)
초기의 프로그램들은 컴퓨터의 계기판 스위치를 올리거나 내리는 방식으로 기계어를 이용하여 작성되었다. 하지만 이러한 접근법은 아주 작은 프로그램을 작성하는 데만 적합했으며 이러한 한계를 극복하기 위해 어셈블리 언어가 개발 되었다. 1950년대에 들어서 포트란(FORTRAN)과 같은 고급 언어가 속속 등장 함에 따라, 프로그래머들은 수천 줄의 프로그램을 보다 쉽게 작성할 수 있게 되었다. 그러나 초기의 프로그래밍 방법은 문제마다 서로 다른 접근법을 이용하고 있었다. 이러한 방법은 비교적 짧은 프로그램에서는 문제가 발생하지 않았지만, 대형 프로그램으로 갈수록 스파게티코드(spaghetti-code)라 불리는 복잡한 코드가 될 수 밖에 없었다. 이렇게 복잡한 코드는 1960년대에 등장한 구조적 프로그래밍(structured programming)을 통해 점차 사라져갔다. Algol, Pascal, C 등이 대표적인 구조적 프로그래밍 언어인데, 이들은 잘 정의된 제어구조(well-designed control structure), 코드 블록(code block), GoTo의 사용 억제, 순환 호출(recursion)과 지역 변수를 지원해주는 부프로그램(sub-program) 등에 기반을 두고 있다. 구조적 프로그래밍이 복잡한 프로그램에 적용될 때 아주 좋은 결과를 가져 올 수는 있지만, 특정 크기를 넘어 선 후에는 여러 가지 문제가 발생했다. 더 복잡한 프로그램을 작성하기 위해서는 새로운 프로그래밍 접근 방법이 필요했는데, 이러한 시점에서 개발된 것이 객체지향프로그래밍이다.
객체지향프로그래밍은 소프트웨어 산업에서 오랫동안 호평을 받아온 패러다임 가운데 하나이다. 이는 Ada, Smalltalk, C++, Java, C#과 같은 객체지향언어들의 인기에서도 잘 나타난다. 객체지향프로그래밍 기술은 개발자로 하여금 실세계에서 생각하는 방식 그대로를 소프트웨어로 작성할 수 있도록 해준다. 대부분의 소프트웨어는 우리가 매일 다루는 사물을 모델링하고 가상화 하는데, 객체지향프로그래밍은 개발자가 사물의 존재를 좀더 직관적으로 객체 단위로 코드화 할 수 있도록 한다. 개발자가 객체지향 패러다임을 보다 더 잘 사용할 수 있도록 대부분의 객체지향프로그래밍 언어는 다음과 같은 세가지 개념을 지원한다.
캡슐화(encapsulation) : 객체의 상세 구현을 숨기는 기능
다형성(polymorphism) : 사용된 객체에 따라 다양한 행동을 보이는 기능
상속성(inheritance) : 새로운 객체나 보다 특수화된 객체를 생성할 때 기존 객체를 재사용할 수 있는 기능