열세번째 날: 간단한 파일 공유

저자

@keedi - Seoul.pm 리더, Perl덕후, 거침없이 배우는 펄의 공동 역자, keedi.k at gmail.com

시작하며

작업을 하다보면 가끔씩은 급하게 또는 간단하게 작업하고 있는 디렉터리 하부의 파일을 동료나 친구들에게 보내주거나 아주 잠깐 공유하고 싶을 때가 많곤 합니다. 보통 파일의 용량이 작을 경우 압축해서 이메일로 보내기도 하고 여유가 있다면 드롭박스와 같은 클라우드 저장소를 이용해 공유 후 링크를 보내기도 합니다. 아주 잠깐만 파일과 디렉터리를 공유할 때는 어느 쪽이든 조금 번거롭긴 합니다. 간단한 명령어로 현재 디렉터리를 상대와 공유할 수 있다면 얼마나 편리할까요? 펄로 간단히 파일을 공유하는 방법을 알아봅니다.

준비물

필요한 모듈은 다음과 같습니다.

직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.

$ sudo cpan Plack Plack::App::Directory::Apaxy

사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.

$ cpan Plack Plack::App::Directory::Apaxy

Plack::App::Directory

Plack은 펄의 PSGI 구현체 중 하나로 루비의 Rack이나 파이썬의 WSGI에 대응하는 웹응용과 서버 사이의 인터페이스입니다. Plack 모듈을 설치하면 Plack::App::Directory 모듈이 같이 설치되는데 이 모듈을 이용하면 손쉽게 특정 디렉터리를 공유할 수 있습니다. 더 정확히 말하면 아파치의 디렉터리 인덱스 페이지와 유사한 페이지를 제공합니다.

실행 방법은 무척 간단합니다.

$ cd path_to/what/you/want
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new->to_app'
HTTP::Server::PSGI: Accepting connections at http://0:5000/
...

이제 브라우저를 이용해 http://localhost:5000으로 접속하면 현재 명령을 실행한 path_to/what/you/want 디렉터리의 모든 파일을 열람 및 다운로드할 수 있습니다.

Plack::App::Directory로 공유한 디렉터리 목록 그림 1. Plack::App::Directory로 공유한 디렉터리 목록 (원본)

크리스마스 선물 #1: 미려한 디자인

사실 여기까지로도 충분합니다만 역시 좀 투박한 인덱스 페이지가 마음에 좀 걸립니다. 물론 미려해지기 위해선 css와 그림 파일등을 HTTP로 제공해야 하니 추가적인 HTTP 요청으로 인한 약간의 리소스 저하는 감안해야겠죠? :) Plack::App::Directory::Apaxy 모듈Plack::App::Directory 모듈과 거의 유사하지만 Apaxy 테마를 입혀 조금 더 미려한 디자인을 제공합니다.

실행 방법은 거의 동일합니다.

$ cd path_to/what/you/want
$ plackup -MPlack::App::Directory::Apaxy -e 'Plack::App::Directory::Apaxy->new->to_app'
HTTP::Server::PSGI: Accepting connections at http://0:5000/
...

달라진 점이 느껴지시나요?

Plack::App::Directory::Apaxy로 공유한 디렉터리 목록 그림 2. Plack::App::Directory::Apaxy로 공유한 디렉터리 목록 (원본)

훨씬 낫군요! ;-)

크리스마스 선물 #2: 처리량

기본적으로 디렉터리 인덱스 페이지를 띄울 때 하나의 프로세스가 전담하는데 용량이 큰 파일을 상대방이 다운로드 받는다면 더이상의 요청을 처리할 수 없습니다. 이 경우 Plack의 백엔드 서버를 지정해서 HTTP 요청을 처리할 프로세스 수를 늘려주면 아주 간단히 처리량을 늘릴 수 있습니다.

다음은 CPAN의 Starlet 모듈을 백엔드로 지정해서 다섯 개의 프로세스를 띄워 최대 다섯 개의 요청을 병렬로 처리할 수 있도록 실행하는 명령입니다.

$ plackup -MPlack::App::Directory::Apaxy \
  -s Starlet --max-workers=5 \
  -e 'Plack::App::Directory::Apaxy->new->to_app'
Plack::Handler::Starlet: Accepting connections at http://0:5000/
...

물론 Starlet 모듈을 설치하는 것을 잊으면 안되겠죠? :)

크리스마스 선물 #3: 간단한 실행

실행 자체는 간단하지만 키보드로 입력해야 할 내용이 좀 많죠? Bash 쉘을 기준으로 alias를 걸면 조금 더 간편히 실행할 수 있습니다. 다음 내용을 .bashrc나 그에 준하는 파일에 다음 내용을 추가합니다.

alias apaxy="plackup -MPlack::App::Directory::Apaxy -s Starlet --max-workers=5 -e 'Plack::App::Directory::Apaxy->new->to_app'"

이제 apaxy 명령으로 간단히 실행 가능합니다.

$ cd path_to/what/you/want
$ apaxy
Plack::Handler::Starlet: Accepting connections at http://0:5000/
...

물론 Plack이 기본으로 제공하는 다른 기능도 추가적으로 사용하면서 모듈이 제공하는 다양한 옵션을 처리하고 싶다면 alias 대신 간단한 래퍼 스크립트를 만들어서 실행하는 방법도 있겠죠.

정리하며

파일을 공유할 수 있는 방법은 무척 많습니다. FTP 서버, 삼바 서버, 이메일, 클라우드 스토리지 등 너무 많지만 작정하고 파일을 공유하는 것이 아닌 이상 대부분의 경우 아주 찰나의 시간 동안 공유해야 하는 경우에 이런 서버를 띄우고 설정하는 것은 번거롭기 그지 없습니다. PlackPlack::App::Directory::Apaxy 모듈을 이용하면 명령줄에서 apaxy 명령 입력 하나로 현재 디렉터리를 브라우저를 통해 공유할 수 있습니다. 단, 네트워크에 따라 외부 네트워크에까지 공유를 지원해야 한다면 공인 IP가 필요하다던가 또는 특정 포트 포워딩 정도의 설정은 필요하겠죠.

Enjoy Your Perl! ;-)

EOT

EOT

blog comments powered by Disqus