• 검색 결과가 없습니다.

미들웨어와 분산된 서버와의 연동구조

웹 애플리케이션 서버는 등록/검색/삭제/수정 등의 작업에 대한 이벤트 발생시 XML-RPC를 통해 분산되어 있는 서버로 문서정보 및 파일을 보 내게 되면 파일은 각각의 지정된 서버에 저장이 되고, 문서에 대한 정보 는 미들웨어와 분산된 서버와의 XML-RPC 통신을 통해 Document객체로 날려주면, 미들웨어는 그 정보를 데이터베이스 매핑 시스템을 통해 데이 터베이스에 저장하고 클라이언트의 문서정보 요청 시 웹 애플리케이션 서 버에 결과를 보내준다.

미들웨어를 통해 모든 문서 정보가 수합되고 데이터베이스에 저장이 되 며, 각각의 분산 서버들은 이벤트 처리에 대한 결과 값을 실시간 미들웨 어로 전달하게 된다. 이러한 과정을 통해 클라이언트는 항상 신뢰할 수 있는 실시간 문서변환 정보 및 파일을 핸들링 할 수 있게 된다.

그림10은 미들웨어와 분산된 서버와의 연동구조를 나타낸다.

그림 10. 미들웨어와 분산된 서버와의 연동구조 3.3 웹 애플리케이션 서버시스템

웹 애플리케이션 서버는 클라이언트가 익숙한 웹 인터페이스를 제공한 다. 클라이언트들은 제공되는 서버들의 목록을 지정하고 저자/문서에 대 한 간단한 값을 입력하고 문서파일과 문서정보를 저장할 수 있는 폼과 문 서를 검색하는 폼을 제공한다.

웹 애플리케이션 서버시스템은 모든 비즈니스 로직 부분은 미들웨어에 위임하고, 프리젠테이션 부분만 관여하기 때문에 시스템이 유연하고, 미들 웨어에 대한 정보 값만 알고 있으면 되므로 미들웨어 확장이나 웹 애플리 케이션 확장의 편이성도 제공 받는다. 따라서 다양한 웹 기반의 서비스와 맞물려 웹 기반의 문서관리 시스템을 클라이언트에게 제공하기 쉽고, 운 영 중인 서버에도 바로 연동 할 수 있어 보다 효율적이다.

그림 11. 웹 애플리케이션 이벤트 흐름

3.4 Middleware 시스템

미들웨어는 웹 애플리케이션 서버에 의해 실시간으로 발생하는 문서 이 벤트들에 대한 정보들을 각각의 분산된 서버로 XML-RPC 프로토콜을 통 해 이벤트 프로세스로 전달하게 되고, 이벤트 처리 결과에 대해 미들웨어 시스템으로 실시간으로 통보받게 된다. 처리된 이벤트들을 Gathering System으로 넘겨주고 관계형 데이터베이스 맟게 매핑하여 저장하게 된 다.

미들웨어 시스템은 분산되어 있는 서버와 웹 애플리케이션 서버에 대한 정보들을 Config파일로 가지고 있으면서 실시간으로 변하는 이벤트들을 처리하게 된다.

미들웨어 시스템의 가장 큰 역할은 문서 정보들을 수집하고 저장하여 클 라이언트에게 신뢰 할 수 있는 메타정보를 제공하기 위한 비즈니스 로직 이 구현되는 부분이다.

그림 12. 미들웨어 시스템 전체 구조

3.4.1 이벤트 처리 시스템

동적으로 변화하는 문서 정보를 유지하기 위한 수단으로 분산된 서버 시스템에서 응답한 이벤트 처리 결과를 받아서 Gathering 시스템으로 넘 겨주는 처리를 하게 된다. Document객체를 전달받아 Parsing 과정을 거 치고, 언마샬링하여 객체 정보에서 문서정보를 수집한다.

클라이언트들이 웹 애플리케이션을 통해 문서정보인 메타정보들을 검색할 때, 데이터베이스에서 정보들을 불러와 제공하는 역할도 하게 된다.

3.4.2 Gathering 시스템

