 |
SOA는 비지니스와 연계되어 있는 기업의 서비스를, 솔루션을 디자인 하고 구현하는데에 있어 가장 기본적인 단위로 보는 아키텍쳐 스타일입니다. SOA가 진정 비즈니스와 IT를 연결시키는데에 어떻게 도움을 주는지, 또 이 SOA를 구현하는데 사용될 수 있는 패턴 언어는 무엇인지 알아 봅시다. 머리말
SOA에 대해 많은 말들을 하지만, 이 세 개의 알파벳이 정확이 무엇을 의미하는지에 대해서는 동의가 이루어지지 않는 것 같다. 그럴듯한 정의들이 난무하는 가운데 진정한 의미를 뽑아내기가 힘들다. SearchWebServices.com은 SOA에 대한 최고의 정의를 가려내는 콘테스트를 열었고 많은 출품작들을 받았다. SOA는 사람들마다 그 의미가 다르기 때문에 단 하나의 "딱 맞는" 정의를 고르기가 힘들었다. (참고자료 [1], [2].)
| 관점: |
SOA란.. |
| 비즈니스 경영자 또는 비즈니스 분석가 |
IT 자산들(기능들)을 구성하고 솔루션을 구현하고 이들을 고객과 파트너에게 노출하는데 사용될 수 있는 서비스 세트이다. |
| 엔터프라이즈 아키텍트 |
모듈성, 캡슐화, 약결합, 영역의 분리, 재사용, 구성 등, 솔루션의 전체적인 특성을 다루는 아키텍처 원리와 패턴이다. |
| 프로젝트 매니저 |
거대한 병렬 개발을 지원하는 개발 방식이다. |
| 테스터 또는 품질 보증 엔지니어 |
전체적인 시스템 테스팅을 모듈화 하고 단순화 하는 방식이다. |
| 소프트웨어 개발자 |
웹 서비스 같은 표준, 툴, 기술들을 겸비한 프로그래밍 모델이다. | 이러한 다양한 시각들 모두 전적으로 옳다 하더라도 SOA를 이해할 수 있는 열쇠는 Architecture의 A이다. 하지만 어떤 누구도 소프트웨어 아키텍처에 대해 일반적으로 받아들여지는 정의에 대해서는 동의하지 못했다는 것이 난점이다. Software Engineering Institute에서 관리하는 리스트에는 총 50 가지의 다른 소프트웨어 아키텍처 정의가 있다.
이 글에서는 IEEE Standard 1471-2000, IEEE Recommended Practice for Architectural Description of Software-Intensive Systems (참고자료 [3])에서 제공하는 정의를 사용하고자 한다.
"아키텍처는 컴포넌트로 구체화된 시스템의 기반 구조이고, 서로에 대한 관계이며, 디자인과 진화를 이끄는 원리이다." 특정 아키텍처에 대한 컴포넌트와 관계는 아키텍처 스타일로서 정의된다. (참고자료 [4]) "컴포넌트의 어휘와 커넥터 유형, 그리고 이들이 결합되는 방식에 대한 제약조건"
Convergent architecture: Building model-driven J2EE systems with UML에서는 아키텍처 스타일에 대한 정의를 다음과 같이 내리고 있다. “아키텍처 스타일은 공통 원리와 애트리뷰트에 의해 연관된 아키텍처들의 집합이다.” IT 아키텍처 스타일은 IT 아키텍처에 대한 유기적이고 구체적인 방식이다. 프로젝트와 툴 디자인 측면을 포함하여 전체적인 소프트웨어 라이프 사이클을 다룬다는 점에서 유기적이라고 할 수 있다. 전통적인 방법론에서 개별 엔터티들로서 다루어지는 구조적이고 절차적인 측면들을 통합한다는 점에서 구체적이다. “아키텍처 스타일은 합리적인 대안을 제공하고 이들이 잘 협업할 수 있도록 조정한다. (참고자료[8]).
SOA는 엔터프라이즈 비즈니스 솔루션을 설계, 구현, 합성하는 근본 단위로서 비즈니스로 정비된 엔터프라이즈 서비스 개념을 실현하는 아키텍처 스타일로서 정의될 수 있다. 여러 패턴, 정의 디자인, 구현, SOA 솔루션의 전개는 이러한 스타일을 완성한다.
왜 SOA인가?
비즈니스와 기술 리더가 SOA에 관심을 갖는 이유는 다음과 같다.
- 비즈니스와 IT를 잘 연결한다.
- 더욱 유연하고 반응적인 IT 인프라스트럭처를 만든다.
- 통합 구현을 단순화 한다.
SOA에서는 비즈니스와 IT를 보다 효과적으로 연결할 수 있다는 신뢰를 받고 있다. SOA는 과거에 경험했던 어떤 것보다 강력하게 이 둘의 관계에 상승 효과를 이끌어 내는 다리이다. 더욱이, SOA는 비즈니스와 IT 간 제휴를 통해서 달성되는 비즈니스 결과에 관한 것이다. (참고자료[5]).
현재의 SOA 경향을 이해하기 위해 전형적인 엔터프라이즈 IT 아키텍처와 이것의 단점에 대해서 알아보도록 하자.
애플리케이션 중심 아키텍처
오늘날의 엔터프라이즈 IT 아키텍처는 애플리케이션들의 집합으로 종종 간주된다. 소프트웨어 시스템의 디자인, 개발, 향상, 유지 관리는 애플리케이션을 중심으로 진화한다. 이러한 방식에 따라 엔터프라이즈 아키텍처 내에 격리된 사일로(silo)를 만들게 되고, 값비싸고 유연하지 못한 IT 시스템으로 이어진다. 각 애플리케이션은 하나의 목적(대출 처리, 고객 의견 관리 등)을 위해 구현되고, 고유의 데이터 스토어와 사용자들을 갖게 된다. 결국, 엔터프라이즈 기능의 하위 세트만 구현하고, 엔터프라이즈 데이터의 하위 세트만 사용 및 만들어 내며, 엔터프라이즈 내 다른 프로세싱(연동 또는 연합)에 대해서는 신경 쓰지 않는다. 이러한 사일로들은 데이터 섬(islands of data)과 자동화 섬(islands of automation)이 증명하고 있다.
- 데이터 섬(Islands of data)
- 각각의 데이터는 엔터프라이즈 객체에 대해 고유의 의미 또는 정의를 갖는다. (참고자료 [6]) 예를 들어, 하나의 애플리케이션에서 "price"가 원가를 의미하지만, 다른 애플리케이션에서는 같은 용어가 세금을 의미한다. "address"라는 객체가 두 개의 애플리케이션에서 같은 의미를 지니고 있더라도, 이중 하나가 주소 라인으로서 이를 정의할 수 있고, 다른 것은 이를 street address, city, state, ZIP, country로 처리할 수 있다. 두 경우 모두 애플리케이션 간 의미적 차이를 만들어 낸다.
각각은 또 다른 섬의 콘텐트와 겹치는 정보를 갖고 있다. 예를 들어, 건강과 치과 관리를 다루는 애플리케이션이 보험 적용자를 위한 정보를 저장한다. 동시에 고객 관리(CRM) 애플리케이션에는 보험자의 주소와 통계가 저장된다. 이러한 중복은 데이터 무결성 문제를 만들어 낸다.
어떤 누구도 엔터프라이즈 데이터에 대한 완전한 그림을 제공할 수 없다. 예를 들어, 모기지 관리 애플리케이션에는 다른 비즈니스 라인에서 대출자가 받은 대출 정보가 포함되어 있지 않다. 엔터프라이즈 데이터의 통합 뷰를 만들려면 여러 소스들에서 정보들을 통합해야 한다.
- 자동화 섬(Islands of automation)
- 각각의 자동화 섬은 엔터프라이즈 내의 한정된 액티비티들에 초점을 맞춘다. (참고자료 [6]) 예를 들어, 건강 관리 애플리케이션은 클레임만 처리하고, 전체적인 엔터프라이즈 비즈니스 프로세스에서의 이러한 액티비티의 역할과 위치를 고려하지 않는다. 사용자가 작업을 수행하기 때문에 생산성에 영향을 미친다.
다른 섬들 내에 포함된 비즈니스 프로세스들 간 중복이 있다. 예를 들어, 보험 회사는 인수 합병의 결과로서 여러 개의 클레임 처리 시스템을 가질 수 있다. 여러 애플리케이션들간 변경 사항들의 동기화가 필요하며, 프로세스와 비즈니스 규칙의 일관성을 보장해야 하며 프로세스를 지원해야 한다.
데이터 섬과 자동화 섬의 효과는 개별 애플리케이션 레벨에서는 보이지 않는다. 하지만, 엔터프라이즈 레벨에서는 심각한 문제를 만들어 낸다.
- 정보 충실도(Information fidelity)): 데이터 섬들 간 비즈니스 데이터의 중복은 엔터프라이즈 데이터를 부정확하게 표현할 수 있다. 심지어 주기적인 동기화가 발생할 때도 그렇다. 표현 그 자체는 조정하기가 어렵다. 개별 애플리케이션들은 독립적으로 진화하기 때문에 문제의 복잡함 또한 증가한다.
- 비즈니스 프로세스 단편화(Business processes fragmentation): 개별 애플리케이션들은 제한된 엔터프라이즈 기능만 제공한다. 비즈니스 프로세스를 구현하려면 프로세스의 부분적인 구현들을 포함하고 있는 애플리케이션들을 연결해야 한다.
이러한 문제들을 해결하기 위해 엔터프라이즈 애플리케이션 통합(EAI)와 엔터프라이즈 정보 통합(EII)을 많은 기업 프로젝트의 중심 포인트로 만들었다. 오늘날 이러한 활동들은 엔터프라이즈 IT 예산의 상당 부분을 소비하게 될 것이다.
이러한 통합 이니셔티브가 이렇게 비싸고, 복잡하며, 노동 집약적인 한 가지 주요한 이유는 함께 작동하도록 전혀 디자인 되지 않았던 애플리케이션들에서 데이터와 프로세싱을 한꺼번에 가져오려고 시도하기 때문이다. 기존 애플리케이션에서 데이터와 프로세스를 맞추느라 많은 시간이 소모된다.
애플리케이션에서 프로세스와 서비스로
Grady Booch는 2004년 InfoWorld 잡지 인터뷰에서 다음과 같이 말했다. "좋은 추상화, 영역의 분리 같은 엔지니어링 근간은 스타일을 벗어나지 않는다. 추상화 레벨을 다시 높일 수 있는 기회가 있다." (참고자료 [7]).
SOA는 두 개의 고급 추상화를 도입했다. 그것은 엔터프라이즈 비즈니스 서비스와 비즈니스 프로세스이다. 엔터프라이즈 비즈니스 서비스는 기본의 IT 기능들을 나타낸다. (엔터프라이즈의 비즈니스 기능들과 제휴된다.) 비즈니스 서비스들을 조합하는 비즈니스 프로세스들은 비즈니스의 전체 기능을 정의한다.
SOA의 목표는 애플리케이션들을 줄이고 소프트웨어 시스템들을 인터랙팅 서비스들로서 만들어서 비즈니스 프로세스에 의해 조정될 수 있게 하는 것이다. 모든 서비스들은 특정 비즈니스 기능들을 구현하는데, 이들은 엔터프라이즈 정황 속에서 정의되고, 비즈니스 프로세스는 비즈니스 솔루션을 나타낸다.
표 1은 Jean-Jacques Dubray에 기반한 것으로서 애플리케이션 중심 방식과 SOA 방식간 차이점을 보여주고 있다.
표 1. 애플리케이션 중심 대 SOA 구현
| 특징 |
애플리케이션 중심 아키텍처 |
SOA |
| 디자인과 구현 |
|
|
| 결과 시스템 |
- 애플리케이션 사일로
- 강결합
- 객체 지향 인터랙션
|
- 엔터프라이즈 솔루션
- 약결합
- 메시지 중심 인터랙션
| SOA와 디컴포지션
엔터프라이즈 비즈니스 서비스들은 엔터프라이즈 IT 시스템의 디컴포지션의 결과로서 정의된다. 디컴포지션(Decomposition)은 1950년대 후반의 시스템 이론에서 정의된 기술이다. 시스템 이론에서는 시스템이 복잡해 질수록 무엇이 포함되어 있는지 모르기 때문에, 이를 자동화 하기 더 어렵다고 언급하고 있다. 이 이론은 복잡한 시스템들을 더욱 작고, 관리 가능한 것으로 분해하여 쉽게 컨트롤 할 수 있도록 하며 전체 시스템을 부분으로서 취급하는 것이다. 같은 이론이 복잡한 소프트웨어 개발 이니셔티브에 적용된다.
소프트웨어의 디컴포지션의 진화
1960년대 초에 도입된 최초의 소프트웨어 디컴포지션 방식은 메인프레임 애플리케이션들을 개별 프로그램에 의해 구현된 개별 작업들로 나누는 것이었다. 나중에, 프로그램 내부 구조에 대한 통찰력이 생기면서, 각 프로그램은 그 기능에 따라 모듈이나 서브루틴들로 나뉘어졌다.
1970년대 Simula와 Smalltalk에 의해서 도입되었던 객체 지향(OO) 패러다임은 객체(objects) 또는 코드의 모듈을 도입함으로써 디컴포지션 채택을 강화했다. 기본 개념은 소프트웨어에, 고객, 주문, 트레이드 같은 문제 영역들을 나타내는 것이다. 하지만, 객체들에서 제공되는 추상화는 너무 세분화 되었고 비즈니스 레벨의 의미를 지닌 기술적인 개념들로 중복된다.
여러 가지 이유들로, 많은 객체 지향 개발자들은 컬렉션, 그래픽 위젯 같은 기술적 구성체들을 다루느라 대부분의 시간을 보낸다. 대부분의 경우, 문제 영역의 객체들은 영역 전문가에 의해서 인식될 수 있는 것을 더 이상 나타내지 않는 무형의 모듈 안으로 사라졌다. OO의 또 다른 문제는 디자인과 구현 동안 디컴포지션 방식에서 객체들이 중요하지만, 전개 또는 런타임 시 보이지 않기 때문에 결과적으로 전개 또는 런타임 디컴포지션을 직접 지원할 수 없다는 점이다.
더 나은 디자인 패러다임을 찾는 과정에서 디컴포지션에 대한 다양한 방식들이 1990년대 후반에 도입되었다. 바로 컴포넌트(components)였다. 추상화 레벨을 높이고, 세분성을 늘리며, 비즈니스 생성물들과의 긴밀한 연결을 통해서 OO의 문제들을 해결하고자 하였다.
소프트웨어 컴포넌트의 도입은 유연하고, 더욱 잘 구조화 된, 보다 관리 가능한 소프트웨어 애플리케이션을 가능케 했다. 하지만, 이것 역시 주요한 엔터프라이즈 IT 문제를 풀지 못했다. 바로 애플리케이션 중심이라는 문제를 풀지 못했다. 객체와 컴포넌트 모두 개별 애플리케이션에는 더 나은 디자인과 개발 방식을 제공한다. SOA는 디컴포지션을 고급 레벨로 끌어올린다. (그림 1) 개별 애플리케이션들을 변형하는 대신, 전체 엔터프라이즈 IT 기능을 변형한다.
그림 1. 디컴포지션 방식의 진화
SOA의 엘리먼트
비즈니스의 의미를 비즈니스 서비스와 비즈니스 프로세스로 규정함으로써, SOA 아키텍처 스타일은 비즈니스와 기술의 제휴를 도모한다. 사실, 서비스와 프로세스 모두 엔터프라이즈 비즈니스 아키텍처로 거슬러 올라갈 수 있다.
엔터프라이즈 SOA는 기업의 비즈니스 프로세스와 목표를 수행하는 비즈니스와 제휴된 IT 서비스들(여러 비즈니스 라인 또는 엔터프라이즈 밖에서도 참여할 수 있음)을 정의하고 있다. 이러한 서비스들은 엔터프라이즈 비즈니스 솔루션들로 구성될 수 있고 표준 프로토콜을 통해 호출된다. 그림 2는 엔터프라이즈 SOA의 핵심 엘리먼트들이다. (참고자료 [13]).
그림 2. 엔터프라이즈 SOA 개념
- Organization
- 모든 SOA 관련 구성물들(모델, 서비스, 프로세스, 리소스)을 소유하고, 이들의 생성, 사용, 액세스, 유지 등을 관리한다. 이러한 구성물들의 역할은 조직과 이 조직의 비즈니스 목표를 지원하는 것이다.
- Business model
- 엔터프라이즈의 운영 및 전략적인 비즈니스 목표를 달성하는데 필요한 비즈니스 리소스와 프로세스를 표현한다.
비즈니스 모델은 서비스와 비즈니스 목표와 요구 사항들을 성공적으로 제휴시키고, 결국 전체적인 SOA 구현을 성공하는데 있어서 중요하다.
- Semantic data model
- 엔터프라이즈에 대한 표준 비즈니스 데이터 객체들(고객, 계약)을 정의한다. 이러한 객체들은 엔터프라이즈의 기능을 기술하는 일반적인 개념과 콘텐트를 정의함으로써 엔터프라이즈 데이터의 온톨로지를 효과적으로 만든다.
비즈니스 서비스 인터페이스들을 정의하기 위해 데이터 모델을 사용하면 상호 운용 가능한 시맨틱 서비스 인터페이스 정의를 만들 수 있다. 바로 시맨틱 SOA(semantic SOA)가 만들어지는 것이다.
- Services
- 특정 엔터프라이즈 비즈니스 기능을 구현하고, 이것의 데이터와 리소스에 액세스 한다. 잘 정의된 서비스와 비즈니스와 제휴된 서비스들은 유연하고 확장성 있는 엔터프라이즈 SOA 구현의 핵심 요소들이다.
서비스들의 구조에서 서비스들은 독립적으로 개발 및 전개된다. 서비스들을 비즈니스와 시맨틱 모델들과 올바르게 정의 및 제휴하면 "plug-and-play" 구현이 되며, 다른 엔터프라이즈 비즈니스 프로세스와 솔루션과 효과적으로 결합될 수 있다.
- Business processes
- 비즈니스 서비스들의 실행을 조정하여 비즈니스 모델에 지정된 대로 엔터프라이즈 기능들을 구현한다. (오더 프로세싱 또는 클레임 프로세싱)
비즈니스 프로세스들은 핵심 퍼포먼스 지수(KPI)의 형태로 보험 클레임 프로세싱 또는 엔지니어링 개발 프로세싱 같은, 운영 목적과 비즈니스 목표와 제휴된다. 프로세스 구현의 일부로서 수집된 KPI는 엔터프라이즈 기능들의 효과를 평가하는데 사용된다.
- Information
- 기업의 데이터 리소스들을 나타낸다. 데이터는 다른 스토어, 애플리케이션 포맷에 존재한다. 다양한 레벨의 데이터들은 다양한 레벨의 SOA 구성체에 의해 사용된다. 시맨틱 데이터 모델은 비즈니스 프로세스와 서비스에 대한 데이터를 정의한다. SOA는 원시 운영 포맷에서 비즈니스 서비스에 필요한 시맨틱 데이터로 데이터를 변형하는 메커니즘을 정의한다.
- Documents
- 엔터프라이즈의 의무와 파트너의 의무를 정의하는 법적 엔터티들(금융 문서, 보험 정책과 클레임, 정부 규제)을 나타낸다. 문서들은 현대적인 엔터프라이즈의 핵심적인 부분이고, SOA에 포함되어야 한다.
무엇이 SOA를 차별화 시키는가?
SOA를 새로운 형태의 분산 시스템 아키텍처로, 객체 지향의 확장으로, 차세대 EAI로 나타내려는 여러 가지 시도가 있었다. 이 부분에 대해 자세히 살펴보도록 하자.
SOA와 분산 시스템
W3C Architecture 그룹(참고자료 [9])는 SOA를 분산 시스템 아키텍처 형태로서 정의한다. 이는 표 2에서처럼 속성에 따라 분리된다.
표 2. 분산 시스템 아키텍처 속성들
| 속성 |
설명 |
| 논리적 뷰 |
서비스는 비즈니스 레벨의 연산을 수행하는 실제 프로그램, 데이터베이스, 비즈니스 프로세스에 대한 추상화된, 논리적 뷰이다. 서비스는 비즈니스 액션으로 정의된다. |
| 메시지 중심 |
서비스는 공급자와 소비자의 속성이 아닌, 공급자와 소비자간 교환되는 메시지의 관점에서 정의된다. 구현의 내부 구조는 정교하게 추상화 되어 있다. 서비스 인터페이스는 서비스 구현과 구별된다. |
| 디스크립션 지향성 |
서비스는 머신이 처리할 수 있는 메타데이터/서비스 정의에 의해 기술된다. |
| 세분성 |
서비스는 비교적 크고 복잡한 메시지들(페이로드)을 가진 소수의 연산들을 사용하려는 경향이 있다. |
| 네트워크 지향 |
서비스들은 절대적인 필요가 아니더라도 네트워크를 사용하려는 경향을 보인다. |
| 플랫폼 중립성 |
메시지들은 인터페이스를 통해서 플랫폼 중립적인, 표준화된 포맷으로 전달된다. XML은 이러한 필요에 가장 알맞다. | 그림 3에서처럼, W3C에 의해 개발된 SOA 모델은 호출 메시지, 구현, 소유 구조, 서비스를 기술하는 메타데이터의 관점에서 정의될 수 있다.
그림 3. W3C의 SOA 모델
- 메시지 중심 모델은 콘텐트(헤더와 바디), 전달, 기원 및 실행 에이전트의 관점에서 메시지를 정의한다.
- 리소스 모델은 URI, 표현, 소유 구조의 관점에서 리소스 또는 구현을 정의한다.
- 정책 모델(policy model)은 주제(리소스와 액션)와 조직의 관점에서 정책을 정의한다. 정책은 보안 정책처럼 허용 가능한 액션이나 상태에 대한 제약 조건이다.
SOA가 메시지 및 네트워크 중심의 분산 시스템 아키텍처이지만, 그 이상의 의미를 지니고 있다. SOA를 분산 시스템과 동일시 한다면 그것은 서비스 통신의 기술적인 측면과 구현 측면에만 초점을 맞춘 것이다. 여기에는 핵심적인 가치, 즉 비즈니스-IT 제휴가 빠져있다.
SOA와 객체 지향
어떤 사람들은 SOA를 OO의 진화로 간주하면서, 서비스들을 객체 또는 컴포넌트로 간주한다. (참고자료 [10]) 이는 현실과 너무 동떨어진 이야기이다. 이러한 유사성은 시스템 디컴포지션 이상으로 확장되지 않는다.
상속과 다형성 같은 객체들의 추가 기능들은 SOA에는 적용되지 않는다. 이 두 가지를 분리하는 것은 사용법과 프로그래밍 모델이다. (인스턴스 기반 협업과 서비스 기반 협업간 차이와 비슷하다. 참고자료 [11])
- OO에서는, (동시에 존재하는) 같은 유형을 지닌 다중의 객체 인스턴스들은 내부 상태에 기반하여 구별되면서, 특정 실행 콘텍스트를 나타낸다. 결과적으로, 객체의 라이프 사이클은 객체 생성을 통해 소비자에 의해서 명확하게 제어된다.
모든 객체는 여러 메소드들을 노출하는데, 이들은 특정 인스턴스(실행 콘텍스트)에 속해있고, 주어진 인스턴스에 대해 변수를 조작할 수 있다.
- SOA에서, 서비스들은 특정 소비자의 실행 정황을 지원하는 것이 아니라, 특정 서비스들과 제휴된 엔터프라이즈 리소스의 상태를 지원한다. 전형적인 서비스 호출은 stateless이다. 예외는 대화형 합성 서비스로서, 일반적으로 실행 콘텍스트를 갖고 있으며 특정 대화를 지원한다.
결과적으로, 서비스 라이프 사이클은 특정 소비자의 라이프사이클과 제휴되지 않기 때문에, 특정 소비자가 이를 호출하는지의 여부와 상관 없이 존재한다. 결과 프로그래밍 모델은 서비스에 대한 호출이라 할 수 있다.
 |
