<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>EMSTONE Bebop &#187; CGI</title>
	<atom:link href="http://bebop.emstone.com/tags/cgi/feed/" rel="self" type="application/rss+xml" />
	<link>http://bebop.emstone.com</link>
	<description>엠스톤 개발팀 블로그</description>
	<lastBuildDate>Sun, 29 Jan 2012 05:25:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
		<item>
		<title>카탈리스트(Catalyst)와 파일 업로드</title>
		<link>http://bebop.emstone.com/2009/01/06/file-uploading-with-catalyst/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=file-uploading-with-catalyst</link>
		<comments>http://bebop.emstone.com/2009/01/06/file-uploading-with-catalyst/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 16:28:52 +0000</pubDate>
		<dc:creator>keedi</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Catalyst]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Upload]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[       주의 : [카탈리스트(Catalyst)와 파일 업로드]의 가장 최근 판은  이곳 에서 확인할 수 있습니다.

 시작하며

 카탈리스트(Catalyst) 는 웹 응용 개발시 필연적인 발생하는 반복적인 작업을 줄여주고 협업 작업을 가능하게 도와주는 펄(Perl) 기반의 MVC 웹 응용 프레임워크입니다. 카탈리스트는 모델(Model)-뷰(View)-컨트롤러(Controller)의 개념을 도입했기 때문에 모델은 DB로, 뷰는 HTML로, 컨트롤러는 실제 로직으로 치환이 가능하므로 업무를 분담하기 쉬워지며, 코드의 독립성이 높아져 유지보수...
     <a href="http://bebop.emstone.com/2009/01/06/file-uploading-with-catalyst/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>주의</strong>: [카탈리스트(Catalyst)와 파일 업로드]의 가장 최근 판은 <a href="http://bebop.emstone.com/~keedi/timetolog/id/14">이곳</a>에서 확인할 수 있습니다.</p>
<h3>시작하며</h3>
<p><a href="http://search.cpan.org/perldoc?Catalyst">카탈리스트(Catalyst)</a>는 웹 응용 개발시 필연적인 발생하는<br />
반복적인 작업을 줄여주고 협업 작업을 가능하게 도와주는<br />
펄(Perl) 기반의 MVC 웹 응용 프레임워크입니다.<br />
카탈리스트는 모델(Model)-뷰(View)-컨트롤러(Controller)의 개념을 도입했기 때문에<br />
모델은 DB로, 뷰는 HTML로, 컨트롤러는 실제 로직으로 치환이 가능하므로<br />
업무를 분담하기 쉬워지며, 코드의 독립성이 높아져 유지보수 측면에서 유리합니다.<br />
카탈리스트는 웹응용 개발에 필요한 대부분의 기능을 미리 제공하고 있는데<br />
파일 업로드 역시 번거로운 작업은 모두 처리해주기 때문에<br />
카탈리스트를 기반으로 웹 응용을 개발하는 경우 손쉽게 처리할 수 있습니다.</p>
<h3>관련 연구</h3>
<h4>준비물</h4>
<p>카탈리스트로 파일 업로드를 다루기 위해서는 우선 카탈리스트를 설치해야 합니다.<br />
카탈리스트는 CPAN으로 설치하는 것이 정석이지만, 번거롭다면 리눅스의 경우<br />
배포판의 저장소에서 카탈리스트 패키지를 대부분 제공하고 있으므로<br />
이를 활용하면 손쉽게 설치할 수 있습니다.<br />
(본 문서에서는 카탈리스트를 시스템에 설치하는 방법에 대해 다루지는 않습니다.)<br />
다음은 카탈리스트의 파일 업로드와 관련한 모듈의 목록 입니다:</p>
<ul>
<li><a href="http://search.cpan.org/perldoc?Catalyst">Catalyst</a> &#8211; The Elegant MVC Web Application Framework</li>
<li><a href="http://search.cpan.org/perldoc?Catalyst::Request::Upload">Catalyst::Request::Upload</a> &#8211; handles file upload requests</li>
</ul>
<h3>구현</h3>
<h4>설정</h4>
<p>업로드하는 파일을 임시로 저장할 공간에 시스템 임시 디렉터리를 사용하지 않고<br />
직접 지정하기 위해서는 설정 파일에 <code>uploadtmp</code> 항목을 추가합니다.<br />
더불어 업로드와 직접적인 상관은 없지만 임시 디렉터리에 저장한 파일을<br />
옮겨둘 디렉터리 경로도 <code>userdir</code> 항목을 이용해서 표시합니다:</p>
<pre><code>  tinyblog.conf:
  ...
  uploadtmp       __HOME__/tmp/upload
  userdir         __HOME__/tmp/user
  ...
</code></pre>
<p>설정 파일을 이용하지 않고 코드에 직접 명시할 경우는 다음을 참고합니다:</p>
<pre><code>  lib/TinyBlog.pm:
  ...

  __PACKAGE__-&gt;config(
      name      =&gt; 'TinyBlog',
      session   =&gt; {
        flash_to_stash =&gt; 1,
      },
      uploadtmp =&gt; '__HOME__/tmp/upload',
      userdir   =&gt; '__HOME__/tmp/user',
  );

  __PACKAGE__-&gt;setup();
</code></pre>
<h4>뷰(View)</h4>
<p>TinyBlog 에서 파일을 업로드하기 위한 양식을 웹브라우저에 출력하기 위한<br />
<a href="http://search.cpan.org/perldoc?Template">템플릿 툴킷(Template Toolkit)</a>의 소스의 일부분은<br />
다음과 같습니다.<br />
업로드를 위한 양식의 식별자 이름이 <code>mkfile</code>임을 주의하세요:</p>
<pre><code>  root/src/upload/index.tt2:
  &lt;div class="upload"&gt;
    &lt;h3&gt;[% title %]&lt;/h3&gt;
    &lt;table&gt;
      &lt;tr&gt;
          &lt;form method="post" action="[% c.uri_for('/upload') | html %]"
                enctype="multipart/form-data"&gt;
            &lt;td&gt; &lt;label for="upload_file"&gt;파일이름:&lt;/label&gt; &lt;/td&gt;
            &lt;td&gt; &lt;input type="file" name="mkfile" /&gt; &lt;/td&gt;
            &lt;td&gt; &lt;input type="submit" value="업로드" /&gt; &lt;/td&gt;
          &lt;/form&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  &lt;/div&gt;
</code></pre>
<h4>컨트롤러(Controller)</h4>
<p>다음은 TinyBlog 업로드 모듈인 <code>TinyBlog::Controller::Upload</code>의 소스 코드 일부입니다.<br />
<code>TinyBlog::Controller::Upload</code> 모듈의 <code>index</code> 함수의 경우<br />
웹에서는 <code>http://localhost:3000/upload</code> 로 접근할 수 있습니다.<br />
<code>if</code> 조건문에서 뷰에서 업로드를 위해 사용한 <code>mkfile</code> 식별자를 이용함을 주의하세요:</p>
<pre><code>  lib/TinyBlog/Controller/Upload.pm:
  package TinyBlog::Controller::Upload;

  use strict;
  use warnings;
  use File::Basename;

  use parent 'Catalyst::Controller';

  sub index <img src='http://bebop.emstone.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ath :Args {
      my ( $self, $c ) = @_;

      if ( my $upload = $c-&gt;request-&gt;upload('mkfile') ) {

          my $upload_basename = basename( $upload-&gt;filename );
          $upload_basename =~ s/[`~!@#\$%^&amp;*()=+\[{\]}\\|;:'",&lt;&gt;\/?]+/_/g;
          $upload_basename =~ s/\s+/_/g;
          $upload_basename =~ s/_+/_/g;

          my $dest_path = $c-&gt;config-&gt;{userdir}.'/'.$upload_basename;

          if (!-e $dest_path) {
              $upload-&gt;copy_to($dest_path);
              $c-&gt;log-&gt;debug("[$upload_basename] 업로드 완료");
          }
          else {
              $c-&gt;log-&gt;debug("[$upload_basename] 파일이 이미 존재합니다.");
          }
      }
  }
</code></pre>
<p><code>$upload</code> 객체가 호출할 수 있는 메소드는<br />
<a href="http://search.cpan.org/perldoc?Catalyst::Request::Upload">Catalyst::Request::Upload</a> 문서에서 확인할 수 있습니다.<br />
앞의 예제에서는 <code>$upload-&gt;copy_to()</code> 메소드를 사용해서<br />
임시 디렉터리에 저장되어 있는 업로드 파일을 원하는 위치로 복사합니다.</p>
<h3>정리하며</h3>
<p>파일 업로드는 웹 응용을 제작할 때 난이도에 비해 손이 많이 가는 번거로운 부분입니다.<br />
카탈리스트를 이용하면 업로드에 필요한 전처리 작업의 양이 대폭 줄어듭니다.<br />
개발자는 단지 뷰의 HTML 양식에서 파일 업로드용 식별자를 만들어놓고<br />
컨트롤러에서는 카탈리스트 문맥의 요청 객체의 <code>upload</code><br />
메소드(<code>$c-&gt;request-&gt;upload()</code>)를 이용해서 업로드 객체를 얻기만하면<br />
업로드한 파일을 마음대로 다룰 수 있습니다.<br />
물론 카탈리스트는 업로드 과정에서 임시 디렉터리에 파일을 보관하는 부분까지<br />
처리하기 때문에 그 외 서버의 메모리 확보 문제 등 업로드 관련한 민감한 문제를<br />
해결하기 위해서는 카탈리스트 뿐만 아니라 mod_perl 또는 fast_cgi와<br />
관련한 연구가 더 필요할 것입니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://bebop.emstone.com/2009/01/06/file-uploading-with-catalyst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
	</channel>
</rss>

