리크 테스트 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.
 
 
 
 
 

52 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 형식으로 정규화하여 교차 검증을 강제합니다.
  • 채널 다중화: 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.csOnStartup)에 Database.ini가 없을 경우 기본 접속 템플릿 정보(MSSQL 설정 및 로그인 프로시저 양식)를 담은 파일을 자동 생성하도록 예외 방지 및 파일 생성 로직을 구축했습니다.
    2. DB 개별 설정 파싱 및 결합: 기존 한 줄로 길게 늘어지던 ConnectionString 대신, 사용자가 직관적으로 여러 줄에 작성할 수 있도록 Db_Server, Db_Name, Db_User, Db_Password 개별 키를 파싱하는 구조(DatabaseSettings.cs)로 개선했습니다. (이전 방식의 ConnectionString 통째 입력 방식도 하위 호환을 위해 Fallback 지원)
    3. 가독성 향상 및 주석화: 자동 생성 및 실제 로컬 파일들의 Database.iniSettings/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, PcbBarcodeProductionDate를 완벽하게 기입하여 CSV에도 빈틈없이 기록되도록 동기화했습니다.
      • DB 파라미터 정합성 확보: EolDatabaseService.cs에서 레거시 ProductId@IC_SN@PCB_Barcode에 중복 할당하던 로직을 변경하여, 매칭된 IcSnPcbBarcode를 독립적으로 바인딩하고, 시간 정보도 CSV에 기록된 것과 동일하게 inspectData.ProductionDate를 사용하도록 수정하여 두 스토리지 간의 데이터 정합성을 일치시켰습니다.
    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.PortsSystem.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.cssbody 요소에 -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의 <Application.Resources>에 전역 등록하여 어떠한 로드 순서 예외 없이 안정적으로 렌더링되도록 완전히 마이그레이션하였습니다.
    6. 시작/종료 시간 UI 연동: 메인 화면의 "시작 시간" 라벨을 "시작/종료"로 변경하고, 종료 시간이 실제 DB 저장 데이터인 생산 일시(ProductionDate)와 완전 일치하도록 연동했습니다. 시작 시점에는 시작시간 / -로 출력하고 시험 완료 시점에는 시작시간 / 종료시간으로 구성하도록 HomeViewModel.csTestProcessService.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.jsonLoginHistory.json 파일의 생성 및 조회 경로를 Database.ini 파일이 위치하는 공용 설정 폴더인 **C:\ProgramData\LeakTest**로 전면 일원화 조치(StartupLoginWindow.xaml.cs)했습니다. 추가로, 설치 프로그램 배포 패키지가 C드라이브 고정 위치에 생성되도록 ClickOnceProfile.pubxmlPublishUrl을 **C:\LeakTest\**로 변경하고, leak_test_project.csproj 내에 PostPublishCopy MSBuild target을 추가하여 클릭원스 배포 빌드 시 패키지 파일 일체가 C:\LeakTest로 자동 생성 및 이동(복사)되도록 빌드 자동화를 완벽 구현하였습니다.
    15. 대기 상태 진입 시 화면 초기화 및 상태 표시 개선: 좌/우 채널에 신호가 거의 동시에 투입되어 한쪽 채널이 대기 상태에 들어갈 때, 레이스 컨디션으로 인해 이전 검사 결과가 화면에 그대로 남아있고 "대기중" 상태가 표시되지 않는 문제를 해결했습니다. _testLock.CurrentCount == 0 조건을 확인하는 대신 _testLock.Wait(0)을 이용하여 락 획득 가능 여부를 원자적(Atomic)으로 체크한 뒤, 획득에 실패했을 때만 화면을 비우고(ResultClearRequested) "대기중" 상태(NotifyProgress)로 전환 후 락을 대기하도록 로직을 개선했습니다.
    16. WiX Toolset v5 기반 단일 설치 패키지(EXE) 및 게시 출력 폴더 정화(Clean) 구축:
      • 안정적인 Wix v5 핀 지정: 최신 베타 버전인 Wix 7.0 CLI의 Bal 확장 호환 버그를 피하고자, 안정 릴리즈인 Wix v5.0.2로 툴을 다운그레이드 핀 지정하고 Wix Bootstrapper Applications v5.0.2 확장을 전역 추가했습니다.
      • 단일 EXE 설치본 자동 빌드: Bundle.wxs를 작성하여 기존의 MSI 패키지를 내장 압축 래핑하는 LeakTestSetup.exe 단일 설치 파일을 자동으로 빌드(Ext 인자 전달)하도록 빌드 타겟을 확장했습니다.
      • C드라이브 설치 경로 강제 고정: 주 드라이브 매핑 설정과 관계없이 항상 약속된 설치 디렉터리(C:\LeakTest)에 바이너리 및 설정 파일, 네이티브 DLL 하위 폴더 구조(libs/)가 무조건 자동 설치되도록 Product.wxs 내에 SetDirectory 강제 매핑 및 perMachine 스코프를 수립했습니다.
      • 바탕화면 바로가기 자동 생성: 설치 시 공용 바탕화면 경로에 Leak Test System 실행 바로가기 단축 아이콘(.lnk)이 자동으로 생성되어 작업자의 실행 편의를 극대화했습니다.
      • 사전 빌드 복사 에러 조치: dotnet publishPCI-Dask.dll.config 파일 복사 경로 문제로 빌드가 실패하던 오류들을 프로젝트 디렉터리 및 빌드 디렉터리 원본을 정확히 바라보도록 수정하여 빌드 무결성을 회피했습니다.
      • 게시 폴더 정화 자동화: 비주얼 스튜디오에서 '게시(Publish)' 완료 시 출력 경로(PublishDir) 하위의 수많은 부가 DLL, PDB, Config, Json, Ini 파일 및 서브 폴더들을 완전히 청소(Clean)하여, 오직 최종 배포용 단일 실행 파일인 LeakTestSetup.exe 파일 단 하나만 남도록 대피/이관 자동화 스크립트를 빌드 타겟에 연동했습니다.

