ProObject 런타임 엔진 소개

본 장에서는 ProObject 런타임 엔진의 특징 및 아키텍처, 구성요소에 대해 설명한다.

1. 개요

ProObject는 비즈니스 웹 애플리케이션 프레임워크(Business Web Application Framework) 제품으로, 웹을 통해 제공되는 여러 서비스들을 손쉽게 작성할 수 있다.

개발자들은 ProObject를 도입하면 복잡하고 어려운 Low-Level의 설계(Thread Synchronization, Transaction 처리, Servlet 처리 등)를 줄일 수 있고, 손쉽게 코드를 작성할 수 있다. 또한 리소스의 효율적으로 관리와 운영 관리 및 테스트를 쉽게 할 뿐 아니라 많은 서비스를 고속으로 처리할 수 있다.

엔진은 Low-Level에서 고려해야 하는 다양한 사항들을 자동으로 보장하고 고속으로 서비스를 처리하여 줌으로써 서비스를 개발할 때 고려해야 할 사항들을 줄여준다. 또한 개발 과정에서 발행할 수 있는 여러 가지 문제들을 줄이고 서비스를 제공할 수 있도록 도와주는 프로그래밍 모델을 제공한다.

개발자들이 ProObject 프로그래밍 모델에 맞추어 애플리케이션을 작성하면, 런타임 엔진은 프레임워크에서 ProObject 개발 도구들로 작성된 애플리케이션들을 읽어들여 실제로 서비스로 제공한다. 이후 런타임 엔진은 읽어들인 애플리케이션의 서비스를 요청을 받게 되면 되도록 많은 요청을 받아들이면서 최대한 빠르게 서비스들을 처리하는 것을 목표로 한다.

개발자들은 ProStudio로 프로그래밍 모델들을 개발하고, ProManager에서 운영 관리와 테스트, 리소스의 효율적인 관리를 한다. 각 제품에 대한 자세한 내용은 ProObject Studio 개발자 안내서ProObject Manager 사용자 안내서를 참고한다.

1.1. 주요 특징

ProObject 런타임 엔진은 고속으로 여러 서비스를 처리하면서, 편리하게 서비스를 작성하도록 다양한 기능들을 제공한다.

  • 이벤트 드리븐(Event-Driven) 처리를 이용한 고속 요청 처리

    ProObject의 런타임은 모든 요청을 이벤트 드리븐으로 받아들여 처리하기 때문에 기존의 프레임워크보다 훨씬 많은 수의 서비스를 동시에 처리하는 것이 가능하다.

    기존의 프레임워크들이 대부분 워커 스레드 모델(Worker Thread Model)을 이용한 병렬처리를 지원하기 때문에 워커 스레드 이상의 서비스를 동시에 제공할 수 없다는 문제점이 있다. 이와 달리 ProObject 런타임 엔진은 이벤트 드리븐 프로세스 스레드(Event-Driven Process Thread)에서 서비스 요청을 최대한 빠르게 받아들이거나, 간단한 서비스들은 이벤트 드리븐 스레드에서 고속으로 처리함으로써 보다 높은 산출량(Throughput)을 얻을 수 있다.

  • 다양한 웹 서비스 처리 지원

    웹 소켓, 세션, 쿠키 등 웹에서 제공되는 다양한 기능들을 서비스 내에서 다룰 수 있도록 제공함으로써 웹 프로그래밍을 하듯이 웹 애플리케이션의 작성이 가능하다.

  • 데이터 계층을 이용한 편리한 입출력 처리

    ProObject는 데이터베이스를 이용한 입출력이나 네트워크를 이용한 서비스 요청/응답에 필요한 데이터들을 보다 용이하게 변환할 수 있도록 다양한 기능들을 제공한다.

    네트워크 메시지나 데이터베이스 등의 외부 저장소(Repository)로부터 데이터를 처리하는 데이터 오브젝트 팩토리(DataObjectFactory)와 데이터를 객체화된 데이터 오브젝트(DataObject)를 이용해 보다 편리하게 데이터를 다룰 수 있다. 또한 데이터의 반영/취소를 자동으로 처리한다.

  • 유연하고 손쉬운 서비스 연동

    서비스 내에서 다른 서비스의 연동이 단 한 번의 정적 메소드 호출을 통해 이루어짐으로써 손쉽게 다른 서비스의 작업을 처리하는 것이 가능하다. 단 한 번의 정적 메소드 호출을 통해 서비스 내에서 다른 서비스의 연동하고, 외부 서비스는 TCP를 통해 연결할 수 있다.

1.2. 기본 구조

ProObject 런타임 엔진은 채널 이벤트 계층(Channel Event Layer), 이벤트 계층(Event Layer), 서비스 계층(Service Layer)로 구성된다.

런타임 엔진은 채널 이벤트 계층으로부터 서비스가 시작되며, 필요에 따라 이벤트 계층을 통과해서 서비스 계층에까지 도달해야 서비스가 처리된다. 채널 이벤트 계층과 이벤트 계층은 이벤트 핸들러 스레드(Event Handler Thread)에서 서비스 계층은 서비스 그룹 워커 스레드(ServiceGroup Worker Thread)에서 처리한다.

다음은 런타임 엔진의 기본 구조에 대한 설명이다.

figure overview architecture
런타임 엔진 기본 구조
  • 채널 이벤트 계층(Channel Event Layer)

    ProObject 런타임의 모든 서비스가 시작되는 계층으로 네트워크 입출력과 프로토콜을 처리한다.

    채널 이벤트 즉 외부와의 통신을 수행하는 경우 패킷의 송수신 가능 여부와 채널 연결 등에 대한 요청들을 처리하고, 외부로부터 전달된 여러 메시지들을 해석하고 외부와의 통신 규약에 따라 통신을 수행하는 작업을 수행한다. 이후 ProObject 런타임의 시스템 애플리케이션이나 개발자가 작성한 애플리케이션의 이벤트들을 발생시켜 실제로 서비스가 처리될 수 있도록 만들어주는 역할을 담당한다.

    또한 스레드간의 통신을 위해 IPC(Inter-Process Communication)를 수행할 때에도 외부와의 통신을 수행하는 것으로 간주하여, 필요한 경우에는 서비스 계층과의 통신을 수행하는 역할 또한 수행한다.

    채널 이벤트 계층은 다음의 리소스로 구성된다.

    • 채널 이벤트 핸들러

    • 웹 소켓

    각 리소스 개발에 대한 자세한 내용은 채널 이벤트 계층 개발웹 소켓 개발을 참고한다.

  • 이벤트 계층(Event Layer)

    이벤트 계층에서는 런타임 엔진에 배포된 애플리케이션들이 처리하는 애플리케이션 이벤트(Application Event)들을 처리하는 계층으로 채널 이벤트에 속하지 않는 모든 이벤트들을 처리하는 역할을 담당한다. 애플리케이션 이벤트는 채널 이벤트나 다른 애플리케이션 이벤트로부터 발생될 수 있으며, ProObject 런타임 엔진은 발생된 이벤트의 종류에 따라 해당 이벤트를 처리하는 이벤트 핸들러(채널 이벤트 핸들러, 이벤트 핸들러)를 호출한다.

    ProObject 런타임 엔진은 이러한 이벤트들를 싱글 스레드(Single Thread)로 처리한다. 기본적으로 이 이벤트들을 처리하는 시간들이 매우 짧고 가볍고, 멀티 스레드(Multi Thread) 환경은 비효율적이기 때문이다. 이벤트의 처리 시간이 기본적으로 워낙 짧기 때문에 처리량을 증진시키기 위해 사용되는 널리 쓰이는 멀티 스레드 기법에 필수적으로 필요한 스레드 간의 통신(IPC : Inter Process Communication) 시간과 스레드간 동기화를 위해 사용되는 임계 영역(Critical Section) 처리를 위한 Lock의 오버헤드가 이벤트 처리 시간보다 월등히 길어지기 때문이다.

    ProObject 런타임 엔진의 이벤트 계층은 모든 이벤트들을 싱글 스레드에서 모든 작업들을 비동기적(Asynchronous)하게 처리하도록 구성되어 있으며, 이는 매우 효율적으로 많은 요청들을 받아들이고 처리할 수 있다.

    이벤트 계층은 다음의 리소스로 구성된다.

    • 이벤트

    • 이벤트 핸들러

    각 리소스 개발에 대한 자세한 내용은 이벤트 계층 개발을 참고한다.

  • 서비스 계층(Service Layer)

    서비스 계층은 사용자가 요청한 서비스들을 실제로 수행하여 주는 계층이다. 이벤트 계층과는 달리 멀티 스레드(Multi Thread) 구조로 구성된다. 이 계층에서 수행되는 모든 작업들은 기본적으로 작업 시간이 오래 걸리거나, 동기적(Synchronous)하게 처리해야 하는 작업을 지니고 있는 경우가 대부분으로 멀티 스레드에서 보다 높은 효율을 보이게 된다.

    서비스 계층은 이벤트 계층이 처리할 수 없다고 판단되는 작업들을 이벤트 계층으로부터 스케줄링 받아 작업을 처리하고, 작업이 끝난 이후에는 채널 이벤트 계층을 통해 이벤트 계층에 결과를 돌려주고, 최종적으로는 서비스를 요청한 사용자에게 응답을 돌려준다.

    서비스 계층은 다음의 리소스로 구성된다.

    • 서비스 오브젝트

    • 각 오브젝트에서 사용하는 리소스

    ProObject에서는 서비스 계층들에 속하는 모든 리소스들의 집합을 애플리케이션으로 정의한다. 애플리케이션에 대한 자세한 내용은 애플리케이션 개발을 참고한다. 서비스 계층에 속하는 리소스들은 서비스 그룹이라는 별도의 리소스의 집합이 정의되어 있으며, 이에 대한 자세한 내용은 서비스 그룹을 참고한다.

2. 프로그래밍 모델

ProObject는 웹 애플리케이션에서 사용할 수 있는 다양한 기능들을 보다 쉽게 작성할 수 있도록 다양한 프로그래밍 모델을 제공하고 각 모델에 맞춰 개발된 리소스들은 런타임 엔진을 통해 서비스를 제공한다.

가장 기본적인 프로그래밍 모델로는 웹에서 제공되는 다양한 서비스들을 보다 쉽게 작성할 수 있는 서비스 프로그래밍 모델(Service Programming Model)이다. 이 서비스 프로그래밍 모델에서는 실제 서비스를 제공하는 데 필요한 모든 추상적인 객체들을 실제 Java의 객체(Object)로 모델링하여 프로그래밍을 할 수 있도록 제공한다.

그 외에 존재하는 계층별 프로그래밍 모델은 아래와 같으며 각 모델에 대한 자세한 내용은 애플리케이션 개발을 참고한다.

  • 데이터 계층 입출력 프로그래밍 모델

  • 채널 이벤트 계층 프로그래밍 모델

  • 이벤트 계층 프로그래밍 모델

  • 서비스 프로그래밍 모델