리크 테스트 gui
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
27 KiB

# [5단계] 프로젝트 전체 구현 현황 및 개발 과정 이력 (Project Implementation & Development History)
본 문서는 Windows 기반 Air Leak Test 장비의 제어 및 모니터링 시스템(WPF Leak Test System)의 전체적인 기능 명세, 하드웨어 연동 규격, 그리고 프로젝트가 시작된 이래의 개발 이력 전체를 포괄하여 기록한 문서입니다.
---
## 1. 프로젝트 개요 (Project Summary)
본 시스템은 생산 라인(EOL)의 Air Leak Test(기밀 시험) 장비를 직접 제어하고, 실시간 계측값을 수집하여 합불 판정(OK/NG)을 내리는 Windows 데스크톱 GUI 프로그램입니다.
* **구조**: WPF(C#) 기반의 MVVM 패턴을 충족하며, UI 컴포넌트(View)와 비즈니스 서비스(Service), 하드웨어 통신 드라이버가 서로 역할 분리(Decoupling)되어 있습니다.
* **통신 핵심**: RS-232/Serial 기반의 누수 감지 센서 및 ADLINK DIO/ID 판독용 스마트 보드와의 실시간 동기 및 제어를 지원합니다.
---
## 2. 프로젝트 전체 핵심 기능 명세 (Core Features)
### 2.1 실시간 시험 모니터링 (Home View)
* **독립 2채널 제어**: 좌(LEFT) 및 우(RIGHT) 채널이 개별 워커 스레드로 구동되어 상호 간섭 없이 동시에 또는 순차적으로 기밀 시험을 제어하고 측정값(sccm)을 시각화합니다.
* **실시간 상태 지시**: 판정 결과(`OK`=녹색, `NG`=적색)에 따라 각 채널 카드배경이 반응형으로 자동 전환되며, 하드웨어 레벨의 진행 상태 및 에러 메시지를 표시합니다.
* **센서 ID 실시간 매핑**: 각 채널 아래 제품 ID(제조년월일, 시리얼, 제품 모델 기종 등)를 실시간 바인딩합니다.
* **독립 ID 테스트**: 좌/우 별도의 'ID Test' 동작 모드를 지원하여 시험 프로세스 동작 없이 센서와의 단독 연결 및 데이터 복구 상태를 점검할 수 있습니다.
### 2.2 자동 시험 제어 프로세스 (TestProcessService Loop)
생산 장비의 DIO 시작 스위치 물리 접점 신호를 수집하여 작동하는 백그라운드 스레드 제어 루프입니다.
1. **시작 신호 트리거**: `LEFT_START` / `RIGHT_START` 접점 신호 OFF $\rightarrow$ ON 감지 시 락(Lock) 획득 및 기상.
2. **제품 정보 판독**: `Board4251SensorService`를 통해 제품 센서 메모리에서 16자리 ID 취득.
3. **LEAK 시험 및 수집**: Sentinel C28 누수 측정기로부터 최종 패킷 수신 대기 (최대 30초).
4. **교차 검증 및 판정**: 설정된 상하한 스펙(SpecUL/LL) 기반 합불 판정과 C28 기기 자체 판정(Accept/Reject)을 비교 검증(`SpecMismatch` 감지 시 경고 팝업).
5. **데이터 영속화**: 로컬 CSV 로그와 MSSQL 서버 데이터베이스에 이중 쓰기 수행.
6. **디지털 물리 출력**: 판정 결과에 맞춰 `LEFT_OK` / `LEFT_NG` 등 하드웨어 포트에 전송.
### 2.3 데이터 조회 및 CSV 내보내기 (Data History)
* **고성능 조회 및 필터링**: 기간, 판정 결과, 작업자, 로트 번호, 모델 등의 조건으로 MSSQL 이력 데이터를 신속 조회합니다. (DB 단절 시 로컬 일일 CSV 백업 파일 자동 파싱 Fallback 내장)
* **격자 스타일 유지**: 데이터가 전혀 없는 상태에서도 엑셀 양식과 동일하게 최소 50행의 빈 격자를 유지하여 UI 일관성을 확보합니다.
### 2.4 환경 설정 및 핫 리로드 (Configuration & Hot Reload)
* **XML 설정 파일 (`config.xml`)**: C28 센서 통신 포트 및 보드레이트, ADLINK 보드 번호 및 연결 대기 시간 등을 영속 저장합니다. 설정 갱신 시 `ConfigChanged` 이벤트를 통해 가동 중인 스레드를 안전하게 자동 재시작(Hot Reload)합니다.
* **INI 설정 파일 (`Settings/DioConfig.ini`)**: DIO 보드의 모델과 접점 이름, 핀 설명 매핑 테이블을 관리하며 프로그램 재작동 시 해당 구조로 동적 빌딩됩니다.
---
## 3. 기기 통신 프로토콜 및 예외 처리 규격 (Hardware Interface)
### 3.1 Sentinel C28 (Leak Test 장비)
* **통신 조건**: RS-232, 9600 Baud, 8N1.
* **프레임 구조**: `[CRC-8 체크섬 (2자리 Hex)][Sequence 번호 (2자리 Hex)][Payload 길이 (3자리 Hex)] [Data Type][Data Payload]\r\n`
* **교차 판정**: C28 기기의 자체 판정값(Pass/Fail/Accept/Reject)과 프로그램 상하한 스펙 판정 결과를 A/R 형식으로 정규화하여 교차 검증을 강제합니다.
### 3.2 ADLINK Board 4251 (ID 판독기 및 컨트롤러)
* **채널 다중화**: 1개의 시리얼 포트를 좌/우 채널이 공유하며, 패킷 헤더 내 채널 번호(`001`=좌, `002`=우)로 식별합니다.
* **ID 판독 2단계**:
1. 보드 상태 조회 명령: `x00c_00{ch}101:owt28006727ea97c7801\r\n` $\rightarrow$ `Success` 시 다음 단계 진행.
2. 16자리 ID 조회 명령: `x00c_00{ch}101:ow2800326003e\r\n` $\rightarrow$ `[A-Za-z0-9]{16}` 매칭 필터링.
* **끝자리 'F' 재시도 알고리즘**:
* 제품 ID를 읽었을 때 끝자리가 'F'인 경우, 데이터 불안정 오류일 수 있으므로 **350ms 간격으로 최대 3회(초회 포함)**까지 재시도 통신을 수행합니다. 3회 모두 'F'일 경우 최종 실패 경고 로깅 후 그대로 전달합니다.
---
## 4. 전체 개발 이력 연혁 (Development Timeline History)
### 📅 2026-04-10 (4251 보드 통합 및 단독 테스트 기능 탑재)
* **내용**: 좌우 기밀 센서의 시리얼 통신 포트를 하나의 COM 포트로 묶는 듀얼 채널 통합(`Board4251Service.cs`)을 구현했습니다.
* **기능**: ID 센서 자체 상태를 확인하여 `Fail` 시 동작을 중단하는 게이트키퍼 코드를 안착시키고, 현장에서 센서만 별도로 연결 상태를 점검할 수 있는 `ExecuteSensorTestAsync` (ID Test L/R) 수동 모드를 추가하였습니다.
### 📅 2026-04-13 (측정 타임아웃 고도화 및 통신 리트라이 고안)
* **내용**: 기계식 누수 계측 도중 30초 시간 초과(Timeout)가 나면 로그 및 데이터 유실이 발생하던 문제를 해결했습니다.
* **기능**: 타임아웃 발생 시에도 `SensorJudgment="T/O"`, `Judgment="NG"`로 명확히 판정을 세팅하여 실시간 화면 Grid 및 일일 CSV 로그 파일에 기록하도록 개선하고, 이 시점에도 DIO 하드웨어 단에 불합격(NG) 디지털 출력을 물리 전송하게 하였습니다.
* **기능**: 4251 보드에서 간헐적으로 오동작 값이 수집되던 이슈를 방지하기 위해 **끝자리 'F' 판별 재시도 알고리즘(최대 3회)**을 개발해 연동했습니다.
### 📅 2026-06-22 ~ 2026-06-23 (사용자 로그인 및 DB 프로시저 확장)
* **내용**: DB 사용자 로그인 기능 및 사내 보안 프로시저 연동 스펙을 접목했습니다.
* **기능**: `Database.ini` 파일 설정값에 따라 사내 MSSQL 데이터베이스에 등록된 `Users` 테이블 조회를 일반 쿼리와 저장 프로시저 호출 방식으로 동적 지원하게 구현했습니다.
### 📅 2026-06-24 (성능 고도화, SRP 파일 분해, DI 연동 및 다이얼로그 추상화)
* **내용**: 공장 24시간 가동 환경에서의 리소스 누수 및 불필요 오버헤드를 타파하기 위한 솔루션 리팩토링 단계입니다.
* **기능**:
1. 검사 저장 시마다 발생하던 `Database.ini` 파싱 디스크 I/O 최적화 (시간 감지 캐시 적용).
2. 스레드 폴링 부하(`Thread.Sleep(2)`)를 `AutoResetEvent` 대기 구조로 마이그레이션 (대기 시 CPU 점유율 0%).
3. `LoginServicesStub.cs` 파일에 들어있던 4개 클래스를 개별 독립 파일로 분리하고 구형 csproj에 정상 바인딩.
4. 수동 문자열 결합 JSON 이력 관리를 단일 닷넷 어셈블리 `XmlSerializer` 방식으로 교체하여 의존성 없는 안전성 확보.
5. `EolDatabaseService`에서 `App.LoginResult` 전역 참조를 차단하고 파라미터 주입형태로 리팩토링.
6. 뷰모델 및 헬퍼 파일 내 WPF `MessageBox.Show` 호출부를 `IDialogService` 인터페이스로 격리 설계 (비-UI 환경 단위 테스트 자동화 지원).
7. 리팩토링 최종 결과 MSBuild를 통해 0 warnings, 0 errors 빌드 무결성 검증 통과.
8. 최신 개편 스펙(16개 컬럼 및 MERGE)에 맞추어 DB 스키마 정의 파일(`dbo.EOL_Schema.sql`) 동기화 완료.
9. **[금일 추가]** 데이터베이스(MSSQL) 저장 실패 시 기존 검사 화면의 "오류 메시지" TextBox 영역에 실시간으로 `"DB 저장 실패"` 에러 문구를 노출하도록 예외 피드백 흐름 구현 및 검증 완료.
### 📅 2026-06-25 (배포 편의성 향상, DB 개별 키 파싱 지원, 설정 파일 가독성 고도화, 데이터 조회 오류 수정 및 CSV-DB 저장 정합성 일원화)
* **내용**: 배포 대상 컴퓨터에 프로그램 설치 시 `Database.ini` 설정 파일이 누락되어 생기는 오류를 방지하고, 모든 설정 파일의 포맷을 사람이 읽기 쉽도록 개선했습니다. 또한 데이터 이력 조회 화면의 조회 실패 오류 및 버그(파일 잠금, 날짜 포맷 로캘 불일치)를 예방하기 위한 정교한 방어적 프로그래밍을 적용했으며, 로컬 CSV와 데이터베이스 저장 시 발생하던 데이터 필드 불일치(Mismatch) 현상을 완벽하게 동기화했습니다.
* **기능**:
1. **설정 자동 생성**: 프로그램 시작 시점(`App.xaml.cs`의 `OnStartup`)에 `Database.ini`가 없을 경우 기본 접속 템플릿 정보(MSSQL 설정 및 로그인 프로시저 양식)를 담은 파일을 자동 생성하도록 예외 방지 및 파일 생성 로직을 구축했습니다.
2. **DB 개별 설정 파싱 및 결합**: 기존 한 줄로 길게 늘어지던 `ConnectionString` 대신, 사용자가 직관적으로 여러 줄에 작성할 수 있도록 `Db_Server`, `Db_Name`, `Db_User`, `Db_Password` 개별 키를 파싱하는 구조(`DatabaseSettings.cs`)로 개선했습니다. (이전 방식의 `ConnectionString` 통째 입력 방식도 하위 호환을 위해 Fallback 지원)
3. **가독성 향상 및 주석화**: 자동 생성 및 실제 로컬 파일들의 `Database.ini``Settings/DioConfig.ini` 파일에 넉넉한 줄바꿈(개행) 및 상세한 주석 설명을 달아, 사람이 직접 열어서 편집할 때 직관적으로 파악할 수 있도록 서식을 대폭 수정했습니다.
4. **XML 정밀 포맷팅**: `config.xml` 저장 시(`ConfigManager.Save`), 불필요한 XML 네임스페이스를 소거하고 들여쓰기 4칸(`Indent = true`, `IndentChars = " "`)을 강제하여 XML 구조 가독성을 고도화했습니다.
5. **데이터 조회 안정성 및 예외 처리 강화**:
* **공유 파일 읽기(FileShare)**: 현장 작업자가 로컬 백업 CSV 파일을 엑셀 등으로 열어 두어 파일 잠금(Lock)이 걸렸을 때, 이력 조회 기능에서 발생하던 파일 접근 오류(`IOException`)를 해결하기 위해 `FileShare.ReadWrite` 모드로 CSV 파일을 안전하게 읽어오도록 수정했습니다.
* **로캘 독립적 날짜 파싱**: Windows의 시스템 언어/문화권 설정(Locale)에 따라 날짜 포맷이 파싱되지 않는 문제를 예방하고자, 파일명 및 CSV 내부 날짜 데이터 해석 시 `DateTime.TryParseExact`를 명시하여 해외 공장 PC 등 어떠한 OS 환경에서도 날짜가 안정적으로 필터링되도록 보장했습니다.
* **DB 쿼리 시간 범위 경계값 정밀화**: `DATETIME2(0)`의 소수점 밀리초 오차로 인한 경계 시점(23시 59분 59초 등) 데이터 누락을 원천 차단하기 위해, SQL 조건식을 `Production_Date < @EndLimit` 형식으로 변경하고 익일 00:00:00 미만으로 설정하여 인덱스 스캔의 안정성과 조회 신뢰도를 향상시켰습니다.
* **로컬 CSV 조회 시 중복 데이터 최신화 필터링**: 동일한 제품 일련번호(`IcSn`/`ProductId`)로 재검사를 진행하는 경우, DB는 `MERGE` 구문에 의해 최종 결과로 덮어쓰기(UPDATE)되는 반면 CSV는 계속 행이 누적되는 차이로 인해 발생할 수 있는 데이터 조회 불일치를 보완했습니다. CSV 조회 엔진(`ParseLogsFromCsv`)에서 동일 제품에 대해서는 가장 최근 날짜/시간의 1건만 화면에 출력하도록 필터링을 적용하여 DB와 정합성을 일치시켰습니다. (식별 불가 코드인 `"-"` 및 공란 데이터는 필터링에서 제외)
6. **로컬 CSV 및 DB 저장 데이터 일치성 보장**:
* **InspectData 메타데이터 주입**: `TestProcessService.cs`에서 합격, 불합격(Fail), 타임아웃(Timeout) 판정 데이터를 로컬 CSV에 쓸 때 로그인 정보(Maker, Model, Variant, Operator 등)를 누락하고 쓰던 문제를 해결하기 위해, 인스턴스 생성 시 로그인 정보와 개별 `IcSn`, `PcbBarcode``ProductionDate`를 완벽하게 기입하여 CSV에도 빈틈없이 기록되도록 동기화했습니다.
* **DB 파라미터 정합성 확보**: `EolDatabaseService.cs`에서 레거시 `ProductId``@IC_SN``@PCB_Barcode`에 중복 할당하던 로직을 변경하여, 매칭된 `IcSn``PcbBarcode`를 독립적으로 바인딩하고, 시간 정보도 CSV에 기록된 것과 동일하게 `inspectData.ProductionDate`를 사용하도록 수정하여 두 스토리지 간의 데이터 정합성을 일치시켰습니다.
1 month ago
7. **LowID 속성 제거 및 ID 단일화**:
* C# 모델(`ParsedData`, `SensorIdData`)에서 중복으로 존재하던 `LowID` 프로퍼티를 완전히 삭제하였습니다.
* ADLINK 4251 보드 연동 모듈(`Board4251.cs`)에서 센서 정보 인스턴스 생성 시 `LowID` 값을 매핑하던 코드를 소거하였습니다.
* 뷰모델(`HomeViewModel.cs`)의 좌/우 채널별 `LeftLowId`, `RightLowId` 백킹 필드와 프로퍼티 및 화면 표시 조합용 `LeftIdCombined`, `RightIdCombined`를 삭제하고, 결과 초기화 및 센서 ID 판독 이벤트 수신 시 `ID` 단일 속성만 갱신 및 사용하도록 정돈하였습니다.
* UI(`HomeView.xaml`) 상에서 헤더 라벨을 `ID / LOW ID`에서 `ID`로 바꿨으며 데이터 바인딩을 `LeftId`/`RightId`로 직접 연결하였습니다.
* `README.md` 및 사용 매뉴얼 문서(`02_초기_설정.md`, `03_메인_화면.md`, `07_시험_프로세스.md`) 내의 `LOW ID` 언급을 모두 `ID`로 변경하여 정합성을 일치시켰습니다.
8. **.NET 9.0 플랫폼 마이그레이션**:
* 기존의 레거시 `.NET Framework 4.7.2` 기반 솔루션을 최신 `.NET 9.0 (WPF)` 환경으로 안전하게 이전하였습니다.
* 프로젝트 파일(`leak_test_project.csproj`)을 최신 SDK 스타일 포맷으로 리팩토링하고, `packages.config`를 영구 소거하였습니다.
* 분리 패키지화된 `System.IO.Ports``System.Data.SqlClient` 종속성을 추가로 연동하고 `System.Timers.Timer` 네임스페이스 모호성을 앨리어스를 통해 제거함으로써, 빌드가 성공(0 errors, 9 warnings)적으로 동작하도록 무결성을 검증하였습니다.
9. **[금일 검토] .NET 9.0 및 ADLINK Native DLL 아키텍처 정합성 확보**:
* 최신 `.NET 9.0` 마이그레이션 완료 후, 64비트 환경 기본 빌드로 실행할 때 32비트 전용 `PCI-Dask.dll` 간의 아키텍처 불일치(Any CPU 실행 시 `BadImageFormatException` 크래시 발생)를 확인하고 이를 정밀 진단하였습니다.
* 해결 방안으로 프로젝트 플랫폼 대상을 `x86`으로 강제 고정하여 32비트 네이티브 라이브러리와의 비트 정합성을 수립하고 빌드 배포 무결성을 달성하였습니다.
* `Setup.vdproj`를 통한 ClickOnce 및 Windows 설치 패키지 제작 시 .NET 9.0 배포 결과 구조(`.dll` 코어와 `.exe` 호스트 구조)에 맞는 파일 매핑 및 바탕화면 바로가기 타겟 구성 지침을 정형화하였습니다.
### 📅 2026-06-26 (매뉴얼 정합성 일치화 및 ZMDI 용어 제품 ID 통일)
* **내용**: 배포용 사용자 매뉴얼의 출력 상태 및 포맷 오류를 수정하고, 프로그램 설계 및 매뉴얼 내에서 혼용되던 ZMDI 센서 명칭을 최종 기획에 맞춰 '제품 ID'로 일관되게 정합하였습니다.
* **기능**:
1. **용어 통일**: 매뉴얼 마크다운 문서들(`01_시스템_개요.md`, `03_메인_화면.md`, `07_시험_프로세스.md`, `09_오류_대응.md`), DB 설계서(`ob/02_DB_Design_ERD.md`), 그리고 C# 소스코드(`TestProcessService.cs`, `Board4251.cs`, `ProjectModels.cs` 등)에 산재해 있던 ZMDI/ZMDI 센서 등의 표현을 모두 **제품 ID** 또는 **제품 ID 센서**로 전면 치환하여 정합성을 일치시켰습니다.
2. **매뉴얼 포맷 및 렌더링 오류 수정**: `05_시험_설정.md` 내 5.3 섹션의 예시 표가 마크다운 날것 그대로 HTML에 노출되던 문제를 마크다운 공백 규칙 적용 및 HTML div 래퍼 소거를 통해 완벽히 파싱되도록 개선했습니다.
3. **인쇄 색상 누락 방지 조치**: PDF 저장 및 인쇄 시 배경 컬러가 회색조로 날아가는 문제를 방지하기 위해 `pdf_style.css``body` 요소에 `-webkit-print-color-adjust: exact !important;``print-color-adjust: exact !important;` 속성을 반영했습니다.
4. **빌드 스크립트 인코딩 호환성 강화**: `build_pdf.py` 병합 스크립트가 한글 파일명 인식 오류로 일부 문서를 빠뜨리던 버그를 해결하고자 디렉토리를 UTF-8로 동적 스캔하여 순차 자동 병합하도록 리팩토링했습니다.
5. **1.5 레이아웃 페이지 나눔 적용**: 1.5 프로그램 창 구조 개요 섹션이 인쇄 시 잘리지 않고 깔끔하게 다음 페이지의 최상단에서 시작하도록 `<div class="page-break"></div>` 요소를 적재적소에 배치했습니다.
### 📅 2026-06-30 (DB 저장 완료 메시지 연동, 연결 타임아웃 5초 설정 및 센서 ID 판독 실패 시 DB 저장 제외)
* **내용**: DB 연결 지연 시 발생하는 장시간 블로킹 현상을 완화하고, 작업자가 검사 화면에서 실시간으로 데이터베이스 저장 완료 상태를 확인할 수 있도록 개선했습니다. 또한, 불완전한 데이터의 적재를 방지하기 위해 센서 ID 판독 실패 시의 DB 저장 조건을 재정의했습니다.
* **기능**:
1. **DB 연결 제한 시간 단축**: 데이터 저장(`SaveEolDataAsync`) 및 로그인 계정 검증(`ExistsAsync`) 시, 오프라인 상태 또는 네트워크 불안정으로 인한 대기 시간을 최소화하고자 `SqlConnectionStringBuilder`를 사용하여 DB 연결 타임아웃(`ConnectTimeout`)을 기본 15초에서 **5초**로 단축 및 명시하였습니다.
2. **저장 완료 상태 실시간 피드백**: `TestProcessService.cs` 내부의 DB 저장 워커 태스크(통신 타임아웃 시, 일반 검사 완료 판정 시) 완료 시점에 저장이 성공할 경우 화면 진행 메시지에 `"DB 저장 완료"`가 노출되도록 `NotifyProgress` 상태 전송 흐름을 추가하여 작업 편의성을 극대화하였습니다.
3. **센서 ID 판독 실패 시 DB 및 CSV 저장 제외**: 제품 ID(센서 ID)를 판독하지 못했을 경우(`sensorData == null`), 데이터베이스 및 로컬 CSV 로그에 불완전한 정보가 이중 기록되는 것을 차단하기 위해 `TestProcessService.cs` 내의 DB 저장(`SaveEolDataAsync`) 및 CSV 로그 저장(`FileLogger.LogInspectData`) 로직을 완전히 제거하였습니다.
### 📅 2026-07-01 (신규 HMI 로그인 화면 교체, JSON 기반 로그인 옵션 연동 및 누락된 vdproj 솔루션 삭제)
* **내용**: 텔레그램을 통해 전달받은 세련된 테크 어두운 테마의 로그인 화면으로 교체하고, 로그인 입력 콤보 옵션 및 관리자 계정 정보를 유연하게 제어하기 위해 JSON 기반 설정 연동 방식을 추가하였습니다. 또한, 로드되지 않는 레거시 vdproj 레퍼런스로 인한 Visual Studio 실행 에러 문제를 해결했습니다.
* **기능**:
1. **고급 로그인 화면 교체**: `StartupLoginWindow.xaml``.xaml.cs` 파일을 전달받은 최신 UI/UX 리소스 모델로 교체하여 테크니컬 어두운 그라데이션 HMI 스킨을 적용하였습니다.
2. **동적 로그인 옵션 구성 (`LoginOptions.json`)**: 메이커, 모델, 변형(Variant) 정보, 라인 번호, 지그 번호와 같은 고정 및 빈 리스트 데이터를 `LoginOptions.json` 파일에서 동적으로 파싱하도록 연동을 고도화했습니다. (프로젝트 빌드 시 배포 디렉토리로의 자동 복사 처리를 위해 `.csproj` 설정에 `LoginOptions.json` 빌드 액션을 추가하였습니다.)
3. **JSON 파싱 헬퍼 클래스 구현 (`LoginSelectionOptions.cs`)**: 의존성 최소화를 위해 닷넷 기본인 `System.Text.Json` API를 사용해 비동기 설정 파싱(`Load`) 및 최초 파일 누락 시 데모 계정(`su`/`su`)을 탑재한 기본 파일을 빌딩하는 템플릿 제네레이터(`CreateDefaultFile`) 기능을 구현하였습니다.
4. **누락된 레거시 설치 프로젝트 레퍼런스 소거**: 실제 디스크 상에 존재하지 않고 Visual Studio에서 "Unable to open project Setup1.vdproj" 크래시 에러를 유발하던 `Setup1/Setup1.vdproj` 프로젝트 정보를 솔루션 구조 파일(`leak_test_project.slnx`)에서 완전히 삭제하여 무결성을 수립했습니다.
5. **XamlParseException 리소스 오류 해결 및 전역 브러시 마이그레이션**: 신규 로그인 화면 로드 시 Window의 Background 속성이 자식 리소스보다 먼저 파싱되어 발생하는 `HmiScreenBackgroundBrush` 리소스 누락 오류(`XamlParseException`)를 조치하기 위해, 관련 Hmi Theme SolidColorBrush 14종을 [App.xaml](file:///c:/Users/COMPUTER1/Desktop/mobi/leak_test_project/leak_test_project/App.xaml)의 `<Application.Resources>`에 전역 등록하여 어떠한 로드 순서 예외 없이 안정적으로 렌더링되도록 완전히 마이그레이션하였습니다.
6. **시작/종료 시간 UI 연동**: 메인 화면의 "시작 시간" 라벨을 "시작/종료"로 변경하고, 종료 시간이 실제 DB 저장 데이터인 생산 일시(`ProductionDate`)와 완전 일치하도록 연동했습니다. 시작 시점에는 `시작시간 / -`로 출력하고 시험 완료 시점에는 `시작시간 / 종료시간`으로 구성하도록 `HomeViewModel.cs``TestProcessService.cs`를 수정했습니다.
7. **로컬 및 데이터베이스 순차 검증 로그인 연동**: 로그인 시도 시 `LoginOptions.json`의 로컬 계정 정보(`loginAccounts`)를 1순위로 조회하여 일치하는 경우 즉시 성공시키며, 일치하지 않거나 누락된 경우 2순위 Fallback 단계로 데이터베이스 사용자 테이블(`LoginAccountRepository.ExistsAsync`)을 순차 대조하여 로그인 처리되도록 시퀀스를 개선했습니다.
8. **DB Fallback 응답 속도 최적화**: 로컬 JSON 계정이 없을 때 데이터베이스 사용자 테이블을 검증하는 Fallback 시퀀스에서 발생하던 네트워크 연결 지연 블로킹 시간을 최소화하기 위해, 로그인 계정 저장소(`LoginAccountRepository.cs`)의 `ConnectTimeout` 설정을 기본 5초에서 **1초**로 추가 단축하여 응답 성능을 비약적으로 개선했습니다.
9. **개발/테스트용 데모 계정(test/test) 제거**: 보안 강화 및 실 운영 환경과의 완전한 일치를 위해 로그인 계정 저장소(`LoginAccountRepository.cs`) 내부의 `IsDefaultAccount` 헬퍼 메서드 및 우회 인증 분기 로직을 안전하게 삭제하여, 오직 JSON 및 DB 실 계정으로만 인증이 수행되도록 변경했습니다.
10. **비동기 Task.WhenAny 1초 타임아웃 강제 구성**: TCP 드라이버 및 OS 스택 지연으로 인해 `ConnectTimeout` 설정값(1초)을 무시하고 내부적으로 15초 이상 블로킹을 이어가는 잠재적 SQLClient 문제를 예방하고자, 로그인 검증 비동기 작업에 `Task.WhenAny(loginTask, Task.Delay(1000))`를 도입하여 1.0초가 지나는 즉시 UI 상에서 로그인 실패 처리로 넘어가도록 비동기 처리를 극대화하였습니다.
11. **오류 정보 노출 상세화 및 원본 예외 보존**: DB 연동 및 로그인 검증 예외 시 단순히 묵살하거나 일반 메시지로 치환하던 로직을 고도화하여, 로그인 창 예외 및 기밀 시험 비동기 DB 저장 오류 시 발생한 C# 원본 예외의 타입(Type)과 실제 상세 에러 내용을 `[오류 종류] 오류 메시지` 형태로 화면 및 로깅 메시지에 투명하게 전달하도록 구성했습니다.
12. **DB 기반 PCB 바코드 조회 및 검사 제어 연동**: 센서 판독 완료 후 `dbo.Housing_Assembly` 테이블에서 `IC_SN`을 조건 키로 매칭되는 `PCB_Barcode`를 조회(5초 연결 타임아웃)해오는 1.5단계 프로세스를 신설했습니다. 조회 중 예외가 발생하거나 일치하는 바코드가 없는 경우, 강제 물리 NG 신호 출력 및 로그 적재 후 시험 동작을 즉시 중단(Skip)하도록 비즈니스 흐름을 최적화하고 오프라인 미리보기 시에는 `PCB_Barcode`에 상수 문자열인 **`"testPCBbarcode"`** 값을 주입하도록 구현하였습니다.
13. **메인 화면 제품 식별자 2개 행 분리 및 레이아웃 최적화**: 메인 화면인 `HomeView.xaml`의 좌/우 채널 모니터링 카드 내부 제품 ID 라벨에 대해 가로 텍스트 잘림 현상을 근본적으로 해결하기 위해, 기존 단일 `"ID"` 행을 **`"IC_SN"`**과 **`"PCB_Barcode"`**의 **2개 독립된 행(Rows)으로 완전히 분리**하고 각 값을 별개 라인에 실시간 바인딩 처리(`HomeViewModel.cs`)했습니다. 이를 통해 고정 헤더 가로폭을 늘리지 않고 기존의 깔끔한 가로폭 비율인 **`130`**을 유지하여 레이아웃의 완성도와 가독성을 보장했습니다. 또한 영문 `"PCB_Barcode"` 라벨 텍스트의 좌우 여백을 개별 마진 **`Margin="6,0"`**으로 미세 조율하여, 윈도우의 가로 크기를 최소 사양인 **`1150`**으로 줄인 창모드 상태에서도 단 1픽셀의 잘림 없이 모든 텍스트가 명확하게 표현되도록 방어했습니다.
14. **배포 설정 파일 통합 및 C드라이브 배포 자동화**: 클릭원스 배포 시 파편화될 수 있는 설정 데이터의 안전한 관리를 위해, `LoginOptions.json``LoginHistory.json` 파일의 생성 및 조회 경로를 `Database.ini` 파일이 위치하는 공용 설정 폴더인 **`C:\ProgramData\LeakTest`**로 전면 일원화 조치(`StartupLoginWindow.xaml.cs`)했습니다. 추가로, 설치 프로그램 배포 패키지가 C드라이브 고정 위치에 생성되도록 `ClickOnceProfile.pubxml``PublishUrl`**`C:\LeakTest\`**로 변경하고, `leak_test_project.csproj` 내에 `PostPublishCopy` MSBuild target을 추가하여 클릭원스 배포 빌드 시 패키지 파일 일체가 `C:\LeakTest`로 자동 생성 및 이동(복사)되도록 빌드 자동화를 완벽 구현하였습니다.