📅 2026-07-02 (SQL 연결 SSL 인증서 체인 신뢰성 오류 방지 및 기본 접속 정보 변경)

  • 내용: SQL 접속 시 SSL 인증서 체인 오류를 기본 방지하도록 설정을 개선하고, 시스템 기획 요구사항에 맞춰 기본 데이터베이스 접속 정보를 최신화하였습니다.
  • 기능:
    1. ConnectionString 생성 로직 개선: DatabaseSettings.cs 내의 ConnectionString 프로퍼티에서 개별 파라미터(Server, Database, User 등)로 조합되거나 단일 설정값으로 주입된 연결 문자열에 TrustServerCertificate=True; 옵션이 존재하지 않을 경우 자동으로 접미사에 추가하도록 수정하여 SSL 인증서 관련 연결 예외를 방지했습니다.
    2. Database.ini 기본 템플릿 접속 정보 업데이트: 프로그램 구동 시 파일이 존재하지 않는 경우 자동 생성하는 디폴트 템플릿(App.xaml.cs) 및 프로젝트에 포함된 기본 Database.ini 설정 파일의 접속 정보(서버: 192.168.10.10, 1433, DB명: NE1aW_PT_SSENSOR, 사용자: su, 비밀번호: amotech821)를 실 시스템 기획 요구사항에 맞춰 갱신하였습니다.
    3. Line 컬럼 잘림 오류 수정: DB의 [dbo].[EOL] 테이블 스키마 파일(dbo.EOL_Schema.sql)에서 작업 라인을 나타내는 Line 컬럼의 물리 데이터 형식이 NVARCHAR(5)로 좁게 선언되어 있어 5자를 초과하는 라인 정보(예: "LINE-1"은 6자) 입력 시 잘림 오류(Truncation Exception)로 인해 저장이 실패하던 버그를 확인하고, 테이블 DDL 스키마 및 문서 상의 Line 규격을 NVARCHAR(30)로 변경 및 확장 조치하였습니다.
    4. Line 컬럼 가공 처리 원복: 라인 정보에 대해 숫자만 남기도록 하던 임시 정규식 필터링 코드를 제거하고, 원래 문자열 형태(예: "LINE-1") 그대로 데이터베이스 및 CSV 로그에 기록되도록 소스코드를 복구하였습니다.

