# 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 변환 테이블 필요
