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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user