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.
28 KiB
28 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 시작 스위치 물리 접점 신호를 수집하여 작동하는 백그라운드 스레드 제어 루프입니다.
- 시작 신호 트리거:
LEFT_START/RIGHT_START접점 신호 OFF $\rightarrow$ ON 감지 시 락(Lock) 획득 및 기상. - 제품 정보 판독:
Board4251SensorService를 통해 제품 센서 메모리에서 16자리 ID 취득. - LEAK 시험 및 수집: Sentinel C28 누수 측정기로부터 최종 패킷 수신 대기 (최대 30초).
- 교차 검증 및 판정: 설정된 상하한 스펙(SpecUL/LL) 기반 합불 판정과 C28 기기 자체 판정(Accept/Reject)을 비교 검증(
SpecMismatch감지 시 경고 팝업). - 데이터 영속화: 로컬 CSV 로그와 MSSQL 서버 데이터베이스에 이중 쓰기 수행.
- 디지털 물리 출력: 판정 결과에 맞춰
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단계:
- 보드 상태 조회 명령:
x00c_00{ch}101:owt28006727ea97c7801\r\n$\rightarrow$Success시 다음 단계 진행. - 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시간 가동 환경에서의 리소스 누수 및 불필요 오버헤드를 타파하기 위한 솔루션 리팩토링 단계입니다.
- 기능:
- 검사 저장 시마다 발생하던
Database.ini파싱 디스크 I/O 최적화 (시간 감지 캐시 적용). - 스레드 폴링 부하(
Thread.Sleep(2))를AutoResetEvent대기 구조로 마이그레이션 (대기 시 CPU 점유율 0%). LoginServicesStub.cs파일에 들어있던 4개 클래스를 개별 독립 파일로 분리하고 구형 csproj에 정상 바인딩.- 수동 문자열 결합 JSON 이력 관리를 단일 닷넷 어셈블리
XmlSerializer방식으로 교체하여 의존성 없는 안전성 확보. EolDatabaseService에서App.LoginResult전역 참조를 차단하고 파라미터 주입형태로 리팩토링.- 뷰모델 및 헬퍼 파일 내 WPF
MessageBox.Show호출부를IDialogService인터페이스로 격리 설계 (비-UI 환경 단위 테스트 자동화 지원). - 리팩토링 최종 결과 MSBuild를 통해 0 warnings, 0 errors 빌드 무결성 검증 통과.
- 최신 개편 스펙(16개 컬럼 및 MERGE)에 맞추어 DB 스키마 정의 파일(
dbo.EOL_Schema.sql) 동기화 완료. - [금일 추가] 데이터베이스(MSSQL) 저장 실패 시 기존 검사 화면의 "오류 메시지" TextBox 영역에 실시간으로
"DB 저장 실패"에러 문구를 노출하도록 예외 피드백 흐름 구현 및 검증 완료.
- 검사 저장 시마다 발생하던
📅 2026-06-25 (배포 편의성 향상, DB 개별 키 파싱 지원, 설정 파일 가독성 고도화, 데이터 조회 오류 수정 및 CSV-DB 저장 정합성 일원화)
- 내용: 배포 대상 컴퓨터에 프로그램 설치 시
Database.ini설정 파일이 누락되어 생기는 오류를 방지하고, 모든 설정 파일의 포맷을 사람이 읽기 쉽도록 개선했습니다. 또한 데이터 이력 조회 화면의 조회 실패 오류 및 버그(파일 잠금, 날짜 포맷 로캘 불일치)를 예방하기 위한 정교한 방어적 프로그래밍을 적용했으며, 로컬 CSV와 데이터베이스 저장 시 발생하던 데이터 필드 불일치(Mismatch) 현상을 완벽하게 동기화했습니다. - 기능:
- 설정 자동 생성: 프로그램 시작 시점(
App.xaml.cs의OnStartup)에Database.ini가 없을 경우 기본 접속 템플릿 정보(MSSQL 설정 및 로그인 프로시저 양식)를 담은 파일을 자동 생성하도록 예외 방지 및 파일 생성 로직을 구축했습니다. - DB 개별 설정 파싱 및 결합: 기존 한 줄로 길게 늘어지던
ConnectionString대신, 사용자가 직관적으로 여러 줄에 작성할 수 있도록Db_Server,Db_Name,Db_User,Db_Password개별 키를 파싱하는 구조(DatabaseSettings.cs)로 개선했습니다. (이전 방식의ConnectionString통째 입력 방식도 하위 호환을 위해 Fallback 지원) - 가독성 향상 및 주석화: 자동 생성 및 실제 로컬 파일들의
Database.ini와Settings/DioConfig.ini파일에 넉넉한 줄바꿈(개행) 및 상세한 주석 설명을 달아, 사람이 직접 열어서 편집할 때 직관적으로 파악할 수 있도록 서식을 대폭 수정했습니다. - XML 정밀 포맷팅:
config.xml저장 시(ConfigManager.Save), 불필요한 XML 네임스페이스를 소거하고 들여쓰기 4칸(Indent = true,IndentChars = " ")을 강제하여 XML 구조 가독성을 고도화했습니다. - 데이터 조회 안정성 및 예외 처리 강화:
- 공유 파일 읽기(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와 정합성을 일치시켰습니다. (식별 불가 코드인"-"및 공란 데이터는 필터링에서 제외)
- 공유 파일 읽기(FileShare): 현장 작업자가 로컬 백업 CSV 파일을 엑셀 등으로 열어 두어 파일 잠금(Lock)이 걸렸을 때, 이력 조회 기능에서 발생하던 파일 접근 오류(
- 로컬 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를 사용하도록 수정하여 두 스토리지 간의 데이터 정합성을 일치시켰습니다.
- InspectData 메타데이터 주입:
- 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로 변경하여 정합성을 일치시켰습니다.
- C# 모델(
- .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)적으로 동작하도록 무결성을 검증하였습니다.
- 기존의 레거시
- [금일 검토] .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'로 일관되게 정합하였습니다.
- 기능:
- 용어 통일: 매뉴얼 마크다운 문서들(
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 센서로 전면 치환하여 정합성을 일치시켰습니다. - 매뉴얼 포맷 및 렌더링 오류 수정:
05_시험_설정.md내 5.3 섹션의 예시 표가 마크다운 날것 그대로 HTML에 노출되던 문제를 마크다운 공백 규칙 적용 및 HTML div 래퍼 소거를 통해 완벽히 파싱되도록 개선했습니다. - 인쇄 색상 누락 방지 조치: PDF 저장 및 인쇄 시 배경 컬러가 회색조로 날아가는 문제를 방지하기 위해
pdf_style.css의body요소에-webkit-print-color-adjust: exact !important;및print-color-adjust: exact !important;속성을 반영했습니다. - 빌드 스크립트 인코딩 호환성 강화:
build_pdf.py병합 스크립트가 한글 파일명 인식 오류로 일부 문서를 빠뜨리던 버그를 해결하고자 디렉토리를 UTF-8로 동적 스캔하여 순차 자동 병합하도록 리팩토링했습니다. - 1.5 레이아웃 페이지 나눔 적용: 1.5 프로그램 창 구조 개요 섹션이 인쇄 시 잘리지 않고 깔끔하게 다음 페이지의 최상단에서 시작하도록
<div class="page-break"></div>요소를 적재적소에 배치했습니다.
- 용어 통일: 매뉴얼 마크다운 문서들(
📅 2026-06-30 (DB 저장 완료 메시지 연동, 연결 타임아웃 5초 설정 및 센서 ID 판독 실패 시 DB 저장 제외)
- 내용: DB 연결 지연 시 발생하는 장시간 블로킹 현상을 완화하고, 작업자가 검사 화면에서 실시간으로 데이터베이스 저장 완료 상태를 확인할 수 있도록 개선했습니다. 또한, 불완전한 데이터의 적재를 방지하기 위해 센서 ID 판독 실패 시의 DB 저장 조건을 재정의했습니다.
- 기능:
- DB 연결 제한 시간 단축: 데이터 저장(
SaveEolDataAsync) 및 로그인 계정 검증(ExistsAsync) 시, 오프라인 상태 또는 네트워크 불안정으로 인한 대기 시간을 최소화하고자SqlConnectionStringBuilder를 사용하여 DB 연결 타임아웃(ConnectTimeout)을 기본 15초에서 5초로 단축 및 명시하였습니다. - 저장 완료 상태 실시간 피드백:
TestProcessService.cs내부의 DB 저장 워커 태스크(통신 타임아웃 시, 일반 검사 완료 판정 시) 완료 시점에 저장이 성공할 경우 화면 진행 메시지에"DB 저장 완료"가 노출되도록NotifyProgress상태 전송 흐름을 추가하여 작업 편의성을 극대화하였습니다. - 센서 ID 판독 실패 시 DB 및 CSV 저장 제외: 제품 ID(센서 ID)를 판독하지 못했을 경우(
sensorData == null), 데이터베이스 및 로컬 CSV 로그에 불완전한 정보가 이중 기록되는 것을 차단하기 위해TestProcessService.cs내의 DB 저장(SaveEolDataAsync) 및 CSV 로그 저장(FileLogger.LogInspectData) 로직을 완전히 제거하였습니다.
- DB 연결 제한 시간 단축: 데이터 저장(
📅 2026-07-01 (신규 HMI 로그인 화면 교체, JSON 기반 로그인 옵션 연동 및 누락된 vdproj 솔루션 삭제)
- 내용: 텔레그램을 통해 전달받은 세련된 테크 어두운 테마의 로그인 화면으로 교체하고, 로그인 입력 콤보 옵션 및 관리자 계정 정보를 유연하게 제어하기 위해 JSON 기반 설정 연동 방식을 추가하였습니다. 또한, 로드되지 않는 레거시 vdproj 레퍼런스로 인한 Visual Studio 실행 에러 문제를 해결했습니다.
- 기능:
- 고급 로그인 화면 교체:
StartupLoginWindow.xaml및.xaml.cs파일을 전달받은 최신 UI/UX 리소스 모델로 교체하여 테크니컬 어두운 그라데이션 HMI 스킨을 적용하였습니다. - 동적 로그인 옵션 구성 (
LoginOptions.json): 메이커, 모델, 변형(Variant) 정보, 라인 번호, 지그 번호와 같은 고정 및 빈 리스트 데이터를LoginOptions.json파일에서 동적으로 파싱하도록 연동을 고도화했습니다. (프로젝트 빌드 시 배포 디렉토리로의 자동 복사 처리를 위해.csproj설정에LoginOptions.json빌드 액션을 추가하였습니다.) - JSON 파싱 헬퍼 클래스 구현 (
LoginSelectionOptions.cs): 의존성 최소화를 위해 닷넷 기본인System.Text.JsonAPI를 사용해 비동기 설정 파싱(Load) 및 최초 파일 누락 시 데모 계정(su/su)을 탑재한 기본 파일을 빌딩하는 템플릿 제네레이터(CreateDefaultFile) 기능을 구현하였습니다. - 누락된 레거시 설치 프로젝트 레퍼런스 소거: 실제 디스크 상에 존재하지 않고 Visual Studio에서 "Unable to open project Setup1.vdproj" 크래시 에러를 유발하던
Setup1/Setup1.vdproj프로젝트 정보를 솔루션 구조 파일(leak_test_project.slnx)에서 완전히 삭제하여 무결성을 수립했습니다. - XamlParseException 리소스 오류 해결 및 전역 브러시 마이그레이션: 신규 로그인 화면 로드 시 Window의 Background 속성이 자식 리소스보다 먼저 파싱되어 발생하는
HmiScreenBackgroundBrush리소스 누락 오류(XamlParseException)를 조치하기 위해, 관련 Hmi Theme SolidColorBrush 14종을 App.xaml의<Application.Resources>에 전역 등록하여 어떠한 로드 순서 예외 없이 안정적으로 렌더링되도록 완전히 마이그레이션하였습니다. - 시작/종료 시간 UI 연동: 메인 화면의 "시작 시간" 라벨을 "시작/종료"로 변경하고, 종료 시간이 실제 DB 저장 데이터인 생산 일시(
ProductionDate)와 완전 일치하도록 연동했습니다. 시작 시점에는시작시간 / -로 출력하고 시험 완료 시점에는시작시간 / 종료시간으로 구성하도록HomeViewModel.cs및TestProcessService.cs를 수정했습니다. - 로컬 및 데이터베이스 순차 검증 로그인 연동: 로그인 시도 시
LoginOptions.json의 로컬 계정 정보(loginAccounts)를 1순위로 조회하여 일치하는 경우 즉시 성공시키며, 일치하지 않거나 누락된 경우 2순위 Fallback 단계로 데이터베이스 사용자 테이블(LoginAccountRepository.ExistsAsync)을 순차 대조하여 로그인 처리되도록 시퀀스를 개선했습니다. - DB Fallback 응답 속도 최적화: 로컬 JSON 계정이 없을 때 데이터베이스 사용자 테이블을 검증하는 Fallback 시퀀스에서 발생하던 네트워크 연결 지연 블로킹 시간을 최소화하기 위해, 로그인 계정 저장소(
LoginAccountRepository.cs)의ConnectTimeout설정을 기본 5초에서 1초로 추가 단축하여 응답 성능을 비약적으로 개선했습니다. - 개발/테스트용 데모 계정(test/test) 제거: 보안 강화 및 실 운영 환경과의 완전한 일치를 위해 로그인 계정 저장소(
LoginAccountRepository.cs) 내부의IsDefaultAccount헬퍼 메서드 및 우회 인증 분기 로직을 안전하게 삭제하여, 오직 JSON 및 DB 실 계정으로만 인증이 수행되도록 변경했습니다. - 비동기 Task.WhenAny 1초 타임아웃 강제 구성: TCP 드라이버 및 OS 스택 지연으로 인해
ConnectTimeout설정값(1초)을 무시하고 내부적으로 15초 이상 블로킹을 이어가는 잠재적 SQLClient 문제를 예방하고자, 로그인 검증 비동기 작업에Task.WhenAny(loginTask, Task.Delay(1000))를 도입하여 1.0초가 지나는 즉시 UI 상에서 로그인 실패 처리로 넘어가도록 비동기 처리를 극대화하였습니다. - 오류 정보 노출 상세화 및 원본 예외 보존: DB 연동 및 로그인 검증 예외 시 단순히 묵살하거나 일반 메시지로 치환하던 로직을 고도화하여, 로그인 창 예외 및 기밀 시험 비동기 DB 저장 오류 시 발생한 C# 원본 예외의 타입(Type)과 실제 상세 에러 내용을
[오류 종류] 오류 메시지형태로 화면 및 로깅 메시지에 투명하게 전달하도록 구성했습니다. - DB 기반 PCB 바코드 조회 및 검사 제어 연동: 센서 판독 완료 후
dbo.Housing_Assembly테이블에서IC_SN을 조건 키로 매칭되는PCB_Barcode를 조회(5초 연결 타임아웃)해오는 1.5단계 프로세스를 신설했습니다. 조회 중 예외가 발생하거나 일치하는 바코드가 없는 경우, 강제 물리 NG 신호 출력 및 로그 적재 후 시험 동작을 즉시 중단(Skip)하도록 비즈니스 흐름을 최적화하고 오프라인 미리보기 시에는PCB_Barcode에 상수 문자열인"testPCBbarcode"값을 주입하도록 구현하였습니다. - 메인 화면 제품 식별자 2개 행 분리 및 레이아웃 최적화: 메인 화면인
HomeView.xaml의 좌/우 채널 모니터링 카드 내부 제품 ID 라벨에 대해 가로 텍스트 잘림 현상을 근본적으로 해결하기 위해, 기존 단일"ID"행을 **"IC_SN"**과 **"PCB_Barcode"**의 2개 독립된 행(Rows)으로 완전히 분리하고 각 값을 별개 라인에 실시간 바인딩 처리(HomeViewModel.cs)했습니다. 이를 통해 고정 헤더 가로폭을 늘리지 않고 기존의 깔끔한 가로폭 비율인 **130**을 유지하여 레이아웃의 완성도와 가독성을 보장했습니다. 또한 영문"PCB_Barcode"라벨 텍스트의 좌우 여백을 개별 마진 **Margin="6,0"**으로 미세 조율하여, 윈도우의 가로 크기를 최소 사양인 **1150**으로 줄인 창모드 상태에서도 단 1픽셀의 잘림 없이 모든 텍스트가 명확하게 표현되도록 방어했습니다. - 배포 설정 파일 통합 및 C드라이브 배포 자동화: 클릭원스 배포 시 파편화될 수 있는 설정 데이터의 안전한 관리를 위해,
LoginOptions.json및LoginHistory.json파일의 생성 및 조회 경로를Database.ini파일이 위치하는 공용 설정 폴더인 **C:\ProgramData\LeakTest**로 전면 일원화 조치(StartupLoginWindow.xaml.cs)했습니다. 추가로, 설치 프로그램 배포 패키지가 C드라이브 고정 위치에 생성되도록ClickOnceProfile.pubxml내PublishUrl을 **C:\LeakTest\**로 변경하고,leak_test_project.csproj내에PostPublishCopyMSBuild target을 추가하여 클릭원스 배포 빌드 시 패키지 파일 일체가C:\LeakTest로 자동 생성 및 이동(복사)되도록 빌드 자동화를 완벽 구현하였습니다. - 대기 상태 진입 시 화면 초기화 및 상태 표시 개선: 좌/우 채널에 신호가 거의 동시에 투입되어 한쪽 채널이 대기 상태에 들어갈 때, 레이스 컨디션으로 인해 이전 검사 결과가 화면에 그대로 남아있고 "대기중" 상태가 표시되지 않는 문제를 해결했습니다.
_testLock.CurrentCount == 0조건을 확인하는 대신_testLock.Wait(0)을 이용하여 락 획득 가능 여부를 원자적(Atomic)으로 체크한 뒤, 획득에 실패했을 때만 화면을 비우고(ResultClearRequested) "대기중" 상태(NotifyProgress)로 전환 후 락을 대기하도록 로직을 개선했습니다.
- 고급 로그인 화면 교체: