티스토리 뷰

우리나라의 많은 공공도서관이 업무를 효율적으로 하고 싶어서인지 아니면 인력이 부족해서인 몰라도 도서를 구입할 때 각 도서에 대한 목록 정보를 공급자측에서 파일로 제공하거나 목록 입력을 대신하도록 요구하고 있는 것 같다. 사서 입장에서 보면 새로 들어오는 도서 정보를 하나씩 일일이 입력하기 보다는 공급하는 측에서 파일로 제공한다면 시스템에 해당 파일을 통해 버튼만 한번 클릭하면 일괄 입력되니까 업무도 효율화할 수 있을 것이다.
 
그렇다면 이처럼 여러 도서 정보를 한번에 입력하는데 사용하는 파일은 어떻게 만들어야 할까? 이런 배경하에 만들어진 것이 MARC(MAchine-Readable Cataloging) 표준이라는 것으로 1960년대에 미의회 도서관을 위해 처음 만들어졌고 지금은 전세계적으로 도서관 간의 정보 교류, 도서관 내부의 정보 관리등에 중요 표준으로 활용되고 있다. 북미에서 사용하는 USMARC, 유럽쪽의 UNIMARC, 한국의 KORMARC 등이 있는데 대부분 MARC21 규격에 호환된다고 한다. 자세한 사항은 http://en.wikipedia.org/wiki/MARC_standards이나 국립중앙도서관(http://www.nl.go.kr/)을 참조한다. 
 


 

위의 그림은 MARC 파일을 HEX 에디터로 살펴본 것으로, 1D(레코드구분자)/1E(필드구분자)/1F(데이터구분자) 라는 특수문자로 개별 항목의 끝을 표시하면서 목록 정보를 저장한다. MARC 파일은 파일 시스템을 표시하기 이한 FAT(File Allocation Table) 처럼 각 필드의 태그와 길이 시작위치를 헤더부에 기록하고 실제 필드 데이터는 헤더 이후에 기록하는 방식이다. 헤더+필드데이터 부분 앞에는 전체 길이 정보와 필드데이터의 시작 위치등을 가지고 있는 Leader부가 배치된다.
 
 
MARC 작성기의 결과물은 결국 위에서 잠깐 언급한 MARC 파일의 형태가 될것인데 이 MARC파일의 구체적인 구조와 구성 형태를 개발하는 것이 부담된다면 그 고민을 덜어주는 것이 바로 Z39.50 프로토콜이다. Z39.50 프로토콜은 도서관간의 정보 교류에 사용하는 통신 프로토콜인데 국립중앙도서관이나 미의회 도서관 같은 공공도서관은 Z39.50 프로토콜을 통해서 별도의 아이디나 비밀번호가 없어도 정보 검색이 가능하도록 서비스를 제공하고 있다.(http://www.loc.gov/z3950/agency/ 참조) 
 
Z39.50을 구현한 다양한 오픈소스 패키지가 있는데 그중에서 PHP에서도 사용할 수 있는 YAZ를 사용하면 목록 검색 결과를 스트링이나 XML 뿐만아니라 MARC 레코드 형태로도 받을 수 있기 때문에 별도로 MARC 파일을 제작하는 수고를 덜 수 있다. 아래의 그림은 yaz-client 도구로 국립도서관에 접속해서 특정 ISBN을 검색하는 과정이다.


 


 
본 포스팅에서 시도하는 MARC 작성기는 사용자가 ISBN을 바코드리더로 인식시키면 국립중앙도서관에서 해당 ISBN을 검색해서 전달된 MARC 파일을 저장해 두었다가 검색 및 MARC 저장 작업이 끝나면 일괄로 파일을 다운로드 시키는 구조로 프로그램을 작성하고자 한다.
 

* MARC 작성기 탭 추가

동운북스(OpenBiblio) 기반으로 MARC 작성기를 만들기 위해서 일단 기능을 수행하는 탭을 별도로 제작한다.
탭을 표시하는 로직은 shared/header_top.php코드에 있다.
아래의 코드 처럼 MARC 작성기 탭을 위한 코드를 추가한다.

    <?php if ($tab == "marc") { ?>
      <td  bgcolor="<?php echo H(OBIB_ALT1_BG);?>"><img src="../images/shim.gif" width="1" height="1" border="0"></td>
    <?php } else { ?>
      <td  bgcolor="<?php echo H(OBIB_ALT2_BG);?>"><img src="../images/shim.gif" width="1" height="1" border="0"></td>
    <?php } ?>


    <td bgcolor="<?php echo H(OBIB_BORDER_COLOR);?>"><img src="../images/shim.gif" width="1" height="1" border="0"></td>
    <td bgcolor="<?php echo H(OBIB_TITLE_BG);?>"><img src="../images/shim.gif" width="1" height="1" border="0"></td>
    <td bgcolor="<?php echo H(OBIB_BORDER_COLOR);?>"><img src="../images/shim.gif" width="1" height="1" border="0"></td>
 
탭을 추가하고 MARC 작성기 코드를 작성하여 아래와 같은 MARC 작성기 메인 화면을 제작했다.



 
각 탭을 클릭하면 탭에 해당하는 좌측 메뉴를 볼수 있는데 좌측 메뉴는 navbars폴더에 탭이름.php에 해당하는 코드를 추가하면 된다. 아래는 marc.php 코드 예제로 그룹을 관리하기 위한 메뉴와 그룹내 MARC 파일을 관리하기 위한 메뉴만 두었다.
 



<?php
  require_once("../classes/Localize.php");

  $navLoc = new Localize(OBIB_LOCALE,"navbars");


?>


<?php if ($nav == "list") { ?>
 &raquo; 그룹 목록<br>
<?php } else { ?>
 <a href="../catalog/marcindex.php" class="alt1">그룹 목록</a><br>
<?php } ?>


<?php if ($nav == "read") { ?>
 &raquo; 그룹 상세<br>
<?php } else { ?>
 <a href="../catalog/marcgroup.php" class="alt1">그룹 상세</a><br>
<?php } ?>


<a href="javascript:popSecondary('../shared/help.php<?php if (isset($helpPage)) echo "?page=".H(addslashes(U($helpPage))); ?>')"><?php echo $navLoc->getText("help");?></a>


 
 

* 그룹 관리하기

MARC 작성기를 단순하게 제작하기 위해서 DB를 사용하지 않고 각 그룹을 폴더로 제작하고 그룹에 대한 간단한 정보를 해당 폴더에 그룹이름.info 파일로 저장했다.
 
데이터베이스 스키마 없이 폴더와 파일 처리만으로 기능을 구현하므로 핵심 기능은 폴더를 열고 폴더에 있는 파일을 스캔하고 생성/삭제하는 작업으로 이루어 진다. 아래의 코드는 데이터 폴더를 스캔하면서 그룹 정보 파일을 읽고 MARC파일 정보를 추출하는 과정이다.
 


    $grps = array();
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            if (substr($file, 0, 1)==".") continue;
            if (filetype($dir . $file) != "dir") continue;
            $info = file_get_contents($dir . $file."/".$file.".info");
            if ($info===false) continue;
            $grps[$file] = trim($info);
        }
        closedir($dh);
    }
 
