github maxtortime/SetupBox v.0.1-d2-alpha
Naver D2 Fest Submit

8 years ago

프로젝트 방향 및 변경점

처음에 저희가 생각한 SetupBox는 오픈 소스 클라우드 스토리지 서비스였습니다. 즉, Dropbox 같은 서비스 형태를 개인, 단체 서버에서 쉽게 설치하여 사용할 수 있게 하는 것이 목적이었습니다. 따라서 Version Control System(이하 VCS)을 통해서 변경 사항을 자동으로 서버로 전달하고, 파일 공유 및 간단한 버전 관리를 가능하게 하는 것이 목표였습니다.

그러나, 상용 소프트웨어 및 서비스와 비슷한 기능을 제공하는 것보다는, 사용자 스스로 필요한 기능을 선택 및 조합하여 사용자의 입맛에 맞는 storage cloud를 구축할 수 있는 platform을 만드는 것으로 프로젝트 목표를 전환했습니다. Git이나 Subversion 등 상용 VCS는 일반 사용자가 공부와 이해 등의 노력없이 사용하는 것이 어렵지만, SetupBox는 VCS의 기능들을 SetupBox만의 API를 이용해서 쉽게 사용할 수 있도록 제공합니다. 현재 개발은 Git 환경과 SVN 환경에서 모두 잘 동작하는 것을 목표로 하고 있습니다.

C를 기반으로 개발을 하려고 했으나, VCS API(git, subversion)의 사용이 C가 Python에 비해 복잡하게 만들어져 있어, 개발의 편리성 및 생산성을 위해서 Python으로 전환했습니다. 추후 Beyond Stage에서는 다른 언어도 사용할 수 있도록 할 예정입니다.

해결 문제

  • SVN의 local commit 불가능 문제
    Git은 add - commit - push 과정이 SVN보다 쉽게 되어있습니다. Git은 push를 해야만 remote repository에 저장되지만, SVN은 tracking이 되고 있는 파일을 수정 후 commit을 하면 push의 과정이 없이 바로 remote repository에 저장됩니다. 이 때, ‘인터넷이 안되면 어떻게 처리할 것인가?’에 대한 문제가 생기게 됩니다. 이를 해결하기 위해 SetupBox는 SVN을 위한 transaction 관리 기능을 추가하였습니다. 자세한 내용은 기술 관련 항목에서 설명하겠습니다.
  • File operation 감지 문제
    SetupBox는 사용자가 최대한 적은 노력을 통해 사용하는 것을 하나의 목표로 생각하고 있기 때문에, 사용자가 어떤 파일이 변경되었는지는 알 필요가 없이 SetupBox가 자동으로 감지하고 해당 파일을 형상 관리합니다. 이를 위해서 FUSE(Filesystem in USEr space)를 사용하려고 했었습니다. FUSE는 사용자가 직접 자신의 File System을 user 레벨에서 개발할 수 있는 오픈소스 라이브러리입니다. 이것을 사용하면 user level filesystem에서 이루어지는 모든 file operation을 개발자가 직접 다루고 감지해 낼 수 있기 때문에, SetupBox가 어떤 파일이 변경(생성, 삭제, 수정 등)을 알 수 있고 해당 파일을 add 또는 remove 하려고 했습니다. 하지만 FUSE까지 사용하는 것 보다는 더 좋은 방법이 있는지 찾아보려고 했고 다른 방법을 사용하게 되었습니다. 각 file들의 metadata 비교를 통해서 file system의 정보없이 확인할 수 있게 되었습니다. 만약, a.txt라는 파일이 있고, 이 a.txt가 변했는지 확인하기 위해 원래 버전의 a.txt를 확인해서 modified data를 비교합니다. 이 방법을 통해서 FUSE보다 효율적이고, 간단하게 문제를 해결했습니다.
  • 웹 서버를 구축하기 위해 개발 스택을 정하는데 어려움이 많았습니다.
    웹으로 클라이언트가 접속해서 Dropbox처럼 파일을 읽고 쓸 수 있는 기능을 만드는 것이 목적이었습니다. 하지만 그런 기능을 처음부터 개발하기는 역시 시간 상 힘들다고 생각하고 적절한 오픈소스로 된 구현을 많이 찾아보았습니다. 역시 많은 솔루션이 있었지만 바로 적용하는 데도 역시 어려움이 있었습니다. 왜냐하면 기본 개발 언어를 C와 Python으로 한 상황에서 다른 언어로 된 솔루션을 사용하기에는 비용이 너무 많이 들었습니다. 그러나 Python으로 된 솔루션들은 수가 적고 문서화가 잘 되어있지 않아 적용하기가 힘들었습니다. 결국 기능이 최소화 되어있고 어느 정도 구조를 잘 갖춘 오픈 소스 솔루션을 찾을 수 있었습니다. 이런 문제를 겪으면서 깨달은 점은 역시 개발 기간이 짧고 인원이 작을 수록 프로젝트에 사용될 솔루션도 작아야 한다는 점입니다. 솔루션이 클 수록 혼자서 분석해서 개선하는 시간이 많이 걸리므로 결국 개발 일정이 지연되는 것 같습니다.