실행 상태와 호출 상태
아래 두 가지 상태들에는 큰 차이가 있다.
실행 상태(Execution state)는 실행 동안의 서비스 상태를 나타낸다. 내부 변수들이 언제나 포함되어 있으며, 서비스 실행 동안에 생성된다. 어떤 서비스 실행이 완료되었는지를 지속적으로 추적하면서, 부분적인 서비스 실행 결과와 서비스 구현의 여러 컴포넌트들 간 전달된 매개변수들을 저장한다. 이 상태는 일반적으로 서비스 구현으로 캡슐화 되며, 서비스 소비자에게는 보이지 않는다.
호출 상태(Invocation state)는 특정 대화에서 서비스 소비자와 서비스 구현 간 공유 정황이다. 소비자는 같은 서비스의 다른 메소드들을 호출하면서, 특정 메소드 호출 동안 서비스로 전달되었던 정보를 모든 연속적인 호출 동안에 서비스에 사용할 수 있다고 간주한다.
이 경우, 서비스는 다른 소비자들과의 다중 대화에 참여하고, 각 대화를 개별적으로 추적한다. 세션 변수 또는 Java™ 2 Platform, Enterprise Edition (J2EE)의 세션 빈에서 호출 상태가 사용된다. 이러한 유형의 상태를 대화 상태(conversation state)라고도 한다.
(주: 서비스의 stateful 호출과 stateless 호출에 대해서 주목하기 바란다.)
| | 이러한 차이가 객체와 서비스에 대한 인터페이스 정의에 큰 영향을 미친다. OO에서, 인터페이스에 정의된 다중 메소드들은 같은 실행 콘텍스트에 속해있기 때문에 같은 객체의 인스턴스에 물리적으로 속해있다. 이와 반대로, 서비스들은 실행 콘텍스트가 없기 때문에, 서비스 인터페이스에서의 메소드 제휴는 전적으로 논리적이다.
서비스(그리고 서비스 인터페이스)는 서비스 메소드들의 논리적 그룹핑을 제공하는데, 이들은 고유의 서비스 품질 요구 사항, 보안, 버전관리((versioning) 전략, 엔드포인트 주소를 갖춘 독립 엔터티들이다. 프로그래밍 언어와 비슷한 점을 찾자면, 모든 서비스 메소드들은 FORTRAN 서브루틴/함수와 비슷한데, 이들은 다른 것들과 독립적으로 존재 및 실행된다.
SOA와 EAI
전통적인 EAI 구현들은 전형적으로 EAI 벤더들의 상용 솔루션에 기반하고 있기 때문에 벤더의 플랫폼에 고정된다. 많은 사람들은 SOA를 차세대 EAI 기술로 선보이고 있다. 예를 들어, Gartner Group은 Service-Oriented Integration (SOI)이라는 용어를 사용했고, EbizQ는 최근에 SOA를 자신들의 애플리케이션 통합 로드맵에 포함시켰다.
전송 솔루션을 제공하는 기술로서 웹 서비스의 진보와 아울러, 이들은 표준 기반의 통합 솔루션으로 간주되고 있다. 때문에 EAI 구현에 대한 매우 매력적인(벤더 독립적인) 대안으로 보여진다. Enterprise Service Bus (ESB) 제품들의 도입으로 웹 서비스 기반, 표준 기반의 통합 솔루션이 보다 더욱 대중성을 띄게 되었다.
EAI와 SOA의 목표가 기존 애플리케이션 포트폴리오를 사용하여 엔터프라이즈 비즈니스 프로세스를 지원한다는 것에는 비슷하지만, 매우 다른 방식으로 이를 실현해 가고 있다. EAI는 통합 서비스(참고자료 [12])를 통해서 애플리케이션의 기능들을 노출하는데 초점을 맞추고, 기존 애플리케이션 포트폴리오를 엔터프라이즈 비즈니스 모델로서 효과적으로 노출한다. 반대로, SOA는 기존 애플리케이션들은 숨기고, 대신 애플리케이션 독립적인 비즈니스 서비스들을 노출하는데 초점을 맞추며, 기존 애플리케이션 포트폴리오에 엔터프라이즈 비즈니스 모델을 투영하고 있다.
서비스
SOA에 도입된 기본적인 추상화 중 하나가 서비스(service)이다. SOA 구현은 일반적으로 다음과 같은 세 가지 유형의 서비스들을 포괄하고 있다. (참고자료 [12]):
- 비즈니스 서비스(비즈니스와 제휴된 IT 구성물들을 나타낸다.)
- 통합 서비스(SOA 기술, 특히 웹 서비스를 통한 통합 구현)
- 인프라스트럭처 서비스(인프라스트럭처 지원에 초점을 맞춘 일반 IT 구성물들을 나타낸다.)
이 글에서 말하는 "서비스(service)"는 비즈니스 서비스를 의미한다.
간단하게 서비스는 독립적이라고(self-contained)으로 말할 수 있다. 독립적으로 개발, 전개, 관리되며, 엔터프라이즈와 관련된 특정 기능들을 지원하고, 디자인 측면에서는 통합도 가능하다. 서비스 기능은 서비스 인터페이스에 의해서 정의되는데, 이는 다중 구현에 의해 지원을 받는다. 서비스는 프로그래밍 구성물 또는 API가 아니라, 엔터프라이즈 솔루션 구현에 사용되는 아키텍처 구성물(디자인 단위, 구현 단위, 관리 단위)이다.
서비스 구현 범위
서비스 구현 영역은 서비스 디자이너(비즈니스 제휴와 기존 IT 기능들의 재사용)부터 서비스 소비자(서비스 콘트랙트, 서비스 인터페이스, 액세스 정책)까지 포괄한다. 그림 4는 이러한 엘리먼트들과 이들의 관계이다.
그림 4. 서비스 구현 영역
- 서비스 비즈니스 기능(Service business functionality)
- 엔터프라이즈 비즈니스 모델에 의해 정의되며, 엔터프라이즈 비즈니스 목표에 맞춰 구현된다.
- 서비스 콘트랙트(Service contract)
- 서비스, 인터페이스, 한 개 이상의 서비스 엔드포인트 어드레스의 비즈니스 기능을 정의한다.
- 서비스 인터페이스(Service interface)
- 잠재적인 소비자에게 제공될 서비스 기능들을 기술한다. 인터페이스는 서비스 이름과 서비스에 의해서 지원되는 연산(메소드) 이름으로서 정의된다. 모든 연산의 디스크립션에는 연산 호출(요청)에 필요한 매개변수에 대한 정의와 연산에 의해 리턴된 결과(응답)이 포함된다. 이 디스크립션은 연산의 기능과 사전 및 사후 조건들이 포함된다.
- 서비스 메소드(Service method)
- 네트워크 위치로 정의된 엔드포인트 어드레스를 통해 액세스 될 수 있다. 모든 엔드포인트 어드레스는 액세스 정책에 의해서 관리된다. 이러한 정책들은 데이터 전송에 사용되는 통신 프로토콜, 실제 서비스 호출, QOS(엔드포인트 어드레스에 필요한 보안 및 프라이버시)를 정의한다.
- 세분성과 약결합
- 중요한 서비스 디자인 애트리뷰트를 나타낸다.
- 서비스 구현
- 기존 엔터프라이즈 IT 기능들을 재사용 할 수 있도록 한다.
- 서비스 오케스트레이션(Service orchestration)
- 서비스들을 더 큰 서비스로 합성하고, 서비스에서 엔터프라이즈 솔루션을 구현하는 메커니즘을 나타낸다.
다음 섹션에서는 주요한 서비스 구현 영역에 대해 알아보기로 하겠다.
비즈니스 제휴 SOA의 주된 공약들 중 하나는 비즈니스-IT 제휴이다. 이 약속은 서비스가 엔터프라이즈의 비즈니스 모델과 제휴될 경우에만 수행될 수 있다. 엔터프라이즈 비즈니스 모델은 성공적인 SOA 구현의 전제 조건이란 의미이다. 서비스의 방향, 파티셔닝, 분류법을 설정할 수 있는 고급 모델이 있어야 한다. 시간이 흐르면서 서비스의 개발과 동시에, 상세한 부분들이 개발될 수 있어야 한다. (참고자료 [12].)
엔터프라이즈 비즈니스 서비스의 정의에 대한 접근 방식은 비즈니스, 조직, 애플리케이션(서비스) 아키텍처의 제휴에도 적용된다. (참고자료 [8]과 [14]) 이렇게 되면 비즈니스 아키텍처에서 소프트웨어 구현을 트레이스 하기 더욱 쉬워지며, 소프트웨어 애플리케이션들은 비즈니스 분석가들도 이해하기 쉽고 비즈니스 기능에 대한 변경 구현이 단순해진다.
서비스 세분성 CORBA 와 DCOM 같은 전통적인 분산 시스템 기술은 로컬 및 원격 투명성이 있다. 이들은 대상의 위치와 관계없이 같은 프로그래밍 모델을 나타낸다. 이 같은 일관성은 프로그래밍 모델을 단순화 하고, 바운더리를 정의하는데 많은 시간을 보내는 시스템 디자이너와 개발자들의 수고를 덜어준다. 개발의 단순함과 실행 속도간 모순은 분산 객체들을 이용하여 구현된 많은 애플리케이션들이 빈약한 성능을 보이는 이유가 된다. 이는 분산 객체 기술이 아닌 시스템 바운더리를 통해 세분화된 객체 인터랙션의 문제이다. (참고자료 [15]).
SOA에서, 모든 서비스 호출은 원격이다. 인트라 서비스(서비스 내부)와 인터 서비스(서비스 바운더리) 호출은 큰 차이가 있다. 이러한 차이 때문에 서비스 호출은 어렵다. 결국, 세분성은 서비스 디자인의 중요한 특성이 된다.
 |
| 실제로, 서비스들이 다중 Enterprise JavaBeans (EJB) 컴포넌트로서 구현될 때, 인트라 서비스 호출은 원격이 될 수도 있다. | | 서비스 호출에는 네트워크가 개입되기 때문에, 대단위(coarse grained)로 설계된다. 서비스 메소드 실행은 네트워크 요청의 레이턴스 비용까지 감안한 가치를 전달해야 한다. 결국, 노출된 서비스 인터페이스는 대단위가 되어야 한다. 한정된 기능들을 제공하는 많은 인터페이스들을 노출하기 보다는, 개별 요청들이 완전한 비즈니스 기능을 수행할 수 있도록 하는 작은 인터페이스들을 노출해야 한다.
올바른 서비스 세분성은 더 나은 성능을 보이는 시스템을 만들 수 있을 뿐만 아니라, 커플링(coupling)도 낮춘다. 대단위 서비스들은 독립성을 띄고, 다른 서비스들에 대한 의존성이 적다.
커플링(Coupling) 유연한 엔터프라이즈 솔루션을 구현, 관리, 수정하고 엔터프라이즈에 연합 개발 방식을 지원하고 싶다면, 서비스들의 약결합(loose coupling)이 전제되어야 한다. 다음은 커플링의 결과이다. (참고자료 [16]).
- 강결합(Tighter coupling) 방식은 시간이 지날수록 비용이 많이 든다.
- 변경을 위해 여러 조직들을 동기화 한다.
- 다른 것들에 영향을 주지 않고 업데이트 된 컴포넌트를 채택 및 재전개 한다.
- 변경하기가 어렵거나 비용이 들고, 또는 변경 자체가 불가능하다.
- 솔루션의 다른 부분들을 개별적으로 관리하기 어렵다.
- 이동, 스케일링, 분산, 재배치가 어렵다.
- 커플링이 많이 개입될수록 테스팅은 더욱 비용이 많이 든다.
- 약결합은 더 많은 투자가 필요하다.
- 더욱 많은 디자인 작업이 필요하다.
- 더욱 많은 구현 작업이 필요하다.
SOA 구현에 있어서 가장 중요한 커플링은 다음과 같다.
- 기능적 커플링(Functional coupling)
- 인터페이스 기반 디자인이 새로운 것은 아니지만, SOA는 (서비스) 인터페이스를 엔터프라이즈 중심의 의미(semantic)에 기반하고 있다. 서비스 상호 운용성에 있어서 엔터프라이즈 중심 의미론의 중요성은 초기 SOA 채택자들은 간과했다. 웹 서비스 커뮤니티는 잘 정의된 콘텐트와 SOAP 메시지 구조가 XML로 표현된 페이로드와 전송의 표준화와 결합하여 웹 서비스 통신의 상호운용성을 보장해주기를 바랬다. 현실적으로, 이것은 기술적인 상호운용성만 제공하고, 한 시스템에서 오는 SOAP 메시지가 수신되고 다른 시스템에 의해서 성공적으로 처리될 수 있다. 하지만, 시맨틱 상호 운용성에는 도움이 되지 않았다. 두 개의 시스템들이 서로를 "이해해야 하기 때문이다."
이 같은 차이점은 어디에서나 발견할 수 있다. 예를 들어, 많은 언어들이 Roman을 사용하기 때문에 이러한 알파벳을 공유하는 다른 언어들로 이야기하는 사람들이 서로를 이해한다는 것을 의미하지 않는다. 알파벳에 대한 순수한 지식으로는 언어를 이해하기에는 부족하다.
서비스 인터페이스 정의에 대한 엔터프라이즈 시맨틱 데이터 모델의 사용은 상호운용 가능한 시맨틱 인터페이스 정의를 이끌었다. (참고자료 [13]) 이러한 시맨틱 SOA는 서비스들 간 매우 향상된 상호운용성을 제공한다. 이들 모두가 인터페이스 레벨에서 같은 모델로 작업한다.
시맨틱 메시지를 도입하려면, 서비스 구현이 두 개의 완전히 다르지만 똑같이 중요한 데이터 모델을 지원해야 한다. (참고자료 [17]).
- 내부 데이터 모델: 서비스 구현에 의해 사용된다. 이 모델은 서비스의 내부 구현과 관련되기 때문에 기반 서비스와 컴포넌트에 고유한 것이 된다. 내부 데이터 모델은 서비스 소비자에게는 노출되지 않는다.
- 외부 데이터 모델: 서비스간 교환에 사용되고, 엔터프라이즈 시맨틱 데이터 모델이다.
각 서비스는 엔터프라이즈와 내부 데이터모델들 간 시맨틱 중재 및 변형을 책임지고 있다.
- 일시적 커플링(Temporal coupling)
- 서비스들, 특히 웹 서비스는 동기식 서비스 호출에 초점을 맞추는 경향이 있다. 현재 구현의 단점은 SOA 그 자체의 단점으로 간주된다. 따라서, 이벤트 중심 아키텍처(EDA)와 SOA-2를 SOA 문제를 해결하는 수단으로 간주하고 있다. 내 생각으로는 픽스가 필요한 것은 SOA가 아니라 현재의 사용법인 것 같다.
서비스 호출에 대한 동기식 통신은 서비스 소비자와 공급자 간 일시적 강결합을 만들어낸다.
- 서비스 공급자는 서비스 소비자가 액세스 할 수 있도록 실행시켜야 한다.
- 동기식 호출은 블로킹 호출이기 때문에, 서비스 실행이나 요청/응답 딜리버리에서의 성능 변화는 서비스 소비자 실행에 중요한 영향을 미친다.
개별 응답 호출을 가진 비동기식 서비스 호출은 소비자가 계속해서 실행하면서, 공급자는 응답할 기회가 주어진다. 이로써 임시적으로 디커플링(decoupled)된 시스템이 만들어진다. 일시적 서비스 공급자 중지 및 네트워크 딜레이는 이 경우 영향력이 적다. 서비스 공급자가 응답만 리턴한다면 전체 시스템은 올바르게 작동한다.
서비스는 전체 소프트웨어 시스템에 대단위 싱글톤을 나타내는데, 이 경우 서비스의 확장성과 고가용성이 매우 중요한 문제이다. 더 나은 확장성과 가용성을 보이는 비동기식 호출이 SOA 구현에는 더 알맞다.
- 트랜잭션 커플링(Transactional coupling)
- 트랜잭션, 특히 Atomicity(원자성), Consistency(일관성), Isolation(고립), Durability(내구성)(ACID)는 분산 컴퓨팅의 신뢰성 문제들을 해결하는 방식이다. 금융 애플리케이션들은 자금 이체 프로세스에 이것을 사용하고, 전자 상거래 시스템은 결제 프로세싱에 사용하며, 제조 애플리케이션은 재고 컨트롤에 사용하고, 통신 요금 시스템들은 통화 요금에 이것을 사용한다.
ACID 트랜잭션은 트랜잭션 모니터(Tuxedo, CICS, Encina) 또는 J2EE 애플리케이션 서버 또는 MTS 같은 컴포넌트 플랫폼을 사용하여 구현된다. ACID 트랜잭션 지원에는 트랜잭션 환경을 통한 커플링이 필요하기 때문에 상호운용성과 유연성에 제한이 생긴다.
ACID 트랜잭션 구현의 또 다른 요구 사항은 트랜잭션 동안의 리소스 잠금이다. 서비스들을 짧은 시간 동안 실행해야 한다. 오랜 트랜잭션 시간은 트랜잭션 리소스들의 처리량을 감소시킨다.
ACID 트랜잭션은 객체와 컴포넌트에는 완벽하게 맞지만 서비스들에는 제한이 많다. SOA는 트랜잭션 two-phase commit 프로토콜을 통한 비즈니스 트랜잭션을 선호한다. ( 참고자료 [18]과 [19]).
비즈니스 프로세스
비즈니스 서비스들은 완전한 비즈니스 서비스들로 구성되지 않는다. 일반적으로 구현 블록으로서 작동한다. 완전한 솔루션의 구현은 합성, 오케스트레이션, 서비스 참여를 통해 구현된다. 합성(composition)은 비즈니스 프로세스를 사용하여 수행된다.
비즈니스 프로세스와 프로세스 중심 컴퓨팅은 새로운 것이 아니다. 20년 넘게 IT에서 사용되었으며, 오피스 자동화와 워크플로우 시스템으로 시작했다. 효율성과 경쟁력을 높이고자 하는 기업들은 컴퓨터 기반의 자동화와 지원으로 전향해야 한다. 기록 시스템에서 프로세스 시스템으로 시각을 바꾸어야 한다. "프로세스 처리(Process processing)"는 "데이터 처리"를 대체해야 한다.
BPM의 중심에는 오케스트레이션의 개념이 있고, 여기에서 프로세스 엔진은 여러 수동 및 자동 프로세스 단계들을 조합하면서, 인풋/아웃풋 데이터를 조작한다. SOA는 BPM을 보다 현실적으로 실현한다. (참고자료 [20]) SOA의 비즈니스 프로세스는 단순한 자동화에서 유연성 관리(managed flexibility)로 새로운 차원의 비즈니스 프로세스를 이끌었다.
SOA의 목표는 기업의 컴퓨팅 자산들을 재사용 가능한 비즈니스 서비스들로 노출하면서, 비즈니스 프로세스를 사용하여 보다 신속하게 재사용 및 통합될 수 있는 기본적인 비즈니스 기능들을 구현하는 것이다. 기존 서비스들을 사용하여 빠르게 솔루션을 조합할 수 있는 기능은 SOA의 가장 큰 장점 중 하나이다. 비즈니스 서비스와 비즈니스 프로세스들 간 관계는 그림 5를 참조하라.
- 비즈니스 서비스는 안정적인 비즈니스 구성물들을 지원하면서, 프로세싱과 규칙들을 통합한다. (서비스 구현은 시간이 흐르면서 변한다.)
- 비즈니스 프로세스는 매우 유동적인 비즈니스 절차와 규칙을 지원하는데, 몇 달, 몇 주마다 변할 수 있다.
- 비즈니스 프로세스와 비즈니스 서비스들간 인터랙션은 엔터프라이즈 시맨틱에 기반하고 있고, 서비스의 변화가 비즈니스 프로세스에 미치는 영향을 최소화 하며 비즈니스 서비스에서 프로세스를 구현하는 과정을 단순화 한다.
그림 5. SOA에서 서비스와 프로세스 간 관계
이 같은 책임의 분리는 비즈니스 분석가와 IT 아키텍트가 비즈니스 프로세스를 통해서 비즈니스 서비스로 캡슐화 된 IT 기능들을 재사용 하면서, 이러한 서비스들을 조합할 수 있도록 해준다. 이는 새로운 프로세스의 생성을 단순화 하고 기존 프로세스를 최적화 한다. 이러한 프로세스들이 설계되면 시장 조건에 따라서 빠르게 변형될 수 있다. 이 모든 것이 비용을 늘리지 않고도 비즈니스 유연성과 경쟁력을 높일 수 있다.
SOA와 패턴
특정 아키텍처 스타일을 설명 및 구현하는 방법 중 하나가 패턴을 사용하는 것이다.
"패턴과 패턴언어는 베스트 프랙티스를 기술하는 방식이고, 입증된 디자인이며, 다른 사람들이 이러한 경험에서 배울 수 있도록 과거 경험들을 포착하는 것이다. 패턴들은 디자인 가이드라인을 빠르게 이해할 수 있는 입증된 방식이며 다양한 콘텍스트이다. " --John Evdemon(참고자료 [23]) SOA용 패턴과 패턴 언어에 대한 많은 글들이 있다. (참고자료 [21-26]) 이들 모두 SOA 구현의 특정 측면에 초점을 맞추고 있다.
진정한 SOA 패턴 언어는 서비스의 디자인, 생성, 활용, 실행 등 전체적인 SOA 라이프 사이클에 대한 유기적인 접근 방식을 정의해야 한다. 그림 6은 이 같은 언어의 예이다.
그림 6. SOA용 패턴 언어
이와 같은 패턴 언어는 세 가지 주요 영역들을 다룬다. (일부 패턴들은 여러 영역들에 속할 수 있다.):
- 서비스 디자인
- 이 패턴은 가장 중요한 서비스 디자인 액티비티를 포함한다. 서비스 지향 디컴포지션 패턴은 시작 포인트를 제공하면서, 당면한 문제에 기반하여 서비스들을 정의하는 방식을 기술하면서 엔터프라이즈 비즈니스 모델과 필수적인 장기 아키텍처 품질을 포함시킨다.
서비스 콘트랙트 패턴은 서비스에 대한 공식 정의를 만들고, 서비스 디자이너가 구현에 가장 알맞은 서비스를 선택할 수 있도록 하고, 서비스 아키텍트와 개발자들이 이를 올바르게 호출할 수 있도록 한다.
서비스 리파지토리 패턴은 엔터프라이즈 내에서 서비스 관련 구성물들을 구성하는 솔루션들을 정의하면서, 서비스 정의, 생성, 사용에 개입된 관련 당사자들의 협업을 단순화 한다.
서비스 버전관리(versioning) 패턴은 서비스 콘트랙트와 구현에 있어서의 불가피한 변화들을 다루는 가이드라인을 제공하면서 이러한 변경 사항들이 서비스 소비자에게 미치는 영향을 줄일 수 있도록 한다.
- 서비스 구현
- 이 패턴들은 서비스 구현 액티비티와 관련된 문제들을 다룬다. 서비스 구현 레이어는 기존 엔터프라이즈 애플리케이션들의 포트폴리오가 엔터프라이즈 비즈니스 모델과 제휴된 서비스들을 구현하는 방식을 보여준다. 서비스 구현 컴포넌트 패턴들은 전형적인 서비스 구현과 인터랙션에 개입된 주요 컴포넌트들을 정의함으로써 이전의 패턴들을 보완한다.
합성 서비스 패턴은 서비스 소비자들이 요구하는 기능들을 지원하기 위해 기존 여러 서비스들의 기능들을 결합할 방식들을 연구한다.
- 서비스 인프라스트럭처
- 이 패턴은 서비스 런타임 인프라스트럭처에 있어서 몇 가지 중요한 문제들을 다룬다. 서비스 레지스트리 패턴은 중앙화된 레지스트리를 통해서 서비스 호출에 대한 후기 바인딩 구현에 초점을 맞추면서, 서비스의 전개와 런타임 기능에 대한 엔터프라이즈 중심의 제어 포인트에 적용한다.
서비스 보안은 특별한 패턴 언어로서(참고자료 [25]) 일련의 패턴들을 정의하고, 서비스 보안의 디자인과 구현을 관리한다.
서비스 로깅과 서비스 예외 관리 패턴들은 고도로 분산된 SOA 환경에서 중앙화된 로깅과 예외 관리용 방식을 정의한다.
서비스 모니터링과 관리 패턴은 서비스 실행을 감시하고 관리하는 방식에 초점을 맞춘다. 마지막으로, 엔터프라이즈 서비스 버스 패턴은 서비스 통신이 가상화에 집중하며, 이전에 언급한 인프라스트럭처 패턴을 더욱 쉽게 구현한다.
요약
이 글에서 SOA 아키텍처 스타일을 어떻게 만들 것인지에 대해 배웠다. 스타일과 인터랙션의 주요 엘리먼트에 대해서도 연구했다. 엔터프라이즈 아키텍처를 구현하는 다른 대중적인 방식들과도 비교해 보았다. 이러한 스타일의 구현을 이해하고 단순화 하는데 사용할 수 있는 패턴 언어도 설명했다.
다음 글에서는 패턴에 대해 보다 자세히 설명하겠다. 다음 글을 기대해주기 바란다.
|