Java를 이용한 웹개발시 Servlet 과 같은 Dynamic Page의 구현시에는 Servlet Container를 지원하는 Web Server를 사용하는 수 밖에는 없습니다. Servlet 을 지원하는 Java 다수의 경량 서버가 있습니다만, PDA 같은 임베디드급 머신에 포팅하여 동작 시키기에는 상당한 부담임에는 틀림없습니다.


 그래서 임베디드나 PDA 같은 H/W 리소스가 제한적인 장비에서 동작시키기 위한 경량 웹서버를 취미 생활(?)로 만들어 보았습니다. 이름하여 YG HttpServer 이며 아래 원칙하에 제작되었습니다.


- HTTP Fullspec이 아닌 단순 페이지뷰나 파일전송 정도의 기본적 기능만 지원하고 필요한 기능은 사용자가 확장할 수 있을 것

- 장치에 Capability에 맞춰 Setting이 쉬울 것

- Servlet 과 유사한 동적인 페이지를 지원 할 것


즉, WebServer의 평가항목 Performance, Scalability, Security, Avaliability, Compliance to standards, Flexibility, Platform requirements, Manageability 중  굵은 글씨로 표시된 항목에만 중점을 두었습니다.


 일단 위와 같은 특성들을 지원하기 위하여 웹서버를 최대한 단순화하여, 필요한 역할을 하는 부분들을 나누고 사용자의 요구에 따라 사용자가 직접 필요한 부분은 tuning 할 수 있도록, 


 Server를 구성하는 부분항목에 대해서는 OpenAPI를 제공 기능의 추가, 삭제, 부하량을 고려한 퍼포먼스 튜닝등을 용이하게 하였습니다.

 

 서버의 대략적인 서버 Core 모듈의 구조는 아래와 같습니다.

  

1. MicroWebServer에서 ServerSocket의 생성 관리 및 Client Socket Binding을 담당하여,


2. ServiceMapper에서는 생성된 Client Socket의 Header를 parsing 하여 요구 Resource를 추출, Resource를 처리할 수 있는 Service Object에 넘겨주는 역할을 합니다.


3. AbstractService를 extends 하여 사용자가 원하는 형태의 서비스를 구현도 가능하며, 현재 Web Server에서는 기본적으로 Html이나 일반적은 파일을 전송하는 StaticResourceService와 Servlet과 같은 동적인 웹페이지를 사용자가 구현할 수 있도록 경량화한 GdpService를 지원합니다.


4. Gdp 요청에 대해서는 사용자가 직접 작성한 Gdplet Object에 전달되어 개별적인 동적 처리가 이루어 지는 구조입니다.

4-1. 예제로 쓰인 Hello gdp 와 파일전송은 이후에 살펴보겠습니다.


5. IServiceScheduler는 다수의 요청의 처리를 위한 스케쥴러 Interface이며, 사용자는 Device의 Capa에 맞추어 적절한 형태의 스케쥴러를 직접 작성할 수도 있습니다.

5-1. 기본적으로 내장된 DefaultServiceScheduler는 ThreadPool의 형태로 구현되었고, Client의 요구를 순차적으로 저장했다가 처리하는 저장 순서에 따라 처리하는 Unbounded queue 가 사용되었으며, Pool 공간은 10입니다.(동시에 10건 이내의 요청만 처리 가능합니다.)

 

눈치 채신분도 많겠지만,

위의 웹서버는 Java의 NIO가 아닌 Standard IO로 구동되는 구조입니다. Standard IO는 다수의 동시처리를 위해 쓰레드를 사용할 수 밖에 없습니다. 


Performance가 떨어지는 Standard IO + ThreadPool 기반으로 제작한 이유는 NIO는 OS에 종속성이 있으며, JVM에 제약이 있는 임베디드 장비에서는 정상적인 동작이 어려울 수 도 있고, 애초에 의도가 대량 접속처리가 아니라 최대한 가벼운 환경에서 동작되는것을 목표로 하였기 때문입니다.

