음, 웹 프로그래밍에 대해서는 영 쥐약이라1 솔직히 무슨 말인지 영 어렵다만, 대충 다음과 같이 이해가 된다.
주인장의 연구실 컴퓨터에는 실험 결과가 담긴 폴더가 매우 많이 있었다. 이게 어떤 구조로 진화했냐 하면:
즉 다음과 같은 구조로 파일이 보관되어 있었다:
/ `- index.pl --> data/ 폴더 내에 있는 텍스트를 검색해서 결과를 출력해주는 CGI `- collect.pl --> data/ 내 특정 폴더에 저장된 파일들을 모아 all.html을 생성해주는 스크립트 `- move.pl --> all.html에서 submit버튼을 누르면 호출하여 특정 번호만 삭제 `- data/ `- 0001/ --> 이런 데이타 폴더가 수천개 `- 0001_1.jpg --> 데이타 그림과, 데이타 설명이 붙은 텍스트와 HTML이 수십개씩 `- 0001_1.txt `- 0001_1.html `- 0001_2.jpg, 0001_2.txt, ... `- all.html --> 폴더 안의 모든 html, jpg를 하나의 html안에 합쳐둔 것 `- 0002/ `- 0003/ ...
문제는 이 결과 폴더를 나중에 윈도우 쪽으로 다 옮기고 시간이 흐르고 나니 정말 필요한 부분만 남기고 이젠 지워버리고 싶은데, html을 보는 거야 상관이 없는데 삭제 또는 복사를 하려니 CGI를 동작시킬 방법이 필요했다.
그래서 저 advent calendar 의 24개 기사를 앞에서부터 훑어 보면서 참고하여 해 보았다.
plackup
프로그램을 사용하여 구동
# app.psgi use CGI::Emulate::PSGI; CGI::Emulate::PSGI->handler(sub { do "./index.pl"; CGI::initialize_globals() if &CGI::initialize_globals; });
use CGI::Emulate::PSGI; use Plack::Builder; my $index = CGI::Emulate::PSGI->handler(sub { do "index.pl"; CGI::initialize_globals() if defined &CGI::initialize_globals; }); my $move = CGI::Emulate::PSGI->handler(sub { do "move.pl"; CGI::initialize_globals() if defined &CGI::initialize_globals; }); builder { mount "/" => $index; mount "/move.pl" => $move; }
localhost:5000
으로 접근하면 index.pl
이 실행되고, localhost:5000/move.pl
로 접근하면 move.pl
이 실행된다.
# 최종 버전 app.psgi 파일 use CGI::Emulate::PSGI; use Plack::Builder; use Plack::App::Directory; my $index = CGI::Emulate::PSGI->handler(sub { do "index.pl"; CGI::initialize_globals() if defined &CGI::initialize_globals; }); my $move = CGI::Emulate::PSGI->handler(sub { do "move.pl"; CGI::initialize_globals() if defined &CGI::initialize_globals; }); builder { mount "/" => $index; mount "/data" => Plack::App::Directory->new( root => './data' ); mount "/move.pl" => $move; }
/
요청에는 index.pl이 구동, /data/*
요청에는 해당 디렉토리 리스트 또는 파일이 정적으로 불리고, /move.pl
요청에는 move.pl이 구동된다. 완성 :-)
plackup -r app.psgi
: 이렇게 할 경우는 브라우저에서 cgi스크립트가 있는 경로에 접근할 때마다 스크립트가 다시 불리면서 서브루틴이 재정의된다고 경고가 떠서, cgi스크립트 쪽에 no warnings 'redefine'
을 추가해주어야 했다
plackup -L Shotgun app.psgi
: 이렇게 할 경우는 그런 경고도 뜨지 않아서 좋음
--access-log
옵션을 주어서 별도의 파일에 기록하게 하거나, -E deployment
옵션을 주어서 아예 출력되지 않게3 함
d:\Temp\placktest>plackup -L Shotgun --access-log access.log app.psgi HTTP::Server::PSGI: Accepting connections at http://0:5000/
실제로 실행해보니, 워낙 간단한 스크립트라서 그랬는지는 몰라도, 기존 스크립트를 거의 건드리지 않고 실행할 수 있었다. 손을 대야 했던 곳은 딱 두 곳:
no warnings 'redefine'
추가해준 것
system( "../../collect.pl" )
이 코드가 디렉토리 구분자가 "/"라 실행이 안 되어서, 백슬래쉬로 고쳐준 것.
system( "perl ../../collect.pl" )
이렇게 앞에 perl 인터프리터를 제대로 적어주면, 스크립트 경로에는 그냥 슬래쉬로 적혀도 인식한다.
아주 만족스럽군.
cgi 파일 하나마다 핸들러를 따로 붙여 주셨네요.
https://metacpan.org/module/Plack::App::CGIBin 사용하면 cgi들어있는 디렉토리만 지정해주면 되는거 같습니다.