# KORMARC / MARC21 서지파일 핸들링 정보 수집 ## MARC21이란? - **M**achine-**R**eadable **C**ataloging - 도서관 서지 데이터 표준 형식 - ISO 2709 기반 바이너리 포맷 - 레코드 구조: 리더(24바이트) + 디렉토리 + 필드 데이터 ## 레코드 구조 ``` [리더 24바이트][디렉토리][필드1][필드2]...[필드n][레코드 종료 문자(0x1D)] ``` ### 리더 (Leader) - 24바이트 고정 길이 - 레코드 길이, 상태, 레코드 유형, 지시자/서브필드 길이 등 포함 ### 필드 구조 - **제어 필드 (001~009)**: 지시자/서브필드 없음, 데이터만 - **데이터 필드 (010~999)**: 지시자 2개 + 서브필드 (delimiter `$` + 코드 + 데이터) - 예: `245 10$a제목$bsubtitle` ### 주요 태그 | 태그 | 내용 | |------|------| | 001 | 제어번호 | | 005 | 최종 수정일시 | | 008 | 고정길이 데이터 (언어, 출판국 등) | | 020 | ISBN | | 040 | 카탈로그링 기관 | | 100 | 주 저자 | | 245 | 제목 | | 250 | 판사항 | | 260 | 출판정보 | | 300 | 물리적 설명 | | 500 | 일반 주석 | | 650 | 주제 (LC) | | 700 | 부가 저자 | | 856 | 전자 자원 URL | ## KORMARC - 한국형 MARC 형식 - MARC21을 기반으로 한국 서지 특화 - 차이점: - 한글 처리 (EUC-KR 또는 UTF-8) - 한국 도서관 분류법 연동 - 국립중앙도서관 기준 - 일부 필드/서브필드가 한국 특화 ## Python 라이브러리 ### pymarc (핵심) - **설치**: `pip install pymarc` - **용도**: MARC21 읽기/쓰기/수정 - **기능**: - `MARCReader`: 배치 파일 읽기 - `Record`: 단일 레코드 객체 - `Field`: 필드 (태그 + 지시자 + 서브필드) - `Subfield`: 서브필드 (코드 + 값) - MARC/XML 변환 - MARC/JSON 변환 - MARC/CSV 변환 ### pymarc 기본 사용법 ```python from pymarc import MARCReader, Record, Field, Subfield # 읽기 with open('data.mrc', 'rb') as fh: reader = MARCReader(fh) for record in reader: print(record.title) # 245 필드 자동 추출 print(record['245']['a']) # 서브필드 직접 접근 print(record.isbn()) # 020 필드 자동 추출 # 쓰기 record = Record() record.add_field( Field(tag='245', indicators=['1', '0'], subfields=[ Subfield(code='a', value='제목'), Subfield(code='b', value='부제목'), ]) ) record.add_field( Field(tag='100', indicators=['1', ' '], subfields=[ Subfield(code='a', value='저자명'), ]) ) # 파일 저장 with open('output.mrc', 'wb') as fh: fh.write(record.as_marc()) ``` ### 기타 라이브러리 | 라이브러리 | 용도 | |-----------|------| | `pymarc` | MARC21 읽기/쓰기/수정 (핵심) | | `marcjson` | MARC → JSON 변환 | | `pymarc[xml]` | MARC → MARCXML 변환 | | `tablib` | 범용 데이터셋 (CSV/JSON/XLS 지원) | | `pydantic` | 데이터 모델 검증 | ## MARC 바이너리 포맷 상세 - 인코딩: ISO 2709 - 레코드 종료: `0x1D` (GS) - 필드 종료: `0x1E` (RS) - 서브필드 구분: `0x1F` (US) 또는 `$` - 리더 길이: 24바이트 (고정) - 디렉토리: 각 필드의 태그(3) + 길이(4) + 위치(5) = 12바이트 × 필드 수 ## LLM 연동 아이디어 1. **일괄 편집**: 여러 레코드의 특정 필드를 LLM으로 일괄 수정 2. **자동 분류**: 제목/초록 기반 주제 분류 3. **형식 변환**: 자연어 → MARC 레코드 생성 4. **검증**: MARC 규칙 준수 여부 자동 확인 5. **번역**: 필드 값 번역 (다국어 서지 작성) ## 한국 국립중앙도서관 참고 - KORMARC 사양: https://www.nl.go.kr - KORMARC는 MARC21을 기반으로 한국 특화 필드 추가 - 인코딩: UTF-8 권장 (구형은 EUC-KR) - 필드 매핑: MARC21 ↔ KORMARC 변환 테이블 필요