# 라이브러리와 CLI 인터페이스 설명

## 1. 현재 구조

| 파일 | 주요 API | 역할 |
|------|----------|------|
| `src/dongnelibrary.ts` | `dongneLibrary`(default export) <br> `getAllLibraryNames()`<br> `getAllModuleNames()`<br> `resolveLibraryCount(libraryName)`<br> `searchAsync(opt, onResult?)`<br> `search(opt, onResult?, onComplete?)` | 실제 검색 로직과 데이터 구조를 담당 |
| `src/cli.ts` | `dl = require("./dongnelibrary")` <br> `dl.getAllModuleNames()`<br> `dl.searchAsync(opts, ...)` | 명령줄 인자를 파싱하고 결과를 포맷·출력 |

### 왜 자연스러운가?
1. **책임 분리** – 라이브러리는 검색 로직만, CLI는 UI(입력·출력)만 담당 → 테스트가 쉽고 유지보수 용이
2. **필요 API가 모두 공개** – CLI에서 바로 호출할 수 있는 `searchAsync`, `getAllLibraryNames` 등 필수 기능이 모두 제공
3. **타입 안전성** – `src/types.ts`에서 정의한 타입을 두 파일 모두 공유 → 컴파일 타임에 오류를 잡음

## 2. 개선·확장 제안 (필요 시 적용)
| 항목 | 현재 상태 | 추천 변경 |
|------|-----------|----------|
| **CLI 엔트리 포인트** | `#!/usr/bin/env node` + CommonJS `require()` | TypeScript/ESM(`import`)로 통일 → 번들 크기 감소 |
| **옵션 타입** | `SearchOptionsMain` 은 `libraryName: string | string[]` 허용 | CLI에서 전달 시 자동 변환 함수 추가 |
| **에러 처리** | `searchAsync` 에서 콜백으로 전달 | Promise `reject` 사용 → `try/catch` 로 간단히 처리 |
| **결과 포맷** | CLI 내부에서 `printBooks` 구현 | 라이브러리에 `formatResult()` 같은 포맷터 추가 → CLI 호출만으로 완료 |
| **테스트** | CLI 테스트(`cli.spec.js`) | 라이브러리 단위 테스트 강화, CLI는 통합 테스트에 집중 |
| **문서** | README 에 기본 사용법만 | JSDoc 풍부화 + CLI 샘플 스크립트 추가 |

## 3. 예시: “CLI 전용 래퍼” 도입
```ts
// src/dongnelibrary.ts (추가 예시)
export interface DongneLibraryCLI {
  /** CLI에서 바로 호출할 검색 래퍼 */
  searchBooks(opts: SearchOptionsMain, showUrl?: boolean): Promise<SearchResult[]>;
}

export const dongneLibraryCLI: DongneLibraryCLI = {
  async searchBooks(opts, showUrl) {
    const results = await searchAsync(opts);
    return results.map(r => ({
      ...r,
      booklist: r.booklist.map(b => ({ ...b, url: showUrl ? b.bookUrl : undefined })),
    }));
  },
};
```

```ts
// src/cli.ts (간소화 예시)
import { dongneLibraryCLI as dl } from "./dongnelibrary";

const results = await dl.searchBooks({ title, libraryName: libList }, showUrl);
results.forEach(r => console.log(formatResult(r)));
```

- **장점**
  - CLI는 “검색 + 출력”만 담당 → 코드가 훨씬 깔끔
  - 라이브러리는 순수 데이터 로직 + 포맷터만 제공 → 재사용성 증가

## 4. 결론
- 현재 구조는 **자연스럽고** 잘 설계돼 있음.
- 필요에 따라 위에서 제안한 **“CLI 전용 래퍼”**나 **포맷터 함수를 추가**하면 사용 편의성과 테스트 용이성이 한층 더 향상됩니다.

궁금한 점이나 실제 구현을 도와드릴 부분이 있으면 알려 주세요!