## 1️⃣ 현재 인터페이스가 어떻게 연결돼 있는지

| 구성요소 | 제공되는 것 | CLI에서의 사용 방식 |
|----------|-------------|---------------------|
| **`src/dongnelibrary.ts`** | • `DongneLibraryAPI` 인터페이스를 구현한 **기본(default) export** (`dongneLibrary`).<br>• 모든 공개 함수(`getAllLibraryNames`, `searchAsync` 등)를 **개별 export**로 내보냄.<br>• 타입 정의(`SearchOptionsMain` 등)를 `export type { … } from "./types"` 로 내보냄. | • CLI가 `import * as dl from "./dongnelibrary"` 로 네임스페이스를 가져온 뒤, `dl.getAllModuleNames()`, `dl.searchAsync(...)` 같은 함수를 호출함.<br>• 옵션 객체 타입(`SearchOptionsMain`)도 `./types` 에서 가져와 사용함. |

이렇게 하면 CLI가 필요로 하는 모든 API를 `dongnelibrary.ts` 에서 가져오기 때문에 두 모듈이 자연스럽게 연결됩니다. 타입스크립트가 인터페이스의 형태를 검사해 주므로, 코드가 서로 맞지 않으면 컴파일 단계에서 오류가 발생합니다.

---

## 2️⃣ 잘 동작하고 있는 부분

| ✅ | 이유 |
|----|------|
| **모듈 분리** – `dongnelibrary.ts`(라이브러리)와 `cli.ts`(실행파일)를 명확히 분리해 두었음. |
| **명시적 API** – `DongneLibraryAPI` 에 모든 공개 함수가 선언돼 있고, 파일에서도 한 번씩만 `export const …` 로 내보냄. |
| **타입 안전성** – `SearchOptionsMain`, `SearchResult` 등 타입을 두 파일에서 동일하게 가져와 사용해 오류를 방지함. |
| **기본(default) export** – `export default dongneLibrary` 로 한 번에 전체 API를 가져올 수 있음. |
| **확장성** – `LIBRARY_MODULES` 배열에 새로운 모듈을 추가하면 CLI 로직은 변하지 않음. |

---

## 3️⃣ 개선이 필요한 부분

| ⚠️ | 현재 문제 / 비효율성 | 해결 방법 |
|----|---------------------|-----------|
| **중복된 named export** | `export const getAllLibraryNames = …;` 뒤에 다시 `export { getAllLibraryNames, … };` 가 있어 같은 함수가 두 번 export 됨. | **한 가지 방식만 사용** (예: 개별 `export const` 로 끝내거나, 한 번에 블록 형태로만 내보냄). |
| **네임스페이스 import** | `import * as dl from "./dongnelibrary"` 은 전체 모듈을 가져오므로 사용하지 않는 함수가 포함될 수 있음. | **명시적 named import** 로 바꾸면 읽기 쉽고 트리쉐이크가 더 잘 동작합니다. |
| **기본 export와 named export 충돌** | `export const dongneLibrary` 와 함께 `export { … }` 를 두면 TypeScript에서 중복 오류가 발생할 수 있음. | **기본 export만 남기고, 필요하면 `export { dongneLibrary }` 로 별도 명시**. |
| **타입 재내보내기** | CLI가 `./types` 에서 직접 타입을 가져오는데, 라이브러리를 별도 NPM 패키지로 만들 경우 사용자가 `import { SearchOptionsMain } from "dongnelibrary"` 으로 가져오게 하면 좋음. | **루트에 `index.ts` 를 두고 `export * from "./types"` 로 재내보내기**. |
| **코드 중복 방지** | 라이브러리와 CLI가 공유해야 할 헬퍼 함수가 있다면 별도 모듈(`src/utils.ts`)에 두고 import 하면 좋음. | **공통 유틸리티를 별도 파일에 두고 둘 다 import**. |

---

## 4️⃣ 인터페이스를 깔끔하게 유지하기 위한 권장 패턴

1. **루트 `index.ts` 만들기**
   ```ts
   // src/index.ts
   export * from "./dongnelibrary"; // 모든 함수, 기본 export 포함
   export * from "./types";          // 타입 정의 재내보내기
   ```

2. **CLI에서 named import 사용**
   ```ts
   import {
     getAllModuleNames,
     searchAsync,
     resolveLibraryCount,
     // …필요한 함수들
   } from "./index";
   ```

3. **기본 export 한 번만 남기기**
   ```ts
   // src/dongnelibrary.ts
   const dongneLibrary: DongneLibraryAPI = { … };
   export default dongneLibrary;     // 한 줄만 남김
   ```

4. **타입 재내보내기**
   - NPM 패키지로 배포할 때는 `src/index.ts` 에서 타입도 함께 내보내면 사용자는 `import { SearchOptionsMain } from "dongnelibrary"` 으로 바로 가져올 수 있음.

5. **옵션 – 팩토리 함수**
   - 나중에 HTTP 클라이언트 같은 의존성을 주입해야 할 때는
     ```ts
     export const createDongneLibrary = (deps: { http?: HttpSession }) => {
       // deps.http 를 내부에서 사용
     };
     ```

이렇게 하면 **라이브러리와 CLI**가 서로 명확히 분리되고, 타입스크립트가 인터페이스를 검증해 주기 때문에 런타임 오류 없이 두 모듈이 자연스럽게 연결됩니다. 🚀