refactor: SearchModel 구조 개선 및 비동기 처리 최적화

- ChromeDriverManager.cs 제거하여 코드 중복 제거
- ILibrarySearcher 인터페이스의 StartDriver 메서드를 async로 변경
- KwangjuCityLibrarySearcher 및 NamguLibrarySearcher에 ChromeDriverHelper 적용
- 드라이버 생성 로직을 통합하여 일관성 있는 구조로 개선
- Check_copyWD.cs 및 DLS_Copy.cs에서 비동기 검색 처리 개선

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-12 19:36:53 +09:00
parent 4d1450d2c5
commit 0f3d985b82
8 changed files with 126 additions and 937 deletions

View File

@@ -10,6 +10,9 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using UniMarc.;
using OpenQA.Selenium.Chromium;
using UniMarc.SearchModel;
using System.Runtime.CompilerServices;
namespace BokBonCheck
{
@@ -206,8 +209,7 @@ namespace BokBonCheck
public int No { get; set; }
private ChromeDriver _driver;
private ChromeDriverService _service;
private ChromiumDriver _driver;
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
@@ -220,20 +222,7 @@ namespace BokBonCheck
this.No = no;
}
// 기존 StartDriver 메서드를 유지하여 호환성 보장
public void StartDriver(bool showBrowser)
{
try
{
// 동기적으로 실행 (권장하지 않음)
StartDriverAsync(showBrowser).GetAwaiter().GetResult();
}
catch (Exception ex)
{
Console.WriteLine($"StartDriver 실패: {ex.Message}");
throw;
}
}
public void StopDriver()
{
@@ -243,47 +232,22 @@ namespace BokBonCheck
_driver.Dispose();
_driver = null;
}
if (_service != null)
{
_service.Dispose();
_service = null;
}
}
public async Task StartDriverAsync(bool showdriver = false)
public async Task StartDriver(bool showdriver = false)
{
if (_driver == null)
{
try
{
// ChromeDriverManager를 사용하여 안정적으로 드라이버 설정
var driverPath = await ChromeDriverManager.SetupChromeDriverAsync();
// ChromeDriver 서비스 생성
_service = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath), Path.GetFileName(driverPath));
_service.HideCommandPromptWindow = true;
// 안정적인 Chrome 옵션 가져오기 (브라우저 창 숨김)
var options = ChromeDriverManager.CreateBaseChromeOptions(!showdriver);
// 추가 보안 및 안정성 옵션
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
options.AddArgument("--disable-blink-features=AutomationControlled");
options.AddExcludedArgument("enable-automation");
options.AddAdditionalOption("useAutomationExtension", false);
// ChromeDriver 생성
_driver = new ChromeDriver(_service, options);
// 웹드라이버 감지 방지
((IJavaScriptExecutor)_driver).ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
Console.WriteLine("NamguLibrarySearcher ChromeDriver 초기화 완료");
if (SeleniumHelper.IsReady == false) await SeleniumHelper.Download();
_driver = await SeleniumHelper.CreateDriver();
Console.WriteLine("NamguLibrarySearcher Driver 초기화 완료");
}
catch (Exception ex)
{
Console.WriteLine($"ChromeDriver 초기화 실패: {ex.Message}");
throw new InvalidOperationException($"ChromeDriver 초기화에 실패했습니다: {ex.Message}", ex);
Console.WriteLine($"NamguLibrarySearcher Driver 초기화 실패: {ex.Message}");
throw new InvalidOperationException($"NamguLibrarySearcher Driver 초기화에 실패했습니다: {ex.Message}", ex);
}
}
}
@@ -363,7 +327,7 @@ namespace BokBonCheck
// 드라이버가 없으면 자동으로 시작
if (_driver == null)
{
await StartDriverAsync();
await StartDriver();
}
_driver.Navigate().GoToUrl(SiteUrl);