NIO 버전은 현재 ME 버전이 아닌 SE 버전에서 적용될 예정입니다.


아래는 위에서 설명한 Server의 Core 모듈입니다. (상업적 이용은 불가입니다. 모든 소스 오픈예정)




앞서 설명한 바와 같이 기본 Service 만을 탑재하여 아래와 같이 Cosole에서 실행 시킬 수도 있습니다.

주석으로 처리된 부분은 GpeService를 추가시키는 부분으로 사용자가 작성한 Gdplet 서비스의 탑재도 가능합니다.


Gdp는 Gonni Dynamic Page의 약자로 서블릿과 같이 사용자가 동적인 웹페이지를 구성할 수 있도록 제공하는 API를 제공합니다. 사용자는 Gdplet 이라는 class의 service(XRequest req, XResponse res) method만 구현하면 됩니다.


아래는 Hello GDP 예제입니다.


Http 프로토콜은 기본적으로 Header와 Body의 구조로,  Header에는 기본적으로 사용자가 Client에게 전송하는 data의 mime type의 지정이 필요하며,  Body부분에 실제 전송을 위한 data를 write 해주면 됩니다. (API상으로는 Character와 Binary 두가지 형태의 write를 모두 지원합니다. )

 

아래는 위의 Gdp 예제의 실행결과 입니다.


새로고침 버튼을 눌렀을 경우 페이지가 동적으로 현재시간에 맞추어 갱신되는 것을 확인 할 수 있습니다.


아래는 해당 모듈을 이용하여 만들어본 GUI 모듈입니다. 실행시 TrayIcon에 서버 실행이 활성된 Icon이 생성되고 사용자가 웹서버의 Root 폴더 지정 및 현재 서버의 상태를 확인 할 수 있습니다.(귀찮아서 할 수 있는게 많은데 여기까지 밖에 못했네요)



트레이 아이콘, Server 의 상징인 'G' 모양이 아이콘이 생성되었음을 확인 할 수 있습니다. ^^



서버 설정화면, Http File Server 운용을 위한 root dir 설정 및 서버의 로그, 순간 접속량 등을 확인 할 수 있습니다. 


아래의 파일은 UI 및 일부 Gdp를 포함하는 샐행파일이 포함된 Jar 파일입니다. (실행은 콘솔에서 java -jar  cKserver.jar 이며, 반드시 동일 폴더에 org.ygsoft.webserver.core_20100102.jar 파일이 같이 있어야만 동작합니다.)



Gdplet 테스트를 위해 UI 및 Demo gdp 가 포함된 Eclipse Project도 첨부합니다. 관심있으신 분들은 아주 적절하게 필요한 서비스를 확장하여 사용할 수 있으리라 확신합니다. (Gdplet 개발시 공유해 주시면 감사 ^^)



해당 프로젝트 내에서 Client에서 WebServer로 파일을 전송하는 gdp 예제도 포함되어 있습니다.  



아래의 웹페이지에 파일 전송시 서버 실행을 하였던 jar 파일이 포함된 폴더내에 download 폴더가 생성 파일이 저장되는 구조입니다. 원격지에서 집 Server에 파일 전송이 가능하죠. 본 예제를 참고, gdp를 확장하여 다양한 형태의 데이터 송수신 서비스를 구현 할 수 있을 거라 생각됩니다.


다음 버전에는 아래의 기능들을 추가해 볼까합니다.

- Session을 추가하여 간단한 사용자 인증 구현 (Open API 제공)

- Reflection을 활용하여 Service를 추가하는 기능

- GUI 개선

- GDP 예제 : 웹기반 파일 탐색기, CCTV, 원격제어 



어디까지나 취미생활 인지라 다음이 언제가 될 지는 모르겠네요..ㅋㅋ 

김영곤 (mailto:gonni21c@gmail.com)


+ Recent posts