티스토리 뷰

OPENAPI나 SRU를 활용해서 ISBN을 검색하는 방법은 이전글에서 다루었다.
그런데, 도서 정보를 시스템에 입력하다보면 발행년도가 오래되어 ISBN이 없거나 ISBN 바코드가 잘못 인쇄된 경우를 종종 만나게 된다.
  
이런 경우 해당 도서 정보를 일일이 입력할 수도 있겠지만,
책제목 일부를 가지고 공공도서관에서 정보를 검색하여 검색 결과를 시스템에 자동 입력하는 것도 작업을 수행하는 입장에서는 일의 효율성을 높일 수 있는 방안이 될 수 있다.
  
도서관 간의 정보 교환에 이용되는 프로토콜이 Z39.50 표준인데(http://en.wikipedia.org/wiki/Z39.50 참조) 이 프로토콜을 활용하여 공공도서관에서 정보를 추출하는 과정을 다루고자 한다.
국립중앙도서관에서 배포하는 자료를 참조해도 좋다.(http://www.nl.go.kr/kolisnet/faq/nl_info_z3950.pdf)
  
목록 등록 과정에 ISBN이 없는 도서를 만나면 책제목이나 출판사등을 기준으로 Z39.50을 이용한 검색을 수행하여,
검색 결과중에서 입력하려는  도서에 해당하는 정보가 있으면 해당 정보를 선택하여 목록과 사본을 자동으로 생성하는 과정으로 만들어 본다.
  
Z39.50 검색을 수행하는 시점은 OpenBiblio 서버에서 검색어를 입력받은 다음이므로 PHP기반의 Z39.50 클라이언트가 필요하다.
PHP기반의 Z39.50 클라이언트는 PHP-YAZ 프로젝트가 있다. PHP-YAZ에 대해서는 http://pecl.php.net/package/yaz 를 참조한다.

* PHP-YAZ를 사용하기 위한 준비

 
PHP-YAZ를 통해서 손쉽게 Z39.50클라이언트를 사용할 수 있지만 yaz관련 함수들이 PHP 기본 함수가 아니라 확장 함수이기 때문에 별도의 설치 과정이 필요하다.
  
특히, 윈도우에서 PHP-YAZ를 사용하기 위해서는 PHP버전에 맞는 yaz DLL을 설치해야하기 때문에 PHP 버전 선택에 주의해야 한다.
XAMPP 기반으로 설치를 설명할 때는 최신 버전 XAMPP를 사용해도 무방 했지만 이런 까닭에 2013년 3월 현재 php_yaz.dll의 PHP 최종 지원 버전이 5.3이기 때문에 PHP 5.3 기반의 XAMPP패키지인 xampp-win32-1.7.7-VC9-installer.exe를 설치하여 본 개발을 진행했다.
(다운로드는 http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/1.7.7/ 참조)
  
적절한 버전의 XAMPP가 준비되었으면 http://ftp.indexdata.dk/pub/phpyaz/win32/에서 최신 버전을 다운로드 받아 설치한다.
예제에서는 http://ftp.indexdata.dk/pub/phpyaz/win32/php-5.3.6/1.1.1/release_ts/ 에서 php_yaz.dll를 다운로드 받는다.
(다운로드시 반드시 release_ts 폴더인지를 꼭 확인해야 합니다)
  
다운로드 받은 php_yaz.dll는 OpenBiblio를 XAMPP 기반으로 설치했다는 가정하에(무료 도서 관리 프로그램 OpenBiblio 설치하기 참조) 
C:\xampp_book\php\ext 폴더에 저장한다.
  
XAMPP와 php_yaz.dll이 준비되었으면 http://ftp.indexdata.dk/pub/yaz/win32/에서 YAZ toolkit 최신 버전을 다운로드 받아 설치한다.
예제에서는 yaz_4.2.51.exe를 다운로드 했다. YAZ toolkit은 독립적인 yaz 클라이언트와 서버를 내장하고 있는 패키지로 php_yaz.dll에서 YAZ Toolkit의 일부 DLL을 사용하므로 설치가 필요하다.
   
설치는 간단한데 우선 아래 그림과 같이 라이선스에 동의한다.


   

그리고 YAZ 여러 패키지 중에 Runtime만 설치한다.



    

설치 위치를 꼭 기억해 두고 Install을 클릭하면 설치를 시작한다.




설치가 끝나면 아래 그림과 같이 YAZ 서버나 클라이언트 프로그램을 사용할 수 있다.


   

  
YAZ Toolkit 설치가 끝나면 YAZ설치 위치(C:\Program Files\YAZ) 아래의 bin 폴더에서 yaz4.dll, libxslt.dll, libxml2.dll를  복사하여 XAMPP폴더>Apache>bin 폴더에 복사한다.
  
XAMPP, php_yaz.dll, YAZ Toolkit, YAZ DLL복사까지 끝났으면 마지막으로 XAMPP설치 폴더>php>php.ini를 수정하여 php_yaz.dll이 가동되도록 한다. php.ini에서 아래의 그림과 같이 extension=php_yaz.dll을 추가하고 저장한 다음 Apache 서버를 Stop/Start시키면 사용준비가 된것이다.


  

  

* PHP-YAZ 테스트하기

여러 Z39.50 서버가 있지만 이번 예제에서는 국립중앙도서관과 미국의회도서관 서버만을 대상으로 한다.
국립중앙도서관에서는 인코딩에 따라 두가지 주소를 제공하는데
한글 인코딩을 EUC-KR로 사용할 경우에는 korcis-net.nl.go.kr:55200/dan  을 사용하고
한글 인코딩을 UTF-8로 사용할 경우에는 korcis-net.nl.go.kr:55201/dan  을 사용하면 된다. OpenBiblio에서 인코딩을 UTF-8로 사용하므로 후자를 적용하고자 한다.
미국의회도서관의 경우에는 z3950.loc.gov:7090/voyager 를 주소로 사용한다.
  
PHP-YAZ 테스트를 위한 코드는 아래와 같다.

<?php
$host=$_REQUEST[host];
$query=$_REQUEST[query];
$num_hosts = count($host);
if (empty($query) || count($host) == 0) {
   echo '<form method="get">
   <input type="checkbox" checked="checked"
   name="host[]" value="korcis-net.nl.go.kr:55201/dan" />
       국립 중앙 도서관
   <input type="checkbox" checked="checked"
   name="host[]" value="z3950.loc.gov:7090/voyager" />
       미국 의회 도서관
   <br />
   RPN Query:
   <input type="text" size="30" name="query" />
   <input type="submit" name="action" value="Search" />
   </form>
   ';        
} else {
   echo '검색어 ' . htmlspecialchars($query) . '<br />';
   for ($i = 0; $i < $num_hosts; $i++) {
       $id[] = yaz_connect($host[$i]);
       yaz_syntax($id[$i], "usmarc");
       yaz_range($id[$i], 1, 10);
       yaz_search($id[$i], "rpn", $query);
   }
   yaz_wait();
   for ($i = 0; $i < $num_hosts; $i++) {
       echo '<hr />' . $host[$i] . ':';
       $error = yaz_error($id[$i]);
       if (!empty($error)) {
           echo "Error: $error";
       } else {
           $hits = yaz_hits($id[$i]);
           echo "Result Count $hits";
       }
       echo '<dl>';
       for ($p = 1; $p <= 10; $p++) {
           $rec = yaz_record($id[$i], $p, "string");
           if (empty($rec)) continue;
           echo "<dt><b>$p</b></dt><dd>";
           echo nl2br($rec);
           echo "</dd>";
       }
       echo '</dl>';
   }
}
?>

  
코드를 실행시키면 아래와 같은 화면이 나오는데 이때 검색어 입력하면 선택한 Z39.50 서버들을 동시 검색 하여 그 결과를 보여주는 단순한 코드이다.




  

각 서버당 10개의 결과를 보내도록 요구하고 있는데 다음은 국립중앙도서관과 미국의회도서관을 동시 검색한 결과중 일부이다.

korcis-net.nl.go.kr:55201/dan:Result Count 70
1
00946nam 2200241 c 4500
001 UB20080010367
005 20080130125628
008 080130s2007 ulka 001 kor 
020 $a 9788979143416 $g 18000: $c \28000
035 $a (141077)KMO200800346
040 $a 141077 $c 141077
056 $a 005.43 $2 4
100 1 $a 우재남
245 20 $a (뇌를 자극하는)Redhat fedora= $x Redhat fedora linux server & network: $b 리눈스 서버 & 네트워크/ $d 우재남 지음
260 $a 서울: $b 한빛미디어, $c 2007
300 $a 836p.: $b 삽도; $c 26cm+ $e CD-ROM 4매
500 $a 권말부록으로 "100대의 PC에 리눅스 설치하기", "RAID1에 리눅스 설치하기", "Vmware workstation 5.x다운로드"수록
504 $a 색인수록
650 8 $a 리눅스[Linux]
650 8 $a 서버[server]
653 $a 뇌를 $a 자극하 $a REDHAT $a FEDORA $a 리눈스 $a 서버 $a 네트워크 $a LINUX $a SERVER $a NETWORK
700 1 $a 우재남
950 0 $b \28000

2
00767nam 2200217 k 4500
001 UB20040120463
005 20040423154316
008 040423s2004 ulka 001a kor 
020 $a 8975601498 $g 03000: $c \33800
035 $a (111004)KMO200401687
040 $a 111004 $c 111004
056 $a 005.43
100 1 $a 신재훈
245 20 $a (redhat) 리눅스 9.X: $b 네트워크 & 웹 서버 무작정 따라하기/ $d 신재훈 지음
246 14 $a 무작정 따라하기 Redhat 리눅스 9.x
260 $a 서울: $b 길벗, $c 2004
300 $a 1063p.: $b 삽도; $c 26cm+ $e CD-ROM 4매
490 00 $a 무작정 따라하기 시리즈; $v 79
504 $a 찾아보기 : p.1057-1063
653 $a 리눅스 $a 9X $a 네트워크 $a 웹 $a 서버 $a 무작정 $a 따라하기 $a REDHAT $a 9X
950 0 $b \33800
z3950.loc.gov:7090/voyager:Result Count 26
1
01043cmm 22002777a 4500
001 12419601
005 20040305160828.0
007 co |||||||||||
008 010524s1999 cau b eng 
906 $a 7 $b cbc $c orignew $d 2 $e ncip $f 20 $g y-gencompf
925 0 $a acquire $b 1 shelf copy $x policy default
955 $a vb28 05-24-01 $h vb35 2004-03-03 $e vb35 2004-03-05 To BCCD
010 $a 2001561777
040 $a DLC $c DLC
050 00 $a TR899
245 00 $a Burstware $h [electronic resource].
250 $a Version 1.2.
260 $a San Francisco, CA : $b Instant Video Technologies, $c c1999.
300 $a 1 CD-ROM ; $c 4 3/4 in. + $e 1 manual.
538 $a System requirements for PC: Pentium II 300MHz; Windows NT service pack 3, or Linux RedHat 6.0.
538 $a System requirements for SPARC: Ultra series 300MHz; Solaris 2.6.
500 $a Title from disc label.
520 $a Video and audio editing software.
500 $a Production level cataloging. $5 DLC
650 0 $a Digital video $v Software.
650 0 $a Computer sound processing $v Software.

2
01504cam 22002894a 4500
001 15253496
005 20080409085838.0
008 080409s2007 caua 001 0 eng 
906 $a 7 $b cbc $c origres $d 3 $e ncip $f 20 $g y-gencatlg
925 0 $a acquire $b 1 shelf copy $x policy default
955 $a jp00 2008-04-09 z-processor $i jp18 2008-04-09 $e jp18 2008-04-09 to BCCD
010 $a 2008530648
020 $a 0805372482 (student ed.)
020 $a 0321499719 (instructor ed.)
020 $a 0805376984 (CD-ROM version of e-book)
020 $a 0321491866 (CD-ROM Voyager: SkyGazer)
040 $a DLC $c DLC
050 00 $a QB43.3 $b .C68 2007b
245 04 $a The cosmic perspective / $c Jeffrey Bennett ... [et al.].
250 $a 4th ed., media update.
260 $a San Francisco : $b Pearson/Addison-Wesley, $c c2007.
300 $a 1 v. (various pagings) : $b ill. (chiefly col.) ; $c 28 cm + $e 2 CD-ROMs (4 3/4 in.).
500 $a Accpmpanied by CD-ROM (electronic textbook) and CD-ROM (college ed. of the software Voyager SkyGazer version 3.7).
500 $a Includes index.
538 $a System requirements for CD-ROMs: Windows: 250 MHz CPU: OS Windows 2000, ME, XP ; Macintosh: 233MHz ; CPU: OS 9.2, 10.2, 10.3; All: RedHat Linux 8.0, 9.0; 64MB RAM minimum; 12MB hard disk space; 1024 x 768 screen resolution; CD-ROM drive; Browsers (OS dependent): Firefox 1.5, IE 5.5 Service Pack 2, 6.0, Netscape 7.0, 7.1, 7.2, Safari 1.3, 2.0, Camino 1.0.1; Flash 8.0.
650 0 $a Astronomy $v Textbooks.
700 1 $a Bennett, Jeffrey O.

  
  
위의 검색 결과에서 보듯이 MARC 형태의 자료로 전달되므로 정보를 받는 입장에서는 정보를 최대한 활용 할 수 있는 장점이 있다.
  
PHP-YAZ는 RPN(Reverse Polish Notation) 쿼리만 지원하므로 yaz_search 함수에서 두번째 파라미터로 "rpn"을 지정해야 한다. yaz_search 함수의 세번째 파라미터에 입력하는 검색어는 단순 텍스트라면 단순 검색이 이루어지지만 '@and @attr 1=4 "structured computer" @attr 1=1003 "tanenbaum"'와 같이 복잡한 쿼리를 입력할 수도 있다. 관련 내용은 PHP yaz_search 매뉴얼을(http://php.net/manual/en/function.yaz-search.php) 참조한다. 
  
사용자 입력에 따라 제목 검색과 저자 검색을 적절하게 배치하여 검색 결과 후보군을 최소화할 필요가 있다.
  
  
  

* Z39.50 검색을 통한 도서 자동 등록




  

OpenBiblio>목록관리 화면에 위의 그림과 같이 Z39.50 검색을 통한 도서 자동 등록 기능을 배치했다.
목록등록 시점에 자료 종류와 분류는 반드시 필요하므로 바코드를 통한 ISBN 검색 자동 등록과 마찬가지로 자료 종류와 분류 선택이 먼저 오도록 했고 반복적인 검색 및 등록 과정의 경우에는 작업의 효율성을 위해서 선택 내용이 유지되도록 했다.
  
그런데, ISBN이 아닌 제목 검색의 경우에는 국립 중앙 도서관과 미국 의회 도서관의 수백만 목록 중에 검색하는 것이므로 등록 후보군이 상당히 많으므로 사용자로 하여금 저자, 출판사 등의 추가 검색 항목으로 범위를 좁힐 수 있도록 배려할 필요가 있다. 


  

위의 그림은 제목에 "데이터베이스"라고 입력한 검색 결과로 국립중앙도서관과 미국의회도서관 각각 최대 20개씩만 출력하도록 프로그램을 제작했는데 양쪽 모두 합해서 3050건의 항목이 있으니 이중에서 등록하려는 책을 고르기란 어려울 수 밖에 없다는 이야기다.
그래서 아래의 그림과 같이 화면 상단과 하단에 직전 검색을 기반으로 필터링을 계속할 수 있도록 목록관리 링크를 두어 검색 범위를 좁혀갈 수 있도록 했다.



  

  한가지 주의할 점은 미국의회도서관의 Z39.50 검색 결과가 MARC-8 인코딩(http://en.wikipedia.org/wiki/MARC-8 참조)이라서 검색 결과를 그대로 출력하거나 저장하면 아래의 그림처럼 깨지는 문자가 발생한다.



  

이런 경우에는 yaz_record 함수로 레코드 정보를 읽어 낼때 아래의 코드 예제와 같이 인코딩 변환 지시를 첨가해 주어야 한다. 단, 국립중앙도서관은 결과를 MARC-8이 아닌 UTF-8로 전달하므로 변환 지시를 적용해서는 안된다.
  

         if (strstr($host[$i], "voyager")) {
           $rec = yaz_record($id[$i], $p, "array;charset=marc-8,utf-8");
           $flag_usloc = true;
         } else {
           $rec = yaz_record($id[$i], $p, "array");
         }

 
또한, 전달된 MARC정보를 전부 데이터베이스에 입력할 수도 있지만, 불필요한 정보까지 입력하므로 내용이 지저분해질 가능성도 있다. 특히 USMARC와 KORMARC 간의 차이로 동일한 MARC 레코드가 양측간에 서로 다른 의미로 사용될 가능성도 있으므로 적용 과정에서 입력할 MARC 레코드의 태그를 지정하는 방식으로 적용했다. 지정한 태그 이외의 레코드는 무시하는 방식이다. 적용한 MARC 레코드 아래와 같다.
  

  $marcrec = array('245a'=>'제목', '245b'=>'총서사항', '100a'=>'저자', '010a'=>'미국국회도서관 제어번호', 
    '012a'=>'국립중앙도서관 제어번호', '020a'=>'ISBN', '056a'=>'한국십진분류', '082a'=>'듀이십진분류기호', 
    '250a'=>'판사항', '260a'=>'출판지역', '260b'=>'출판사', '260c'=>'출판년도', '300a'=>'특정자료종별과 수량', 
    '300b'=>'기타 물리적 특성', '300c'=>'크기', '440a'=>'총서표제', '650a'=>'주제명',
    '700a'=>'연관저자', '856u'=>'URL (Uniform Resource Identifier)');  

  
아래의 그림들은 1978년도에 출판된 "PROGRAMMING WITH FORTRAN"이란 책의 검색-선택등록-등록결과의 화면이다.



제목은 뒷부분 "WITH FORTRAN"만 했고 공저자인 "POE"를 검색에 추가했다.

  



한국과 미국에 각각 1권씩 검색되었고, 한국쪽 정보 앞에 있는 [선택등록] 버튼을 클릭했다.

  



책 등록 결과화면으로 자료종류와 분류가 입력 상태로 유지되어 연속적인 검색 작업에 도움을 준다.

  




자동으로 추가 등록했던 목록 정보와 사본 정보이다. 

 

 

(주)동운시스템 전화 041-358-3760

동운북스 소개 바로가기
[온라인 문의 및 견적요청]

댓글
댓글쓰기 폼