2009/04/17 08:12

Apache Ftp Server + Spring

  Apache FTP 서버(http://mina.apache.org/ftpserver/ )는  Java기반의 오픈소스 FTP서버입니다.

  Java기반의 모듈이라고 하면 성능이 안 나오지 않을까 걱정하시는 분도 계실 것 같습니다. 이전에 1.0.M3버전으로 제 PC에서 다른 FTP서버와 비교해서 테스트해본 결과는 아래와 같았습니다.


  • 테스트 환경

    • OS : Windows XP
    • CPU : Intel® Core™ 2 Duo CPU E6750, 2.66GHz
    • RAM : 2GB
  • 업로드 테스트 데이터

    • 용량 : 126MB
    • 파일수 : 392개
    • 폴더 : 16개



Ftp_performance.GIF

   테스트 결과로 윈도우에서 돌아가는 다른 FTP서버와 비교했을 때 가장 빠른 속도를 보여주는 예상밖의 성능이 나왔었습니다. Linux등에서는 어떤지 몰라도 크게 성능을 걱정할 수준은 아닐 것으로 예상됩니다.


  Apache Ftp서버는 설정만으로도 FTP에 부가적인 기능을 많이 사용할 수 있습니다.  예를 들면 Log4j의 설정을 이용해서 원하는 수준과 방식으로 로그를 기록할 수 있고, 사용자정보를  입력,조회 등의 쿼리만 설정 파일에 넣어주면  DB로 사용자를 관리할 수 있게도 해줍니다.

  그리고 Java기반이다 보니,  직접 코딩을 해서 확장을 하는 것도 손쉽습니다. Apache FTP 서버에서 정의한 인터페이스대로 코딩을 하고 이를 설정파일에다 추가할 수도 있죠. 대표적으로 Ftplet과 같은 인터페이스가 있습니다.

 활 용사례로,  Hadoop의 파일시스템인 HDFS(Hadoop Distributed File System)으로 파일을 올릴 수 있는 서버모듈도 이 Apache Ftp 서버를 이용해서 구현한 사례가 있습니다.  FTP client프로그램으로 붙어서 직접 HDFS로 파일을 올리거나, 다른 프로그램에서  ftp프로토콜을 이용해 HDFS에 접근할 수 있는 것이죠.[각주:1]

   흥미로운 점은, 이 FTP서버에서는 스프링 방식의 설정을 지원한다는 것입니다. 예를 들면,  데이터베이스로 사용자를 관리할때, 익숙한 bean태그를 이용해서 datasource의 선언을 할 수 있습니다.


 <db-user-manager encrypt-passwords = "clear">
       <data-source>
         <beans:bean class="org.apache.commons.dbcp.BasicDataSource">
                  <beans:property name="driverClassName" value="${jdbc.driverClassName}" />
                  <beans:property name="url" value="${jdbc.url}" />
                  <beans:property name="username" value="${jdbc.username}" />
                  <beans:property name="password" value="${jdbc.password}" />
                  <beans:property name="initialSize" value="${dbpool.initialSize}" />
              </beans:bean>
        </data-source>

.....


더욱 재미있게도, 배포된 소스 [각주:2]중 examples폴더를 보면, Spring DM을 이용해서 OSGI번들로 apache FTP서버를 활용하는 예제가 나옵니다. META-INF/spring/bundle-context.xml의 파일을 보면 아래와 같이 선언되어 있습니다.


<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
    xmlns:ftp="http://mina.apache.org/ftpserver/spring/v1"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd                     
       http://www.springframework.org/schema/osgi 
       http://www.springframework.org/schema/osgi/spring-osgi.xsd
       http://mina.apache.org/ftpserver/spring/v1
       http://mina.apache.org/ftpserver/ftpserver-1.0.xsd ">
    <ftp:server id="server">
        <ftp:listeners>
            <ftp:nio-listener name="default" port="2222" />
        </ftp:listeners>
        <ftp:ftplets>
            <ftp:ftplet name="ftplet1">
                <ref bean="ftplet" />
            </ftp:ftplet>
        </ftp:ftplets>
        <ftp:file-user-manager
            url="org/apache/ftpserver/example/osgiservice/users.properties" />
    </ftp:server>
    <osgi:service interface="org.apache.ftpserver.FtpServer"   ref="server">
    </osgi:service>
    <osgi:reference id="ftplet" interface="org.apache.ftpserver.ftplet.Ftplet" />
     <bean class="org.apache.ftpserver.example.osgiservice.impl.FtpServerLifecycle"
       init-method="init" destroy-method="destroy"    >
       <property name="server" ref="server" />
    </bean>

</beans>

   FTP 서버 역할을 하면서 확장된 기능이 필요하고, 모듈을 재배포하는 도중에도 멈추지 않아야하는 서비스를 만들어야 할 때가 생긴다면,  Apache Ftp Server + Spring DM의 조합을 사용해서 편하게 구현을 할 수 있을 것으로 보입니다.




  1. HDFS로 접근하는 FTP서버에 대한 자료

    [본문으로]

  2. http://mina.apache.org/ftpserver/apache-ftpserver-100-release.html에 서 다운 받을 수 있습니다. [본문으로]
Trackback 0 Comment 1