기술

  • Transaction 관리를 위한 자체 local VCS 제작
    Transaction 관리는 해결 문제에서 말씀드렸다시피 svn의 경우 local commit이 안되기 때문에, local commit은 자체적으로 만든 transaction manager가 하고, remote commit할 때에만 svn을 사용하는 것입니다. 전체적인 구조는 vcs, fs, dv, vcs_wrapper(svn_wrapper)입니다.
  • db - db는 database 관리 시에 사용되는 utility를 제공하는 함수의 집합입니다. 지금 단계에서는 테이블 이름을 넣어서 이미 해당 이름을 가진 동일한 테이블이 있는 지 여부를 알려주는 역할을 합니다. 추후에 DB관련 유용한 함수들을 더 추가해서 제공할 수 있습니다.
  • fs - fs는 file operation에 대한 모든 것을 관리합니다. 예를 들어, 입력받은 특정 파일의 path에 대해 이것이 absolute path인지, relative path인지 자동으로 판단해서 합쳐주는 utility를 제공하고, 삭제하고자 하는 directory 명을 입력 받고 해당 directory 안에 있는 파일들을 모두 지워주는 utility(이 때, fs는 SetupBox의 구동에 필요한 디렉토리 및 파일들에 대해서는 fs가 해당 정보를 가지고 있어서 삭제 명령에 대해서 안전하게 관리합니다.) 등, 편리한 file operation 관련 함수들을 관리하는 것입니다.
  • vcs - vcs는 SetupBox 팀이 직접 만든 local VCS 입니다. 간단한 VCS로, DB를 가지고 있고, 자신의 directory - .stage, .commit - 을 가지고 있습니다. 예를 들어, SetupBox API에 add라는 함수가 있다면 git의 add와 같이 staging을 시키는 함수입니다. SetupBox의 add에 directory 혹은 파일명이 파라미터로 들어오면, 이 add는 directory나 file을 .stage directory에 옮깁니다. 이것이 staging의 과정입니다. 그 다음 commit을 하게 되면 commit 메세지를 받고, 현재 staging에 있는 파일 전체를 .commit directory로 이동합니다. 그리고 .stage directory를 삭제합니다. .commit에는 현재 버전 명을 hash한 값으로 만들어진 directory가 있고 여기에 현재 staging 된 것을 옮기는 것입니다. 그리고 db에 새로 insert하여 commit하는 현재 hash값, 이전 버전의 hash값, 그리고 다음 버전의 hash값, 커밋 메세지를 db에 넣어줍니다. 이것을 기반으로 확장시켜나가면 SetupBox만의 local VCS가 됩니다.
  • vcs_wrapper - vcs wrapper는 svn wrapper처럼 단순한 operation을 하도록 svn을 wrapping한 것입니다. 이 svn wrapper는 svn의 command와 SetupBox팀의 local vcs를 적절히 조합하여 local commit이 가능한 간단한 svn을 만드는 것입니다. 즉 SetupBox는 svn을 지원을 하는데, svn은 local commit이 안되고, 이를 위해 SetupBox 팀만의 local vcs를 만들었고, svn이 local commit을 가능케하는 svn_wrapper를 만들었습니다.
  • Web backend
    웹 서버 구축을 위해서 flask를 이용했습니다. flask는 무척 작고 간단하면서도 무척 쉽게 웹 서버를 만들 수 있고 또한 파이썬으로 개발할 수 있어서 선택했습니다. 서버의 구조는 크게 사용자 인증과 파일 관리 부분으로 나눌 수 있습니다. 사용자 인증을 위해서 flask-security라는 flask 확장 기능을 이용했습니다. flask-security는 로그인/아웃, 회원가입, 비밀번호 관리, 이메일 인증 및 송수신 등을 담당합니다. 비밀번호 암호화는 bcrypt를 이용하며 사용자 정보를 담은 테이블은 sqlite3를 이용해 관리합니다. 파일 관리를 위해 flask 및 파이썬으로 개발된 simple file manager using flask를 이용했습니다. 파일을 정의하는 클래스와 업로드, 검색, 디렉토리 만들기가 구현되어 있습니다. 이미 구현된 기능의 버그를 고치고 파일 삭제 및 이름 바꾸기 기능을 새로 구현했습니다. 그리고 파일 크기와 수정된 날짜를 표시할 수 있도록 기반 클래스를 고쳤습니다.
  • Web Front End - 위 프로젝트의 기본적인 탐색기 구조를 많이 수정했습니다. 기존에는 파일과 폴더를 구분해서 표시했지만 SetupBox는 표 형태로 구조를 바꾸어 파일 타입, 이름, 크기, 수정된 날짜를 표시할 수 있게 개선했습니다. 그리고 jquery-contextmenu라는 라이브러리를 사용해서 콘텍스트 메뉴를 이용해 파일 삭제 및 이름 바꾸기를 할 수 있도록 했습니다. 반응형 웹을 쉽게 구현하기 위해 Bootstrap을 기반으로 했습니다. 각종 업로드 및 디렉토리 추가를 위해 사용자에게 입력을 받기 위해 나오는 폼을 모두 bootstrap modal로 구현했습니다. 로그인, 로그아웃 등 각종 인증을 위해 필요한 폼 그리고 기본적인 css는 모두 boot strap login form 를 기반으로 수정했습니다. 파일에 대응하는 아이콘은 Free file icons 을 사용했습니다. 업로드, 다운로드 아이콘은 Google material design 아이콘을 사용했고 프로필 사진을 위해 Gravatar를 적용했습니다.

