IBM® WebSphere® Process Server (이후, Process Server)의 Business State Machine (BSM) 컴포넌트는 비즈니스 “명사”를 정의하고 이들을 처리하는 방식을 제공한다. 이러한 “명사(noun)”들에는 “주문” 또는 “여행”같이, 라이프 사이클을 통해서 작동을 관리하는 것들이 포함된다. 여행에서의 취소 연산은 여행이 끝나면 지원되지 않고, 예약이 된 여행과 그렇지 않은 여행 별로 다르게 처리되어야 한다. BSM은 이러한 “명사”들을 상태 머신으로서 개발, 디버그, 감시하는 방식을 제공한다.
BSM은 라이프 사이클을 가진 비즈니스 아이템들을 지원한다. 이들은 이벤트에 의해 움직이는 상태를 가진 아이템들이고, 일반적으로 루프(loop) 기반 로직을 갖고 있다. (이전 상태로 리턴된다.) 본 시리즈에는 벤딩 머신에 대해 설명할 것이다. 벤딩 머신의 전원이 켜지고, 돈을 투입하고, 상품을 내보내고, 잔돈을 반환한다. 머신이 중지될 때까지 이 루프가 계속 반복된다. 다른 루프도 있다. 예를 들어, 벤딩 머신은 상품을 내보내기 전에 고객이 충분한 돈을 넣었는지를 확인해야 한다. 더욱이, 잔돈을 고객에게 돌려줘야 한다.
상태 머신을 사용하여 이러한 유형의 애플리케이션들을 구현한다. 상태 머신은 상태들 간 트랜지션을 가진 상태들로 구성된다. 이러한 트랜지션들은 여러 가지 방법들로 발생한다. Process Server의 다른 컴포넌트와 마찬가지로, BSM은 Service Component Architecture (SCA) 컴포넌트이다. 이것의 인터페이스는 Web Services Definition Language (WSDL)을 사용하여 정의된다. WSDL은 사전에 정의되고, 개발되면서 BSM과 제휴될 수 있다. 그리고, WSDL에서 정의된 모든 작동들은 BSM에서 사용되어야 한다. BSM을 위해, WebSphere Integrated Developer (Integration Developer)는 BSM을 그래픽으로 개발할 수 있는 방식을 제공한다. 에디터의 구현은 상태 머신 모델링과 디자인의 Unified Modeling Language (UML) 정의에 기반하고 있다. 벤딩 머신을 구현 및 확장하면서, 에디터에서 이 상태 머신이 어떻게 나타나는지를 설명하겠다.
BSM 에디터는 State Adaptive Choreography Language (SACL, sachel로 발음함) 라고 하는 상태 머신의 XML 구현과 함께 작동한다. SACL 파일은 Business Process Choreography (BPC) BPEL 프로세스를 만드는데 사용된다. 이 프로세스는 상태 머신의 영속성을 관리하기 때문에 장기적으로 실행된다. 프로세스가 생성된다는 사실은 BSM의 개발, 디버그, 모니터링에 영향을 미치지 않는다. 하지만, BPC Explorer나 BPC Explorer runtime API를 통해서 BSM을 관리할 때, 핵심 기능과 상태 머신과의 인터랙션은 장기 실행 BPEL 프로세스에 의해 나타난다.
BSM이 BPEL 프로세스를 만들기 때문에, 비즈니스 애플리케이션을 디자인 할 때 사용할 수 있는 알맞은 방식이 궁금해졌을 것이다. 기껏해야, 이 프로세스는 “명사”인 상태 머신과 작동하는 “동사”로서 생각될 수 있다. 하지만, 상태 머신이 단순할 경우, 프로세스를 사용하는 것이 더 낫다. 예를 들어, (초기 상태로 리턴 되는) 루프가 없는 상태 머신은 프로세스로서 개발되는 것이 맞다. 하지만, 많은 루프가 있다면, 상태 머신은 개발, 디버그, 모니터에 훨씬 더 많은 방식을 제공한다.
벤딩 머신을 시작해 보자. BSM과 관련된 상태 머신 개념을 알아보고, Integration Developer에서 구현되는 방법을 살펴보자.
앞서 언급했지만, 이 시리즈에서는 벤딩 머신 예제를 다룰 것이다. 이 글에서는, 가장 기본적인 벤딩 머신을 구현할 것이다. 조건, 액션, 타임아웃, 합성 상태 같은 고급 개념들은 후속 글에서 다루도록 하겠다.
벤딩 머신의 가장 단순한 유스 케이스는 관리 인터페이스이다. 이 인터페이스는 벤딩 머신의 파워 온/오프를 제어한다. (그림 1)
그림 1. 상태 머신 파워 온/오프
이 상태 머신은 세 개의 상태와 두 개의 트랜지션을 갖고 있다.
-
InitialState1상태는 녹색 원 아이콘으로 되어있는 초기 상태이다. 여기에서 상태 머신이 시작되기 때문에, 모든 상태 머신은 정확히 한 개의 초기 상태를 가진다. -
FinalState1상태는 파란색 원 아이콘으로 되어 있는 최종 상태이다. 이 상태 머신은 최종 상태에 도달하면 종료된다. 여러 개의 최종 상태들이 있을 수 있지만, 최종 상태에 다다르면 상태 머신은 언제나 종료하기 때문에, BSM에 여러 최종 상태들을 정의한다고 해서 애플리케이션 기능이나 로직에 어떤 영향도 미치지 않는다. 멀티 최종 상태들은 다른 엔트리 액션들이 필요할 때 또는 상태 머신을 보다 가독성 있게 만들 때에만 사용된다. -
Running상태는 단순하다. 이 경우, Running 상태는powerOn연산을 통해 시작되고powerOff연산을 통해 종료된다. 나중에 보겠지만, 하나의 상태를 시작하고 종료하는 여러 연산들이 있다.
이 예제에서 트랜지션은 BSM과 제휴된 WSDL 인터페이스(또는 인터페이스들)에 있는 연산에 의해 발생한다.
인터페이스 에디터를 사용하여 연산을 정의할 수 있다. (인터페이스 에디터의) 인터페이스 예제는 그림 2에 나타나 있다.
그림 2. 벤딩 머신 인터페이스
두 연산들 모두 일방(one-way) 연산이다. 각각 벤딩 머신을 구분하는데 사용되는 하나의 매개변수(serialNumber)를 갖고 있다. 다시 말해서, 상태 머신이 영속적이기 때문에, 연산들이 상태 머신의 정확한 인스턴스에 적용되는지를 확인할 수 있어야 한다. 각 연산들은 상태 머신 인스턴스를 구분하는 고유의 정보를 전달해야 한다. 데이터베이스 관점에서 볼 때, 이는 BSM의 프라이머리 키이다. BSM은 BPEL과 같은 용어를 사용한다. 따라서 이를 코릴레이션 정보라고 한다.
코릴레이션 정보는 에디터에서 상태 머신의 백그라운드를 클릭하고, Properties 뷰 밑에 Correlation 탭을 선택하여 정의한다. (그림 3)
그림 3. Correlation 속성 탭
이 경우, 코릴레이션은 String 유형의 serialNumber 라고 하는 하나의 변수에 대해 수행된다. 벤딩 머신 코릴레이션 아이디에 대한 속성은 그림 4에 나와있다.
그림 4. 코릴레이션 속성 값 설정하기
코릴레이션 속성은 BSM의 인터페이스에 정의된 모든 연산에 할당되어서, 연산이 정확한 프로세스 인스턴스에 적용될 수 있도록 해야 한다. 이 값은 인커밍 매개변수의 어떤 부분에라도 할당될 수 있기 때문에, BSM의 경우, serialNumber가 correlation ID이지만, 다른 인커밍 매개변수는 이를 employee ID라고 할 수도 있다. (BPEL과 마찬가지로) BSM은 속성 앨리어스를 만드는 기능을 제공한다. 코릴레이션 값에 사용할 매개변수와 부분을 지정하면 된다. 우리 예제에서, 각 연산에 대한 앨리어스가 있고, 코릴레이션 serialNumber는 각 연산에 대해 serialNumber 매개변수에서 지정되어야 함을 명시했다. 이 예제는 매우 단순하지만, 다른 것은 매우 복잡할 수 있다. 코릴레이션 정보가 복잡한 부분들을 가진 메시지에서 올 경우 특히 그렇다.
다시 예제로 돌아와서, 두 개의 트랜지션들은 이들을 발생시키는 연산으로 구분된다. 기어 모양 아이콘은 에디터에서의 연산을 가리킨다. 따라서, powerOn 연산을 호출하면, BSM이 만들어지고 우리가 전달했던 serialNumber와 제휴된다. (serialNumber 코릴레이션 속성과 앨리어싱 되기 때문이다.) 상태 머신은 Running 상태에 있게 된다. 같은 시리얼 넘버로 powerOn 연산을 다시 호출하면 실패할 것이다. Running 상태는 powerOn과 제휴된 트랜지션이 없기 때문이다. 작동되는 유일한 연산은 powerOff 연산인데, 이는 Running에서 FinalState1로 트랜지션을 발생시킨다. 이 지점에서 BSM이 파괴된다. 시리얼 넘버가 재사용 될 수 있음을 의미한다. 잘못된 serialNumber로 powerOff를 호출하면 잘못된 BSM이 전원을 끄게 되고, 시리얼 넘버가 존재하지 않을 경우 실패한다.
초기 상태에서 발생하는 트랜지션은 유일한 것이다. 초기 상태에서 단 하나의 트랜지션이 있어야 하고, 이 트랜지션에 지정된 연산은 여기에 단 한번만 사용되어야 한다. 상태 머신에 대한 코릴레이션이 상태 머신 인스턴스가 만들어 질 때 설정되어야 하므로, 트랜지션은 연산을 가져야 한다.
우리가 켜고 끌 수 있는 벤딩 머신이 생겼다. 이 상태 머신은 실행될 것이고, BPC 익스플로러를 사용하여 이를 테스트 할 수 있다.
Integration Developer의 BPC Explorer 또는 외부 웹 브라우저를 통해서 BPC Explorer를 시작할 수 있다. Integration Developer 내에서 시작하려면(그림 5), Servers 뷰에서 서버를 오른쪽 클릭하고, Launch, 그 다음 BPC Explorer를 선택한다.
그림 5. Integration Developer에서 BPC Explorer 열기
서버가 시작되지 않았다면, 이 옵션은 회색이 된다. 웹 브라우저에서 BPC Explorer를 시작하려면 http://localhost:9080/bpc 주소를 사용한다. 여기에서 localhost와 9080은 각각 디폴트 호스트네임과 포트 값이다. 그림 6에 보이는 기본 페이지에서, 여러분에게 할당된 휴먼 태스크를 보여주는 스크린으로 갈 수 있다.
그림 6. BPC Explorer를 열 때 사용자를 기다리는 태스크 리스트
휴먼 태스크는 BSM을 위해 생성된 장기 실행 프로세스에서 구별되고, 이 글에서는 설명하지 않겠다. 벤딩 머신 BSM을 찾으려면, 왼쪽 상단 아이템인 My Process Templates를 클릭하라. (그림 7)
그림 7. 활성 상태 머신 인스턴스를 보여주는 프로세스 템플릿
템플릿이라는 용어는 장기 실행 프로세스 정의를 나타내는데 사용된다. 반면, 인스턴스는 현재 실행 중인 장기 실행 프로세스의 특정 인스턴스를 나타낸다. BSM의 경우, 이 프로세스 인스턴스는 초기 상태에서 연산이 호출될 때 만들어진다. 마찬가지로, 프로세스 인스턴스는 최종 상태에 도달하면 없어진다.
위 스크린에서, 우리 BSM에는 단 하나의 템플릿이 존재한다. 이 템플릿의 이름은 우리가 BSM에게 지었던 이름, VendingMachine과 매치된다. 우리 예제에는 BSM만 있지만, 이 뷰는 시스템 상의 모든 BPEL과 BSM 애플리케이션용 프로세스 템플릿 모두를 보여준다.
벤딩 머신의 인스턴스를 만들려면, VendingMachine 앞에 있는 체크 박스를 클릭하고, Start Instance 버튼을 클릭한다. (그림 8)
그림 8. BPC Explorer에서 상태 머신 인스턴스 만들기
이 스크린(그림 8)에서는 BSM을 만들 때 사용할 매개변수를 지정한다. Process Name은 BSM의 인스턴스와 제휴된 프로세스를 구분하는데 사용된다. serialNumber는 상태 머신을 만드는 powerOn 연산을 위한 매개변수이다. powerOn 연산에 대한 더 많은 매개변수들이 있다면, 그 역시 보일 것이다. 우리의 BSM 디자인을 상기해보면, serialNumber는 코릴레이션에 사용되기 때문에 유일해야 한다.
Submit을 클릭하면, BSM 인스턴스가 만들어지고, BPC Explorer는 My Process Templates 스크린을 자동으로 검색한다. 우리가 만들었던 상태 머신 인스턴스를 보는 여러 가지 방법들이 있다. 하나는 VendingMachine 앞에 있는 체크 박스를 클릭하고 Instances 버튼을 클릭하는 것이다. 이렇게 하면, 여러분이 만들었는지의 여부와 상관 없이, 템플릿의 모든 인스턴스들이 보인다. 다른 방법은, BPC Explorer의 왼쪽 검색 부분에서 Started By Me 옵션을 클릭하는 것이다. 이것은 템플릿으로 구현된 인스턴스를 보여준다. 우리 예제에서, 그림 9는 같은 하나의 인스턴스를 보여준다.
그림 9. 활성 벤딩 머신 프로세스 인스턴스
이 글에서, 우리는 BSM을 테스트 하는 것을 중점적으로 설명하기 때문에 이 스크린에서 수행되는 것을 자세하게는 설명하지 않을 것이다.
BPC Explorer에서 보이는 상태는 BSM 인스턴스의 상태와 아무런 관계가 없다. 이 상태는 인스턴스 자체와 관련이 있다. BSM의 경우, Terminate 버튼은 인스턴스를 즉시에 종료한다. 또 다른 버전의 BSM을 설치할 때 매우 유용하다. 서버가 개발 모드에 없다면, BPEL은 템플릿이 실행 인스턴스를 갖고 있을 때 대체될 수 없도록 한다. 실행 환경에서, BPEL과 마찬가지로 BSM도 “"valid from" 날짜가 설정된다. 따라서 "valid from" 날짜 후에 생성된 모든 인스턴스들은 해당 버전의 템플릿을 사용해야 한다. "valid from" 은 전체 BSM의 속성 뷰에서 찾을 수 있다. (BSM 에디터에서 하얀 공간을 클릭하면 된다.) (그림 10)
그림 10. 상태 머신 속성에서 선택적 "valid from" 설정
우리 예제에서는 "valid from"이 사용되지 않는다.
BSM에 대해 다른 연산을 실행할 수 있어야 한다. 이렇게 하려면, 프로세스 이름(test1)을 클릭한다. 인스턴스에 대한 상세와 함께 그림 11과 같은 스크린이 나온다.
그림 11. 활성 상태 머신에서 수행될 수 있는 액션들
또한, 스크린에서 인스턴스를 종료할 수 있지만, 연산을 호출하려면 그림 12처럼 Events 탭을 클릭한다. (회색으로 되어 있더라도 그렇게 한다.)
그림 12. 활성 상태 머신 인스턴스에 연산 실행하기
BSM에서 호출할 수 있는 모든 연산들이 나타난다. BSM의 현재 상태에서 유효하든, 그렇지 않든 상관없이, 모든 연산들이 보여진다. 예를 들어, powerOn 연산은 그림 13에서 보이지만, 이것을 사용하면 새로운 BSM이 생성되거나(유니크 시리얼 넘버가 사용될 경우), 또는 Running 상태가 이를 지원하지 못하기 때문에(같은 시리얼 넘버가 사용되는 경우) 실패한다. 연산을 사용하려면, 연산 이름을 클릭한다. 우리 예제에서는, powerOff가 특정 연산에 대해 데이터를 입력할 수 있는 장소인 새로운 페이지로 간다.
그림 13.
powerOff 이벤트를 벤딩 머신에 보내기
시리얼 넘버를 입력하고 Submit을 클릭한다. 시리얼 넘버는 BSM 인스턴스를 만들 때 사용했던 것과 같아야 한다. 일단 연산이 수락되면, BSM은 종료한다. BPC Explorer는 연산 리스트와 함께 스크린으로 리턴 되지만, 상태 머신 인스턴스를 더 이상 사용할 수 없기 때문에, 연산 리스트는 "No items found"로 대체된다. Started By Me 뷰로 돌아가면, BSM 인스턴스가 더 이상 보이지 않는다.
이벤트 중심의, 순환하는 “명사들”에 상태 머신이 솔루션을 제공하는 방법을 보면서, BPEL 프로세스와 BSM 간 차이에 대해 살펴보았다. 기본적인 벤딩 머신을 만들고, BPC Explorer를 사용하여 이를 테스트 했다. 다음 글에서는 벤딩 머신을 활용하여 돈을 받아서 상품을 내보내는 것을 설명하겠다. BSM을 테스트하고 디버깅 할 다른 방법들도 살펴볼 것이다.