📅 2026-07-03 (24시간 무중단 가동 신뢰성 정밀 진단 및 코드 리팩토링)

  • 내용: 24시간 365일 실시간 검사 라인의 무중단 가동 신뢰성을 위한 SRE 관점의 소스 코드 리팩토링을 완료했습니다.
  • 기능:
    1. Sync-over-Async 제거: TestProcessService.cs 내의 .GetAwaiter().GetResult() 호출부를 Task.Run 스레드 풀 분리를 통해 격리하여 컨텍스트 데드락 요인을 원천 방지했습니다.
    2. 글로벌 스레드 복구: TestProcessService.csProcessProc 검사 루프 전체를 try-catch 구조로 격리하여 예외 시 스레드가 소멸하지 않고 자동 자가 치유 대기로 복구되도록 설계했습니다.
    3. TCS 동시성 및 lock 도입: Board4251.cs 내부의 _responseTcs 할당/해제 시 _tcsLock 동기화 락을 사용하여 기기 수신과 송신 간의 레이스 컨디션을 완전히 방어했습니다.
    4. 시리얼 버퍼 OOM 차단: SentinelC28Service.cs_receiveBufferStringBuilder 기반의 고정 크기 제한(64KB) 관리 구조로 전환하고, Dispose() 내에 기기 이벤트 해제를 강제하여 메모리 누수를 제거했습니다.
    5. 1GB 디스크 경고 및 소프트 경고 구현: LogUtils.cs 내에 디스크 공간 감지(1GB 이하) 메커니즘을 연동하되, 공정이 멈추거나 DB 저장이 누락되지 않도록 Soft Warning 형태로 에러 이벤트를 전파하고 화면과 로그에 경고만 노출하도록 처리했습니다.
    6. DB 백프레셔 제어: 데이터 적재 시 _dbSemaphore를 통해 최대 동시 쓰기 스레드를 3개로 제어하여 네트워크 지연 시 스레드 풀 기아 상태가 발생하지 않도록 억제했습니다.
    7. 빌드 무결성 보장: 리팩토링 결과 net9.0-windows 컴파일 환경에서 0 warnings, 0 errors로 빌드를 정상 무결 완료했습니다.
    8. 스펙 불일치 알림 스위치 추가: 통신 설정 메뉴 하단에 스펙 불일치 알림 여부를 켜고 끌 수 있는 체크박스(CheckBox 기반 스위치)를 추가했습니다. 해당 스위치는 기본값이 켜짐(ON) 상태이며, 사용자의 선택값(EnableSpecMismatchAlarm)을 config.xml에 영속 저장하여 교차 판정 경고창 노출 여부를 동적으로 제어하도록 구현했습니다.

📅 2026-07-08 (메뉴얼 정합성 검토 및 최신 기능 현행화)

  • 내용: WPF 소스코드의 최신 UI 변경사항 및 백엔드 로직에 맞춰 사용자 메뉴얼 문서(10종)와의 정합성을 확보하고 병합 문서를 갱신했습니다.
  • 기능:
    1. 설정 파일 공통 경로 통일: 메뉴얼 상에서 혼재되어 있던 데이터 경로 규격을 실제 소스코드와 배포 규격에 대응하는 **C:\LeakTest\**로 전면 일치시켰습니다.
    2. 시작/종료 및 식별자 2행 분리 UI 반영: 메인 화면(03_메인_화면.md) 메뉴얼에 시작/종료 시간 변경 및 가로 잘림 튜닝이 반영된 IC_SN / PCB_Barcode 2행 분리 레이아웃 명세를 현행화했습니다.
    3. 스펙 불일치 체크박스 및 경고 연동: 통신 설정(04_통신_설정.md)과 오류 대응(09_오류_대응.md)에 EnableSpecMismatchAlarm 체크박스 옵션을 서술하고, 해제(OFF) 시의 경고 대화상자 노출 차단 동작을 보강했습니다.
    4. 1.5단계 바코드 DB 매핑 및 저장 제외 흐름 반영: 자동 시험 프로세스(07_시험_프로세스.md) 흐름도에 dbo.Housing_Assembly 기반 바코드 쿼리 단계를 신설하고, ID 판독 실패 및 바코드 매핑 실패 시 DB 및 CSV 로그 저장을 스킵하는 무결성 처리 과정을 서술했습니다.
    5. DB 스키마 사양 현행화: 08_로그_관리.md DDL 변경 내용에 맞춰 Line 크기 확장(NVARCHAR(30)) 및 개별 DB 연결 주소 파싱, SSL 오류 방지(TrustServerCertificate=True)에 대해 설명을 추가했습니다.
    6. 통합 매뉴얼 빌드: 병합 스크립트(build_pdf.py) 실행을 통해 Manual_Merged.mdManual_Merged.html 결과물을 최신 사양으로 성공적으로 컴파일 완료했습니다.