아래 그림은 MARC 그룹 관리 화면과 실제 저장 디렉토리 내역이다.



 
[root@books html]# ls -l -R marcdata/
marcdata/:
total 8
drwxr-xr-x 2 apache apache 4096 Dec 13 15:14 TEST1
drwxr-xr-x 2 apache apache 4096 Dec 13 15:16 TEST2

marcdata/TEST1:
total 4
-rw-r--r-- 1 apache apache 22 Dec 13 15:14 TEST1.info

marcdata/TEST2:
total 4
-rw-r--r-- 1 apache apache 24 Dec 13 15:16 TEST2.info
 
 

* MARC 추출 및 저장하기

MARC를 저장하고 관리할 그룹을 생성했으면 그룹 단위로 ISBN을 통해서 MARC를 추출 및 저장하기 위한 코드를 작성하면 된다.
아래의 그림은 ISBN을 바코드 스캐너로 읽어서 마크 파일을 자동 생성한 화면 예제이다.



 

추출한 ISBN 코드로 MARC를 추출하는 방법은 서두에서 언급한 것처럼 Z39.50을 구현한 YAZ를 이용하는 것으로 아래와 같이 수행하면 검색결과를 MARC레코드로 추출할 수 있고 이를 파일로 저장하기만 하면 된다.
 


        $yid = yaz_connect("korcis-net.nl.go.kr:55200/dan");
        yaz_syntax($yid, "usmarc");
        yaz_range($yid, 1, 1);
        yaz_search($yid, "rpn", '@attr 1=7 '.$newisbn);
        yaz_wait();
        $err = yaz_error($yid);
        if (!empty($err)) {
            $msg = "질의 실패 : $msg!";
            header("Location: ../catalog/marcgroup.php?grpid=$grpid&msg=".U($msg));
            exit;
        }
        $rec = yaz_record($yid, 1, "raw");


  
 

* MARC 파일 내보내기


위의 과정에서 그룹 단위로 저장한 MARC 파일들을 그룹 단위의 한 파일에 담아내면 되는데 그룹 폴더에 있는 파일을 그대로 차례로 이여 붙여도 되고 각 마크 레코드 단위로 줄끝에 개행 문자를 추가해주기도 한다.
파일이 제대로 생성되었는지는 목록관리>목록일괄입력에서 생성된 파일을 입력해 보면 된다.
다음은 위의 과정에서 생성한 마크 파일을 목록일괄입력으로 테스트한 결과이다.




이로써 단순한 기능의 MARC 자동 작성기를 만들어 보았다.
좀더 보완 한다면 ISBN이 없거나 잘못인쇄된 자료의 검색을 위한 자동 검색 기능 확장, MARC 들여오기시 도서관 별로 요구하는 필수 항목에 대한 태그 추가 기능등를 추가 하면 효율과 기능을 모두 만족하는 도구가 되지 않을까 싶다.

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

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

댓글
댓글쓰기 폼