[첫화면으로]Perl/모듈설치

마지막으로 [b]

1. 개요
2. 모듈 설치 개괄
3. Linux, Unix 환경에서 root 권한으로 cpan 사용하기
4. Linux, Unix 환경에서 root 권한이 없다면
4.1. 예: 주인장의 경우
5. MS윈도우 환경에서 Strawberry Perl이나 Activestate Perl을 사용하고 있다면
5.1. Strawberry Perl 에서 cpan 을 사용할 때 압축해제 오류가 나는 경우
6. cpan을 사용할 수 없는 상황이라면
6.1. 모듈 가져오기
6.2. 서버 시스템에 모듈 설치하기
6.3. 개인 계정 아래에 모듈 설치하기
6.4. pm 파일만 가져다 놓기
6.5. 실행 스크립트와 같은 디렉토리에 모듈을 두기
7. PPM 파일을 받아서 설치하기
8. 관련 링크
9. Comments

1. 개요

원래 이 페이지는 다음과 같은 배경에서 만들어졌다.

그런데 이 페이지의 내용을 작성한 후에 시간이 많이 흘렀고, 내용도 너무 구닥다리 방식에 관한 얘기만 적혀 있어서... 생각난 김에 내용을 갱신한다.

2. 모듈 설치 개괄

3. Linux, Unix 환경에서 root 권한으로 cpan 사용하기

쉘에서 cpan이라고 실행하거나, 펄5.6이하에서는 perl -MCPAN -eshell이라고 하여 cpan 쉘을 띄울 수 있다.

제일 처음 실행할 때 여러 가지 옵션들의 값을 어떻게 지정할 지 묻는다. 아는 건 답해주고 모르는 건 그냥 Enter를 눌러서 기본값을 사용한다.

모듈을 설치하기 위해서는 install 모듈명 해주면 된다. 그 외 사용법은 help 명령을 내려서 간단하게 볼 수 있고, 자세한 것은 cpan 도움말이나 FAQ[1]를 참조

4. Linux, Unix 환경에서 root 권한이 없다면

요즘은 /Perlbrew를 쓰는 것이 대세인 것 같다. perlbrew 를 사용하면 Perl 인터프리터와 기본 모듈을 포함한 모든 환경을 자신의 홈 계정에 설치하고, 심지어 여러 버전의 펄을 동시에 설치한 후 필요에 따라 바꿔가며 쓸 수 있다. 당연히 추가 모듈 설치도 자유롭게 자신의 홈 디렉토리에서 이뤄진다. 이 방법을 추천.

이 절의 이하의 내용은 perlbrew를 사용하지 않을 때 얘기임.

개인 계정에서도 cpan을 사용할 수 있다. 다만 펄 모듈이 설치되는 곳이 시스템 디렉토리가 아니라 자신의 홈 디렉토리 아래이므로, 펄 스크립트가 실행될 때 그 모듈을 찾을 수 있도록 쉘 환경 변수를 지정해주거나 스크립트 내에 모듈 경로를 지정해야 한다.

이와 관련해서는 다음 문서를 참고할 것:

다음 문서들의 내용 중 일부는 위에 언급한 local::lib를 쓸 경우 의미가 없어질 듯 하지만, 여전히 참조할 만 하다:

4.1. 예: 주인장의 경우

GyparkWiki를 돌아가는 서버에서 주인장의 계정 디렉토리는 /home/gypark/이고, 일반적인 소스 패키지를 가져와서 설치할 때는 ./configure --prefix=~/local로 지정하여 /home/gypark/local/ 아래에 설치하는 편이다.

펄 모듈을 설치하는 경우에는 다음과 같이 한다. 시간 순으로 정리해 보면:

1) PREFIX를 지정하던 시기

처음에는 cpan 설정을 PREFIX를 사용했었다. [3]의 설명과 유사하다.
# cpan 옵션 중 makepl_arg 지정
makepl_arg      =>    PREFIX=~/local/perl

모듈은 ~/local/perl/lib/perl5/site_perl/5.8.8/ 또는 ~/local/perl/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/ 아래에 설치된다. 이 두 디렉토리를 PERL5LIB 환경 변수의 값으로 지정해 준다.

2) INSTALL_BASE를 지정하던 시기