📅 2026-07-10 (데이터 조회 취소 시 메인 화면 복귀 정합성 불일치 수정, 매뉴얼 톤앤매너 고도화, 구형 8컬럼 호환성 소거 및 개발자 매뉴얼 분리 이관)

  • 내용: 측정 데이터 조회 화면의 취소 복귀 오류를 수정하고 매뉴얼의 구어체 표현을 정비했으며, 구형 로그 호환성 삭제와 함께 사용자 매뉴얼에서 상세 기술 데이터들을 개발 지식베이스인 ob/ 폴더 하위로 완전히 분리 이관했습니다.
  • 기능:
    1. 조회 취소 시 화면 강제 복귀 연동: DataViewModel.cs의 ExecuteSearch 비동기 태스크에서 취소 예외(OperationCanceledException) 발생 시, 메시지 박스가 표시된 직후 자동으로 CloseCommand.Execute(null)를 실행하여 사용자를 메인(홈) 화면으로 즉시 안전하게 돌려보내는 시퀀스를 보강하였습니다.
    2. 매뉴얼 어투 격식화 및 병합 컴파일: 06_데이터_조회.md 내의 부적절한 구어체 표현(예: "콕 집어" 등) 및 과장된 톤을 명사형/서술형 설명서 어조로 다듬었으며, build_pdf.py 스크립트를 재구동하여 통합 매뉴얼(Manual_Merged.md, Manual_Merged.html)까지 정상 컴파일 완료하였습니다.
    3. 구형 8개 컬럼 로그 호환성 로직 제거: LogUtils.cs의 CSV 파서 엔진(ParseLogsFromCsv)에서 기존 8개 컬럼 포맷 분기 처리 로직을 완전히 삭제하고, 오직 EOL 신규 16개 표준 컬럼 규격만 정상 파싱하도록 단순화했습니다. 아울러 매뉴얼 문서(06_데이터_조회.md, 08_로그_관리.md) 내 구형 포맷 관련 참고 사항 및 하위 호환성 설명을 삭제하였습니다.
    4. 개발자 매뉴얼 분리 이관 및 사용자 매뉴얼 용어 순화: 일반 사용자가 이해하기 어려운 C# 바인딩 프로퍼티명, 데이터베이스 기본키/외래키 제약조건(PK/FK, UK), 세마포어 잠금 등의 설계 지향적 기술 정보를 ob/06_Developer_Manual.md 신규 문서로 통합 이전하여 보존하였습니다. 동시에 사용자 매뉴얼(Manual/ 하위 파일)에 있던 관련 표현들은 모두 "순차 처리 잠금", "표 스타일" 등 쉬운 한국어 사용자 관점의 설명으로 순화하였습니다.
    5. 빌드 안정성 확인: 변경 사항 반영 후 .NET 9.0 (WPF) 환경에서 0 warnings, 0 errors로 빌드가 완벽히 동작하는지 검증을 완료하였습니다.
    6. 타임아웃 시 누설값 기록 변경: C28 센서 통신 타임아웃 발생 시 데이터베이스 및 CSV 로그에 강제 기입되던 누설 측정값 "0.0000"을 에러 상태의 시각적 명확화를 위해 데이터베이스 규격(DECIMAL(5,4)) 내 물리적 최댓값인 "9.9999"로 기록되도록 TestProcessService.cs를 수정하고, 관련 매뉴얼 문서(07_시험_프로세스.md) 설명을 갱신하였습니다.
    7. 매뉴얼 내 프로그램 실행 경로 설명 수정: 프로그램 실행 지침을 파일 탐색기에서 직접 exe 파일을 더블 클릭하여 실행하도록 설명된 방식에서, 바탕화면에 생성된 바로가기 아이콘을 사용하여 실행하도록 사용자 매뉴얼(02_초기_설정.md, 사용자_메뉴얼.md)의 설명을 갱신 및 컴파일 하였습니다.

📅 2026-07-21 (언인스톨 시 디렉토리 깔끔하게 삭제하도록 개선)

  • 내용: 프로그램 언인스톨(Uninstall) 시 런타임에 동적으로 생성된 설정 파일 및 설치 디렉토리를 완전히 청소하도록 배포 패키지 설정을 개선하였습니다. (단, 로그 파일은 사용자의 요청에 따라 안전하게 보존하도록 조치함)
  • 기능:
    1. CommonAppDataFolder 표준 디렉토리 연동: C:\ProgramData\LeakTest\ 디렉토리를 특정하여 관리하기 위해 WiX 스크립트 상에 CommonAppDataFolder 참조를 선언했습니다.
    2. 언인스톨 시 C:\ProgramData\LeakTest 디렉토리 및 파일 완전 제거: 언인스톨이 진행될 때 로그인 옵션(LoginOptions.json), 로그인 히스토리(LoginHistory.json) 등의 설정 파일들과 폴더 자체를 디스크에서 완전히 청소하도록 처리했습니다.
    3. 로그 파일 보존 및 C:\LeakTest 루트 파일 제거: 사용자의 요청에 따라 C:\LeakTest\Logs\ 폴더 및 내부의 누수 검사 로그 파일(*.csv)들은 삭제 대상에서 철저히 배제하여 보존되도록 구현하였습니다. 동시에 C:\LeakTest 루트 경로 상의 실행 파일 및 설정/DLL 잔여 파일들은 와일드카드(*) 기반 RemoveFile을 사용해 말끔하게 삭제되도록 패키징 구성을 조정했습니다.

📅 2026-07-24 (실행 파일 및 배포 패키지 아이콘 적용)

  • 내용: 카카오톡으로 전달받은 EOL.ico 아이콘 파일을 프로젝트에 연동하여 실행 파일 아이콘, 각 윈도우 창(로그인 및 메인 화면), 제어판 및 바탕화면 바로가기 아이콘으로 일괄 적용하였습니다.
  • 기능:
    1. 아이콘 복사 및 빌드 설정: EOL.ico를 프로젝트 루트에 복사하고 .csproj<ApplicationIcon>EOL.ico</ApplicationIcon> 및 빌드 이관/리소스 설정을 반영하여 빌드 컴파일 시 실행 파일(.exe)에 자동 패킹되도록 하였습니다.
    2. WPF 윈도우 창 아이콘 지정: MainWindow.xamlStartupLoginWindow.xamlIcon 속성으로 EOL.ico 리소스를 연결하여 프로그램 실행 시 창 타이틀바와 작업 표시줄에 아이콘이 일관성 있게 표시되도록 구현했습니다.
    3. 설치 패키지(WiX) 아이콘 연동: Product.wxs 에 제어판 프로그램 추가/제거용 ARPPRODUCTICON 프로퍼티와 바탕화면 바로가기 숏컷(Shortcut 요소)에 Icon 속성으로 AppIcon.ico를 매핑하고, 아이콘 파일도 설치 대상 본에 포함하여 완전하게 적용했습니다. 추가적으로 Bundle.wxsIconSourceFile="..\leak_test_project\EOL.ico" 속성을 선언하여, 최종 배포 파일 자체의 아이콘도 해당 아이콘 이미지로 동일하게 적용했습니다.
    4. 게시 경로 및 정화 스크립트 안전 조치 수립 (다운로드 폴더 파일 삭제 방지): Visual Studio 게시 프로필(FolderProfile.pubxml, ClickOnceProfile.pubxml)에 등록되어 있던 PublishDir / PublishUrl 경로가 C:\Users\COMPUTER1\Downloads로 설정되어 게시 정화 스크립트가 다운로드 폴더 내의 사용자의 기존 실행 파일(*.exe)들을 지우던 결함을 발견 및 조치하였습니다. 게시 프로필 경로를 bin\Release\net9.0-windows\win-x86\publish\C:\LeakTest\로 변경하고, .csproj 내의 정화 로직(FolderPublish 타겟)이 오직 프로젝트 내부 빌드 결과물 경로(SafePublishDir)에 한해서만 실행되도록 엄격히 방어 로직을 수립했습니다.
    5. 이전 Leak Test 명칭 및 C:\LeakTest 설치 경로 구성으로 완벽 원복: 사용자 지시에 따라 EOL 변경 전 명칭 및 경로 체격으로 전면 롤백(Rollback)을 수행했습니다.
      • 메인 어셈블리 및 실행 파일명: leak_test_project.exe
      • 설치 및 배포 디렉터리: C:\LeakTest\C:\ProgramData\LeakTest\
      • 단일 설치 패키지 파일명: LeakTestSetup.exe
      • 바탕화면 바로가기, 제어판 등록 이름 및 창 Title: Leak Test System / Pressure Leak Inspect System
    6. 게시 출력 폴더 정화 로직 고도화 (오직 LeakTestSetup.exe 1개만 남도록 보장): 게시 완료 후 publish\ 폴더 내에 leak_test_project.exe, leak_test_project.pdb, libs 서브 폴더 등이 파편으로 잔류하던 문제를 해결하기 위해, CopyDllToPublish 타겟의 실행 순서를 BeforeTargets="FolderPublish"로 변경하고 정화 대상을 프로젝트 내부 게시 폴더(PublishDirSafePublishDir)의 모든 파일/폴더로 확충하였습니다. 이로써 게시 시 오직 최종 배포 단일 설치 파일인 LeakTestSetup.exe 단 1개의 파일만 깔끔하게 보존되도록 완벽히 조치했습니다.
    7. 게시-설치 동작 전면 분리 및 독립 샌드박스 패키징 수립:
      • 게시(Publish) 시점: 개발환경 C드라이브(C:\LeakTest\)로의 사전 파일 복사를 완전히 차단하고, 프로젝트 임시 샌드박스 경로(temp_deploy\)에서만 WiX MSI/Bundle 컴파일을 독립 수행하도록 개편했습니다. 게시 결과물 폴더(publish\)에는 파편 파일 없이 오직 단일 설치본인 LeakTestSetup.exe 1개 파일만 깔끔하게 생성됩니다.
      • 설치(Install) 시점: 최종 사용자가 단일 배포 파일인 LeakTestSetup.exe를 구동하여 설치를 진행하면, WiX 마법사를 통해 대상 PC의 C드라이브 C:\LeakTest\ 폴더로 실행 파일 및 모든 설정/DLL 자원이 깔끔하게 추출 설치되도록 매핑을 완비했습니다.
    8. 다운로드 폴더 기반 단일 EXE 게시 및 정화 로직 완벽 복원: 사용자 지시에 따라 이전의 게시/설치 패키징 구조로 완벽히 원복하였습니다.
      • Visual Studio 게시 시: 다운로드 폴더(C:\Users\COMPUTER1\Downloads\)로 게시가 수행되며, 게시 완료 직후 정화 스크립트가 leak_test_project.exe, leak_test_project.pdb, libs 서브 폴더 및 부속 파편 파일 일체를 다운로드 폴더에서 깨끗이 삭제하여 오직 LeakTestSetup.exe 단 1개의 단일 설치 파일만 남도록 복구했습니다.
      • 설치 구동 시: 다운로드 폴더에 생성된 LeakTestSetup.exe를 실행하면 C:\LeakTest\ 경로에 프로그램 바이너리 및 설정/DLL이 설치되고, 바탕화면에 Leak Test System 바로가기 아이콘이 자동 생성됩니다.