이벤트 프로세스에 의해 넘겨받은 문서정보들을 수집하여 데이터베이스 에 매핑 시키는 역할을 하는 시스템이다. 또한, 웹 애플리케이션에서 검색 에 대한 이벤트들을 처리하여 결과 값을 이벤트 프로세스에게 리턴해 주 는 역할을 한다. 즉, 데이터베이스에 문서 정보를 Insert, Delete, Find 하 는 역할을 처리하게 된다.

데이터베이스의 주된 역할은 문서정보에 대한 Select정보이기 때문에 본

논문에서는 관계형 데이터베이스를 사용하였다.

표2는 데이터베이스의 테이블 구조를 나타내며, Field 각각의 내용을 포함 한다.

<표.2>데이터베이스 Table구조

Filed Type Null Key Default Extra

id int / unsigned Primary not null auto_increment

name varchar not null

server varchar not null

author varchar yes

mimetype varchar not null

regdate double yes

-id : DEDMS table의 문서정보에 대한 index를 지원하며, Primary key.

-name : 문서 이름에 대한 값.

-server : 등록된 서버에 대한 이름값.

-author : 문서 저자에 대한 값.

-mimetype : 문서형식에 대한 값.

-regdate : 문서 등록 / 수정 / 삭제 등에 대한 시간 값.

그림13은 이벤트 발생 시 XML-RPC를 통해 이벤트 프로세스가 넘겨받는 객체의 XML 파일의 구조이다.

<params>

<param>

<value><array><data><value><struct>

<member>

그림 14. 서버 시스템 전체 구조 3.5 분산된 서버 시스템

각각의 분산된 서버들은 미들웨어에 대한 정보를 가지고 XML-RPC 프 로토콜을 통해 통신을 하게 된다. 웹 애플리케이션 서버로부터 문서정보 와 파일을 받아 저장/검색/삭제/수정 등의 이벤트 처리를 하고 미들웨어 로 결과에 대한 정보를 보내주는 시스템으로 XML-RPC Server Module, XML-RPC Client Module, 이벤트 프로세스, Saving 시스템으로 구성된 다.

3.5.1 이벤트 처리 시스템

웹 애플리케이션에서 발생한 저장/삭제/수정 등의 이벤트들을 처리하는 시스템으로 미들웨어에서 전달받은 Documents( ) 객체 정보들과 서버 상 태, 문서에 대한 처리 상태 등을 Saving 시스템과 미들웨어로 보내고 받 는 처리를 하게 된다.

현재 서버의 상태 및 갱신 정보들을 실시간으로 알려주는 역할을 하게 되 며, 미들웨어의 이벤트 프로세스와 마찬가지로 XML-RPC를 통해 통신하

고 미들웨어에 대한 정보를 가지고 있기 때문에 플랫폼 독립적여서 확장 이 용이하다.

3.5.2 Saving 시스템

이벤트 프로세스를 통해 전달 받은 문서(파일)을 지정된 공간에 저장하 는 시스템이며, 처리 결과에 대하여 이벤트 프로세스를 통해 미들웨어로 통보하며, 문서 삭제 /수정의 요청들을 처리한다.

Ⅳ. 시스템 구현 결과

4.1 시스템 개발 환경

본 논문에서 제한 시스템 구현 환경은 Linux기반의 팬티엄Ⅳ 2.0GHz 256RAM의 시스템과 Linux기반의 팬티엄Ⅱ 300MHz 96RAM을 이용하였 고, 웹 서버로는 오픈 소스인 아파치를 사용하였으며, 구현에 필요한 패키 지는 PHP 4.1, Python2.3, MySQL Server, MySQL-Client(mysql-python) , XML-RPC Library와 인터넷 브라우저인 익스플로어 환경에서 개발되 었다.

4.2 시스템 구현 결과

4.2.1 웹 애플리케이션 시스템

웹 애플리케이션 시스템은 HTTPD Server 기반의 CGI와 PHP를 가지 고 구현되었으며, 사용자를 위한 UI(User Interface) 부분을 담당한다.

UI는 크게 Documents에 대한 검색(Search) 부분과 등록(Registration)부 분 그리고 삭제(Delete)부분으로 나누어지며, 등록과 검색 시 분산된 서버 를 선택하는 형식으로 구현하였다. 문서 등록 과정에서는 선택된 서버로 문서(파일)와 문서 정보가 이벤트 객체로 XML-RPC를 통해 통신하게 된 다. 웹 애플리케이션 서버는 분산된 서버의 현재 상태(Status)를 나타내주 게 되므로, 클라이언트는 서버의 상태를 눈으로 확인 할 수 있게 된다.

그림 15는 웹 애플리케이션 서버의 등록/검색/삭제 등의 메인화면을 나타 낸다.

그림 15. 웹 애플리케이션 시스템 메인화면

웹 애플리케이션 서버는 미들웨어를 통해 실시간으로 변화하는 문서정 보를 얻어오기 때문에 미들웨어에 대한 Config 정보가 필요하고, 그림 16 에서 보듯이 미들웨어 호스트 / 포트 / 패스 정보들을 설정하였다.

그림 16. 미들웨어에 대한 Config 정보.

<params>

그림 18. 문서 등록 결과 화면

나타내주며, 그림17에서 보듯이 클라이언트가 등록하는 문서(파일)는 64바 이트로 인코딩되어 분산된 서버로 전송되면, 분산된 서버에서는 64바이트 로 디코딩하여 지정된 File Storage에 저장하게 되며, 이벤트 처리 결과는 미들웨어로 통보하여 실시간으로 저장하게 된다.

클라이언트는 검색(Search)과정을 통해 문서를 얻어 올 수 있고, 삭제 (Delete)도 가능하다. 모든 이벤트에 대한 처리 결과는 미들웨어에서 제공 받기 때문에 실시간으로 변화하는 정보에 대한 신뢰성을 갖게 된다.

그림 19. 문서 검색 결과 화면

된 결과는 그림 19과 같고, 하나의 서버에 저장된 파일을 모두 검색한 화 면이다. 클라이언트는 문서 정보를 확인 후 문서(파일)를 요청 가능하며, 문서(파일)는 하이퍼링크를 따라 지정된 서버로 직접 요청하고 다운로드 할 수 있다.

<params><param><value><array>

<data><value><struct>

<member><name>mimetype</name>

<value><string>image/jpeg</string></value>

</member>

<member><name>author</name><value><string>jjoole</string></value>

</member>

<member><name>name</name><value><string>CIMG0553.JPG</string>

</value>

</member>

<member><name>regdate</name><value><double>1067792581.84</double>

</value>

</member>

<member><name>server</name><value><string>jerimo</string></value>

</member></struct></value><value>

그림 21. 문서 삭제 결과 화면

<params>

<param>

<value><string>nike_footware_size.txt</string></value>

</param>

<param>

<value><string>sslab</string></value>

</param>

</params>

그림 22. 문서 삭제 시 객체의 XML 구조

db_info = {

db_table_name = 'Documents' servers = {

그림 23. Configuration of Middleware System

그림 23에서 보듯이 분산된 서버 정보를 입력해줌으로서 서버를 손쉽게 등록 가능하다.

from common import *

from middleware_config import * from SimpleXMLRPCServer import *

class MiddlewareEP:

def __init__(self):

self.document = Document() self.server_list = servers self.db = GatheringSystem() def get_server_list(self, servername = ''):

if servername == '':

return self.server_list else:

return self.server_list[servername]

def status(self, echo_message = 'OK'):

return echo_message

if type(reg_document) is type(Document()):

self.document = reg_document elif type(reg_document) is dict:

4.2.2.1 이벤트 처리 시스템

self.document = Document(reg_document) if not self.document.check():

return 0

if self.db.insert(self.document) == 0:

return 1 else:

return 2

def find(self, search_type, search_text):

return self.db.find(search_type, search_text)

self.db = MySQLdb.connect( **self.db_info )

self.cursor = self.db.cursor(MySQLdb.cursors.DictCursor)

def insert(self, document):

% (self.table_name, document.name, document.server) if int(self.cursor.execute(select_query)):

% (self.table_name, document.name, document.server, \

document.author, document.mimetype, document.regdate)

delete_query = "DELETE FROM %s WHERE name='%s' AND server='%s'" \

% (self.table_name, document.name, document.server) try:

def find(self, search_type, search_text):

"""

% (search_type, search_text, search_type) try:

if int(self.cursor.execute(select_query)) > 0:

if int(self.cursor.execute(select_query)) > 0:

관련 문서