그런데 이 makepl_arg 옵션은 Makemaker 를 사용할 경우에만 적용되고, Build.PL을 사용하는, 즉 Perldoc:Module::Build 모듈을 사용한 설치본에서는 통하지 않더라. 그래서 까페에 문의했더니 PREFIX보다 INSTALL_BASE를 지정하는 게 낫다고 하여, 겸사겸사 옵션을 바꿔주었다. (위에 언급한 aero님의 문서[4] 참조)
makepl_arg     =>   INSTALL_BASE=~/local/perl      # 이건 ExtUtils::MakeMaker 를 위한 설정
mbuildpl_arg   =>   --install_base ~/local/perl    # 이건 Module::Build 를 위한 설정

이젠 모듈을 설치할 때 "site_perl"같은 단계를 거치지 않고 막바로 ~/local/perl/lib/perl5 아래에 설치하게 된다. PERL5LIB의 값으로 ~/local/perl/lib/perl5 와 ~/local/perl/lib/perl5/i386-linux-thread-multi 두 경로를 지정해 준다.

3) local::lib 모듈을 사용

그러다가 다시 Cpan:local::lib 모듈을 써보기로 하고, aero님의 포스팅[2] 과 모듈의 문서를 참고하여서 설치하였다. local::lib 모듈의 설치 자체는 cpan을 사용하지 않고 직접 소스를 받아서 수행한다. (아래의 "cpan을 사용할 수 없는 상황이라면" 섹션 참조)
# .tar.gz 압축파일을 받아서 풀고, 생성된 디렉토리로 이동하여

# --bootstrap 옵션의 값으로, 내가 희망하는 ~/local/perl 디렉토리를 지정
$ perl Makefile.PL --bootstrap=~/local/perl
# 설치 - local::lib 모듈 자체도 ~/local/perl 아래에 설치된다.
$ make test && make install

# 환경변수를 설정하는 부분
# 모듈 도큐먼트에는 .bashrc 파일에 덧붙이는 걸로 나와 있는데
# 내 경우에는 예전부터 .bash_profile에다가 써왔기 때문에 여기서도 그 파일을 사용
$ echo 'eval $(perl -I$HOME/local/perl/lib/perl5 -Mlocal::lib=$HOME/local/perl)' >>~/.bash_profile

여기까지 하고 나면,
# cpan을 사용해서 모듈 설치시에 Module::Build 를 위한 옵션은 .modulebuildrc 파일에 저장됨
export MODULEBUILDRC="/home/gypark/local/perl/.modulebuildrc"

# cpan을 사용해서 모듈 설치시에 MakeMaker를 위한 옵션은 PERL_MM_OPT 변수에 저장됨
export PERL_MM_OPT="INSTALL_BASE=/home/gypark/local/perl"

# @INC에 추가될 디렉토리들.
# 내가 지정한 ~/local/perl    아래에
#                        lib/perl5
#                        lib/perl5/i386-linux-thread-multi
# 이렇게 두 개의 경로를 추가해 주고 있다.
export PERL5LIB="/home/gypark/local/perl/lib/perl5:/home/gypark/local/perl/lib/perl5/i386-linux-thread-multi:$PERL5LIB"

# PATH 변수 추가
# 모듈과 같이 설치되는 실행 파일들의 경로는 ~/local/perl 아래의 bin 디렉토리이다.
export PATH="/home/gypark/local/perl/bin:$PATH"

이젠 cpan의 옵션에서 makepl_arg, mbuildpl_arg 두 옵션의 값을 지정해 주지 않아도 된다.

5. MS윈도우 환경에서 Strawberry Perl이나 Activestate Perl을 사용하고 있다면

딸기 펄의 경우는 설치하고 나면 cpan 툴도 설치되어 있다. 명령 프롬프트 창을 열어서 cpan을 실행하거나, 시작메뉴의 딸기펄 폴더에 보면 "CPAN Client"가 있다.

모듈을 추가로 설치하면 딸기펄 설치 폴더\perl\site\lib 폴더에 설치된다. 딱히 설치 경로나 환경 변수를 만져줄 필요는 없을 것이다.

액티브 펄의 경우는... 주인장이 설치해 본 지 오래되어서 기억이 나지 않는다. cpan 툴을 따로 제공하는지 모르겠다. 액티브 펄은 이와 별개로 패키지 매니저를 따로 제공하여서 이를 이용하여 모듈을 설치할 수도 있는데, 이 경우 CPAN 사이트에 올라온 최신 버전의 모듈을 쓰지 못하고 구 버전을 써야 되는 경우도 있었던 걸로 기억한다.

5.1. Strawberry Perl 에서 cpan 을 사용할 때 압축해제 오류가 나는 경우

가장 최근에 겪은 Cpan:DateTime::Format::W3CDTF의 경우, 윈도우 명령프롬프트 창에서 cpan을 실행하고 install하려 하니 무수한 에러가 나오면서 실패했다. 그런데 에러 메시지 중에, DateTime\Format\W3CDTF.pm 모듈이 없다며 테스트를 실패하는 게 눈에 띄었다. 현재 설치하려는 모듈인데 그걸 찾을 수 없다니?

cpan 명령어 look 모듈명 해당 모듈을 설치하기 위해 압축을 푼 디렉토리로 들어가서 거기서 쉘을 띄운다.
cpan> look DateTime::Format::W3CDTF
이런 저런 메시지
D:\strawberry\cpan\build\DROLSKY-kq9vX6>
파일목록 확인
D:\strawberry\cpan\build\DROLSKY-kq9vX6>dir
 D 드라이브의 볼륨: DATA
 볼륨 일련 번호: 94B9-1803

 D:\strawberry\cpan\build\DROLSKY-kq9vX6 디렉터리

2010-09-29  오후 04:41    <DIR>          .
2010-09-29  오후 04:41    <DIR>          ..
2009-11-02  오전 07:04                79 00load.t
2009-11-02  오전 07:04             1,222 01parse.t
2009-11-02  오전 07:04             1,937 02bugs.t
2009-11-02  오전 07:04               748 Build.PL
2009-11-02  오전 07:04               471 Changes
2010-09-29  오후 04:41    <DIR>          DateTime
2010-09-29  오후 04:41    <DIR>          DateTime-Format-W3CDTF-0.05
2010-09-29  오후 04:41    <DIR>          Format
2010-09-29  오후 04:41    <DIR>          lib
2009-11-02  오전 07:04            20,545 LICENSE
2009-11-02  오전 07:04               476 Makefile.PL
2009-11-02  오전 07:04               188 MANIFEST
2009-11-02  오전 07:04               737 META.yml
2009-11-02  오전 07:04             2,444 README
2009-11-02  오전 07:04             1,363 SIGNATURE
2010-09-29  오후 04:41    <DIR>          t
2009-11-02  오전 07:04             5,476 W3CDTF.pm
              12개 파일              35,686 바이트

압축이 풀린 디렉토리 이름부터 좀 이상하다. 보통은 XML-RSS-1.48-Nmg8Ua 이런 식으로 모듈-버전-임시로 만든 문자열 형태로 되어야 하는데 여긴 모듈 저자 아이디 이름으로 나왔다. dir 로 파일 목록을 보면 그 안에 모듈 압축을 푼 디렉토리가 있고, 이것저것 깔려 있는데 뭔가 상당히 지저분하다. lib 디렉토리가 생겨 있긴 한데 그 안은 텅 비어있고, lib 안에 들어가 있어야 할 W3CDTF.pm 파일이 현재 디렉토리에 있다. 마찬가지로 t 디렉토리에 들어있어야 할 *.t 파일들이 다 현재 디렉토리에 있다.

이건 압축을 풀때 tar.gz 파일을 제대로 못 풀어서 생긴 문제다. 원인이 어느 쪽에 있는지는 모르겠다. 아뭏든 압축만 제대로 풀어주면 되는데, cpan 사이트에서 받아온 tar.gz 파일을 빵집으로 풀어봤으나 똑같은 결과가 나오더라. 별 수 없이 이제 설치를 수동으로 한다. 이제 쉘을 빠져나오고 확인해본다
D:\strawberry\cpan\build\DROLSKY-kq9vX6>exit

cpan> i DateTime::Format::W3CDTF
Module id = DateTime::Format::W3CDTF
    CPAN_USERID  DROLSKY (Dave Rolsky <autarch@urth.org>)
    CPAN_VERSION 0.05
    CPAN_FILE    D/DR/DROLSKY/DateTime-Format-W3CDTF-0.05.tar.gz
    UPLOAD_DATE  2009-11-01
    MANPAGE      DateTime::Format::W3CDTF - Parse and format W3CDTF datetime strings
    INST_FILE    D:\strawberry\perl\site\lib\DateTime\Format\W3CDTF.pm
    INST_VERSION 0.05 <-- 제대로 설치되었다

원인은 tar.exe?

내 PC에는 예전에 [GNU utilities for Win32]를 설치해서 몇가지 유닉스 유틸리티들을 윈도우에서도 사용할 수 있게 하였는데, 여기 있는 tar.exe 가 압축을 풀 때 문제가 있는 듯 하다. 여기 있는 tar.exe 를 지워주고 Strawberry Perl 패키지에 포함된 ptar.bat 이나 cygwin에 있는 tar.exe 를 쓰니 압축이 정상적으로 풀리는 것을 확인했음
-- Raymundo 2010-12-5 11:27 am

외부 tar.exe 를 쓰지 않게 하기

집의 경우는 위와 같이 해결되었는데, 학교 PC의 경우 위에 언급한 유닉스 유틸리티 세트의 tar.exe 를 지웠더니 그 다음은 TeX 패키지 안에 있는 tar.exe 를 쓰는데 이것도 같은 문제가 발생했다 -_-;

CPAN 설정에서 명시적으로 딸기펄 패키지에 포함된 ptar.bat 을 지정해주었더니 이게 옵션 형식이 다른지 압축을 풀 때 에러.

아예 외부 프로그램을 쓰지 않고 Archive::Tar 모듈을 사용하게 할 수도 있긴 한데, 그러려면 CPAN 옵션에서 외부 프로그램을 쓰지 말라고 명시를 해줘야 한다:
cpan> o conf init tar


The CPAN module will need a few external programs to work properly.
Please correct me, if I guess the wrong path for a program. Don't
panic if you do not have some of them, just press ENTER for those. To
disable the use of a program, you can type a space followed by ENTER.

 <tar>
Where is your tar program? []

외부 프로그램을 사용하지 않으려면, 스페이스를 입력하고 엔터를 누르라고 되어 있다. 그런데 막상 이렇게 입력해도, D:\strawberry\perl\lib\CPAN\Config.pm 파일에는
  'tar' => q[],
위와 같이 빈 스트링으로 저장되어 버리고, 결과적으로는 여전히 외부 프로그램을 찾아 사용하려고 한다.

그래서 명시적으로 빈 칸을 추가하여 'tar' => q[ ]로 저장해주었더니, 일단은 잘 되고 있다.