홍보 방법

SetupBox를 처음 접하는 유저들의 적응을 위해서 Demo service를 만들어서 제공하고 있습니다. Demo service code 역시 저장소에 공개되어 있으며 하나의 example로 쓰일 수 있습니다. 고정 IP서버를 둔 웹으로 제작되어서 언제 어디서나 쉽게 사용할 수 있습니다. Wiki page 및 README에 Contribution Guide 및 Installation Guide를 작성하였습니다. 그리고 위키에 회의 내용을 공개해서 저장소를 봤을 때 잘 운영되고 있는 느낌을 가지도록 했습니다. 이를 통해 처음 온 사람이라도 프로젝트에 공감하고 기여할 수 있는 마음을 가지게 하고자 했습니다.

쉬운 서버 설치를 위해 shell script로 스크립트를 작성했습니다. 그리고 pip에 웹서버를 제외한 부분을 배포해서 쉽게 SetupBox를 적용할 수 있게 했습니다.

문서화 및 라이선스

  • README는 현재 변경된 프로젝트 방향에 따라서 다시 작성을 했습니다.
  • LICENSE는 3-clause BSD 라이선스를 적용했습니다.
  • Wiki page를 통해 Contribution Guide, Installation Guide, Work proceeding 등을 작성하고 정리를 통해 README에도 기재했습니다.
  • 효율적인 open source 관리를 위해 Branch naming 방식, Issue naming 방식을 서로 논의해서 정했고 잘 이루어졌습니다.

Don't miss a new SetupBox release

NewReleases is sending notifications on new releases.