📅 2026-07-28 (사용자 매뉴얼 목차 개편 및 단독 페이지/Dot Leader 적용, 표지 제거)

  • 내용: 사용자 매뉴얼(leak_test_project/Manual/사용자_메뉴얼.md)의 표지 구성을 제거하고, 목차를 단독 페이지로 독립 구성하였으며 Dot Leader 스타일이 적용된 1~14번 항목 양식으로 개편하였습니다.
  • 기능:
    1. 표지 구문 제거: 기존 매뉴얼 첫 페이지의 타이틀 및 버전 정보, 구분선 등 표지 역할을 하던 구문을 삭제하고 목차가 문서 첫 단독 페이지로 시작되도록 구성함.
    2. Dot Leader 목차 스타일 및 HTML 구조 도입: pdf_style.css.toc-container, .toc-item, .toc-leader 등 점선 리더 TOC 스타일을 정의하고, 사용자_메뉴얼.md의 목차를 1~14 번 항목(개요 ~ 부록) 및 해당 페이지 번호가 포함된 HTML 리더 구조로 구성함.
    3. 목차 단독 페이지화: 목차 컨테이너 하단에 <div class="page-break"></div> 구문을 추가하여 인쇄 및 PDF/HTML 변환 시 목차가 한 페이지를 독립적으로 차지하고 빠른 시작 가이드 및 본문이 다음 페이지부터 출력되도록 처리함.
    4. 목차 텍스트 숨김 결함 수정: pdf_style.css의 기존 a[href$=".md"] { display: none !important; } 인쇄 내비게이션 숨김 예외 규칙으로 인해 .toc-title a 링크 텍스트가 노출되지 않던 현상을 해결하기 위해 선택자를 a[href$=".md"]:not(.toc-title a)로 세밀화하고 .toc-title adisplay: inline !important;를 부여함.
    5. 통합 PDF/HTML 빌드 갱신 및 서브 앵커 정합성 보완: build_pdf.py 스크립트의 링크 치환 정규식을 고도화하여 1~14번 목차 항목이 파일 단위뿐만 아니라 문서 내 세부 단락 앵커(href="#11-개요", href="#73-좌우-채널-..." 등)로도 정확히 이동하도록 정합성을 맞추고 병합 문서(Manual_Merged.md, Manual_Merged.html) 갱신을 완료함.
    6. 목차 스타일만 갱신 (기존 1~9번 매뉴얼 내용/항목 보존): 사용자_메뉴얼.md의 기존 1~9번 매뉴얼 항목(시스템 개요 및 요구사항 ~ 오류 대응 및 프로그램 종료) 및 원본 내용을 변형 없이 온전히 유지하고, 표기 스타일만 이미지의 Dot Leader 디자인으로 적용하여 통합 문서 빌드를 완료함.
    7. 안내 문구 삭제: 사용자_메뉴얼.md 하단의 '본 문서는 Pressure Leak Inspect System v1.0.0 기준으로 작성되었습니다' 문구를 삭제함.
    8. 자동 시험 프로세스 흐름도 컴팩트화: 07_시험_프로세스.md의 전체 프로세스 흐름도를 2열 컴팩트 그리드(grid-template-columns: 1fr 1fr) 및 슬림 패딩으로 개편하여 페이지가 잘리거나 다음 페이지로 오버플로우되는 현상을 해결함.
    9. 인라인 배경색/폰트 설정 제거: 매뉴얼 본문 문서(01_시스템_개요.md, 02_초기_설정.md, 03_메인_화면.md, 07_시험_프로세스.md 등) 내부에 불필요하게 명시되어 있던 background-color, font-family, font-size 등 인라인 CSS 스타일 및 표 내 폰트/색상 설명 항목을 전면 제거하여 표준 마크다운 스타일로 정돈함.
    10. 사용자 매뉴얼 사족/디자인 기술문구 전면 제거: 매뉴얼 전반에서 "가시성 극대화", "볼드", "(연녹색 배경)", "(연주황 배경, 갈색 텍스트)", "시각적 피드백" 등 사용자 매뉴얼에 불필요한 디자인/디스플레이 스타일 서술 수식어 표현을 전면 삭제 및 정돈함.
    11. 데이터 조회 표 정렬 열 삭제: 06_데이터_조회.md의 데이터 조회 결과 표(그리드) 항목 안내에서 불필요한 '정렬' (좌측/우측/중앙) 컬럼을 삭제하여 명확하게 표 구조를 정리함.
    12. 개발자용 사족 표기 및 UI 타입 전면 정화: 03_메인_화면.md(Row 0) ~ (Row 6) 레이아웃 행 번호 사족 표기 삭제, 그리고 04_통신_설정.md, 05_시험_설정.md, 06_데이터_조회.md 표 헤더의 불필요한 UI 타입 (TextBox, ComboBox, DatePicker 등) 열 및 개발자적 서술 표현을 전면 정돈함.
    13. 오류 대응 문서 줄바꿈 교정: 09_오류_대응.md의 9.3 SPEC 교차 검증 경고 팝업 단락 문장과 서브 항목 리스트 간에 줄바꿈(빈 줄)을 넣어 정돈함.
    14. 로그인 설정 안내 갱신: 02_초기_설정.md에서 기존 Database.ini 로그인 방식 설명을 삭제하고, LoginOptions.json 파일의 loginAccounts 계정 추가/수정 및 옵션 드롭다운 필드 설정 안내로 갱신함.
    15. 데이터 조회 문단 줄바꿈 교정: 06_데이터_조회.md 상단 서술 문장 간 및 ## 6.1 화면 구성 헤더 사이의 공백 줄(줄바꿈)을 정돈함.
    16. 로그 관리 타임아웃 측정값 오기 수정: 08_로그_관리.md에서 타임아웃 발생 시 오기 기재되어 있던 측정값 0.0000을 실제 소스 코드 동작값인 9.9999 (판정 NG, 센서 판정 T/O)로 올바르게 수정함.
    17. 로그 관리 페이지 분리: 08_로그_관리.md8.5 데이터베이스 데이터 관리 (dbo.EOL) 단락 앞에 <div class="page-break"></div> 태그를 삽입하여 다음 페이지로 독립 배치되도록 개선함.