참고로 [Strawberry Perl과 CPAN 업데이트 문제점 (Couldn't untar xxx.tar, gzip: stdin: invalid compressed data--crc error)]이란 글을 구글링하다 발견하였는데, 여기서는 gzip과 tar 사이에 파이프 연결이 제대로 이뤄지지 않아 crc 에러가 나는 경우인 듯 하다.

6. cpan을 사용할 수 없는 상황이라면

어떤 이유에서는 cpan을 사용할 수 없다면, 별 수 없이 모듈 소스를 직접 다운받아서 설치를 해야 할 것이다.

다음 문서를 먼저 읽어본다. 만일 리눅스에서 어떤 프로그램의 소스를 받아 컴파일하고 설치해 본 적이 있다면, 펄 모듈도 거의 동일한 방식으로 진행된다:

Cpan:Net::Trackback 모듈을 예로 들어보자.

이 섹션의 나머지 내용은 몇 년 전에 작성한 것이라서, 위의 내용과 같이 읽어서 현재 상황에 맞게 바꿔야 할 것이다

6.1. 모듈 가져오기

http://search.cpan.org 에 가서 Net::Trackback 모듈을 찾는다.

Upload:installmodule01.png

아래와 같은 목록이 뜨는데, 버전이나 날짜를 고려하면 두 번째 것이 최신. 클릭해서 들어간다.

Upload:installmodule02.png

다음 그림에서, "Source"를 클릭하면 Trackback.pm 파일 하나를 받을 수 있다. 우리가 필요한 것은 이것 하나만이 아니므로, 패키지 전체를 다운받기 위해 "Net-Trackback-0.992"를 클릭한다.

Upload:installmodule03.png

패키지 정보가 나온다. "Download"를 클릭하여 tar.gz 로 압축된 파일을 받는다. 또는 저 링크를 복사하여 UNIX계정에서
$ wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMA/Net-Trackback-0.992.tar.gz
하여 계정으로 바로 받을 수 있다.

Upload:installmodule04.png

6.2. 서버 시스템에 모듈 설치하기

위에 링크한 참조 문서[5]의 얘기처럼
$ tar zxvf Net-Trackback-0.992.tar.gz   # 압축을 풀고
$ cd Net-Trackback-0.992                # 디렉토리로 들어가서
$ perl Makefile.PL
$ make
$ make test
$ make install                          # 이 네 과정을 거치면 설치 끝

perl Makefile.PL 했을 때 다른 모듈이 없다고 에러가 나오면 그 모듈을 먼저 설치해준다. 서버 root 정도라면 더 말하지 않아도 알 테니 이하 생략.

6.3. 개인 계정 아래에 모듈 설치하기

역시 마찬가지로,
$ tar zxvf Net-Trackback-0.992.tar.gz   # 압축을 풀고
$ cd Net-Trackback-0.992                # 디렉토리로 들어가서
$ perl Makefile.PL PREFIX=~/perl        # 뒤에 PREFIX 옵션을 준다
$ make
$ make test
$ make install                          # 이 네 과정을 거치면 설치 끝
이러면 모듈과 매뉴얼 페이지 등이 ~/perl 아래에 설치된다.1

그리고 이 디렉토리를 실행 스크립트 쪽에서 인식을 해야 하므로, *.pl 파일의 앞에 다음의 코드를 넣는다.
BEGIN { unshift(@INC, '/home/4/nyxity35/perl'); }

6.4. pm 파일만 가져다 놓기

주인장Nyxity님의 계정에 위의 방법으로 Net::Trackback 모듈을 설치하려 하였으나, 해당 서버의 경우 /bin/ 아래에 있는 실행파일들 일부를 일반 사용자가 실행하지 못하게 퍼미션을 막아버렸다. 그래서 make 가 제대로 수행되지 않는다. 즉 모듈 생성 자체가 되지 않는다. 어쩔까 고민하다가, 혹시나 하는 생각에 펄 모듈 패키지 내에 있는 *.pm 파일만 슬쩍 복사해서 가져와 봤는데, 아무런 문제가 없이 실행이 되어 버렸다. -_-;; 아래에서 그 과정을 설명한다.

먼저 ~/perl 디렉토리를 만든다.
$ make ~/perl       

wiki.pl 의 앞부분에 다음 코드를 삽입한다.
use lib '/home/*/nyxit***/perl';     # 이 부분 추가. '/home....perl/' 까지는 자신의 홈 디렉토리에 맞춰 써 준다
package UseModWiki;
use strict;
...

그 다음, 위키의 TrackBack 보내기를 작동시키면, 브라우저에 다음과 같이 모듈이 없다는 에러가 난다.

Upload:installmodule05.png

Net/Trackback/Client.pm 모듈이 없다고 했으니, 이 파일을 ~/perl/Net/Trackback/Client.pm 으로 카피해 주자는 거다. 근데 어차피 다른 모듈들도 필요하니, 처음부터 통채로 디렉토리 (이 경우 제일 앞에 있는 Net 디렉토리) 를 복사해 준다.
$ cp -r ~/temp/Net-Trackback-0.992/lib/Net ~/perl/
$ ls ~/perl
Net

서버 에러가 났던 브라우저 창을 새로고침 하면 이제는 다른 LWP/UserAgent.pm 모듈이 없다고 에러가 난다. 이것은 파일 이름에서 추측할 수 있듯이 LWP::UserAgent 모듈이고, 이것을 위의 모듈 가져오기 과정을 반복하면 libwww-perl-5.800.tar.gz 를 받아서 압축을 푼 상태가 되어 있을 것이다. 역시 ~/perl 로 복사해 준다.
$ cp -r ~/temp/libwww-perl-5.800/lib/* ~/perl/    # lib/ 아래에 LWP/UserAgent.pm 뿐 아니라 그냥 다른 것들도 죄다 복사했다. 귀찮으니까.
$ ls ~/perl/
Bundle  File  HTML  HTTP  LWP  LWP.pm  Net  WWW

이번에는 URI.pm 모듈이 없다고 에러가 난다. 역시 모듈 가져오기부터 반복하고 복사해 준다.
$ cp -r ~/temp/URI-1.31/URI.pm ~/perl/  # 특정 pm 만 복사하는 예
$ cp -r ~/temp/URI-1.31/URI ~/perl/     # 이 디렉토리 아래의 모듈도 어차피 나중에 필요하니 복사
$ ls ~/perl
Bundle  File  HTML  HTTP  LWP  LWP.pm  Net  URI  URI.pm  WWW

다시 브라우저로 가서 새로 고침하면, 성공했음을 알 수 있다.

Upload:installmodule06.png


정리하면, make, make test, make install 과정을 거쳐 설치할 경우, 의존성을 검사하고, 모듈을 만들고, 검사를 하고, 적절한 디렉토리에 모듈과 매뉴얼, 라이브러리 등을 복사한다. 그렇지만 펄 모듈 파일은 단지 perl 로 쓰여진 *.pm 파일일 뿐이므로, 이 파일만 원하는 디렉토리에 복사해 주고 써도 된다...라는 건데,

이 방법이 항상 통한다는 보장은 없다. 어떤 모듈은 Perl로만 작성된 게 아니라 C등의 네이티브한 언어를 사용하여 작성된 코드를 컴파일하여 연동한다. 이런 경우 .pm 파일만 복사한다고 제대로 동작하지는 않을 것이다.

6.5. 실행 스크립트와 같은 디렉토리에 모듈을 두기

위의 예에서는, ~/perl 디렉토리를 만들어 거기에 모듈을 놓고, wiki.pl 을 수정하여 ~/perl 디렉토리를 검사하도록 만들었다. 그런데 wiki.pl 등 실행 pl 파일 자체를 수정하는 것이 맘에 안 들거나, 수정하면 안 되는 경우가 생길 수 있다. 이럴 때는, 실행 pl 파일이 있는 디렉토리에 모듈을 두어도 된다. 단 디렉토리 아래에 한곳에 몰아넣는다고 되는 것은 아니고, 반드시 위에 ~/perl 에서처럼 모듈 명칭에 따른 경로를 지켜주어야 한다.

$cp -r ~/perl/* ~/www/wiki/    # ~/perl 아래 있는 디렉토리와 파일들을 wiki/ 디렉토리로 복사
$ls ~/www/wiki/                # 아래에서 보듯이, 모듈 파일과 디렉토리들 때문에 지저분해지는 것은 불가피
Bundle     HTML         kimsnobody.pl    PaintBBS.jar                          URI.pm
config.pl  HTTP         LWP              Readme_Shicyan_for_PaintBBS_jar.html  wiki.css
data       icons        LWP.pm           restore.pl                            wiki.pl
emoticon   icons-inter  mod_edithelp.pm  translations                          wikiscript.js
File       intermap     Net              URI                                   WWW

위와 같이 할 경우는 wiki.pl 을 고치지 않고, ~/perl 디렉토리를 지운 채로 실행해도 성공한다. 이것은 @INC 안에 기본적으로 "."(현재 디렉토리)가 포함되어 있기 때문인데, 이것도 어떤 시스템이나 통하는 방법인지는 모르겠다.

7. PPM 파일을 받아서 설치하기

Strawberry Perl에서 Cpan:Win32::GUI 모듈을 설치하려는데, Win32::GUI::DIBitmap 모듈을 gcc를 사용해서는 만들 수 없다며 스킵해 버렸다. 이 경우 Visual C 를 설치해야 하는데... 찾아보니 [Re^4: perl makefile.pl question]와, 이 글에서 언급하는 [I don't have PPM, how can I install a package?] 이런 글이 있어서, 마찬가지로 해 보았음.

8. 관련 링크

아래 문서들은 위의 문서들에 비해 오래된 내용을 담고 있다.

cpan의 단점을 보충하는 것들

9. Comments

thank you!!
-- justin 2012-7-17 2:37 pm
이름:  
Homepage:
내용:
 


컴퓨터분류
각주:
1. 여기서는 PREFIX를 ~/perl로 지정했는데, 앞서 언급한 것처럼 PREFIX대신에 INSTALL_BASE를 지정하는 것이 나을 듯 하다.

마지막 편집일: 2014-5-30 4:03 pm (변경사항 [d])
21804 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기