6.8 KiB
6.8 KiB
BMS_D1000 프로젝트 개선 필요사항 분석 보고서
작성일시: 2026-08-11
분석 대상: BMS_D1000H C# 임베디드 솔루션 (BMS_D1000.sln)
1. 개요
BMS_D1000 프로젝트는 Windows CE 5.0 기반의 임베디드 타겟 장비에서 동작하는 모니터링 시스템입니다. 현재 동작 가능한 상태이지만, 코드의 안정성(Robustness), 유지보수성(Maintainability), 자원 관리(Resource Management) 및 불필요한 코드 관리 측면에서 몇 가지 중요한 개선 필요 항목이 확인되었습니다.
2. 세부 개선 필요 항목
🚨 2.1 예외 처리 및 런타임 안정성 (High Priority)
-
Modbus 데이터 파싱 경계 검사 부재 (
IndexOutOfRangeException위험)- 위치:
csModbusDataProcess.cs - 문제점:
ModBusSystemData_Reg및ModBusData_Reg메서드에서 수신 바이트 배열(bdata)의bdata[i],bdata[i+1]접근 시, 수신된 데이터 길이가 예기치 않게 짧은 경우IndexOutOfRangeException이 발생하여 프로그램이 비정상 종료될 위험이 있습니다. - 개선안: 데이터 파싱 전
if (i + 1 >= bdata.Length) break;와 같이 바이트 범위를 검증하는 방어적 코드(Defensive Coding) 추가.
- 위치:
-
전역 예외 처리기(Global Exception Handler) 미비
- 위치:
Program.cs - 문제점: 메인 루프 진입점에
Application.ThreadException또는AppDomain.CurrentDomain.UnhandledException처리 루틴이 없어, 처리되지 않은 런타임 에러 발생 시 사용자 안내 없이 즉시 튕기는 현상이 발생합니다. - 개선안:
Program.cs의Main()메서드에 최상위try-catch및 전역 예외 처리 핸들러 작성.
- 위치:
🛠️ 2.2 코드 가독성 및 아키텍처 개선 (Medium Priority)
-
대규모 하드코딩 Switch-Case 문 리팩토링
- 위치:
csModbusDataProcess.cs - 문제점: 100개 이상의 레지스터 주소가 단일
switch문으로 100여 줄 이상 나열되어 있어 가독성이 떨어지고 수정 시 오타 및 오동작 가능성이 큽니다. - 개선안: 오프셋 기반 계산식 또는 레지스터-데이터 맵(Dictionary / Delegate Mapping) 방식으로 파싱 구성을 모듈화.
- 위치:
-
하드코딩된 저장소 경로 추상화
- 위치:
AlarmFile.cs - 문제점:
@"Flash Disk\Run\alarmlist.sdf",@"Flash Disk\Run\AlarmHistory.db"와 같이 디바이스 특정 절대 경로가 코드 상수에 고정되어 있습니다. - 개선안: 실행 경로(
AppDomain.CurrentDomain.BaseDirectory) 기준 상대 경로 또는 설정 파일(App.config등) 기반으로 동적 경로 할당 처리.
- 위치:
🧹 2.3 미사용(Dead) 파일 및 프로젝트 정리 (Low Priority)
-
미사용 더미 Form 파일 방치
- 위치:
Form1.cs,Form2.cs,Form3.cs,Form4.cs(프로젝트 루트 디렉터리) - 문제점:
BMS_D1000.csproj에 포함되지 않은 빈 WinForm 소스 파일들이 루트 디렉터리에 남아있어 개발 시 혼란을 유발할 수 있습니다. - 개선안: 불필요한
Form1~Form4및.resx,.Designer.cs파일 삭제.
- 위치:
-
Service 디렉터리의
Class1.cs빌드 미포함- 위치:
Service/Class1.cs - 문제점: csproj에는
<Folder Include="Service\" />폴더만 등록되어 있고Class1.cs소스 파일이 Compile 항목에서 누락되어 있음. - 개선안: 해당 소스가 필요한 기능인지 확인 후
csproj에 포함하거나 삭제.
- 위치:
-
Old/디렉터리 백업 관리- 위치:
BMS_D1000/Old/ - 문제점: 소스 제어 시스템(Git 등)을 사용 중이라면 형상 관리에 남아있을 이전 버전 백업 디렉터리가 로컬 워크스페이스에 방치됨.
- 개선안: 필요에 따라 로컬 정리 및
.gitignore설정 점검.
- 위치:
⚡ 2.4 메모리 & 성능 최적화 (Optimization)
-
문자열 연산 시 Garbage Collector (GC) 부하 유발
- 위치:
AlarmFile.cs - 문제점:
WriteDataHeader등 로그 작성 루프 내에서+연산자로 문자열 연결(String Concatenation)을 다수 수행하여 GC 힙 메모리 할당이 빈번하게 일어납니다. Windows CE 디바이스는 RAM 자원이 매우 제한적이므로 GC 파즈(Pause)에 취약합니다. - 개선안:
StringBuilder패턴으로 변경하여 문자열 생성 효율 극대화.
- 위치:
-
파일 I/O 핸들 누수 방지
- 위치:
AlarmFile.cs - 문제점:
FileStream생성 및 닫기(Close()) 시try-finally또는using문 구문을 적극적으로 사용하지 않아 예외 발생 시 파일 잠금(Lock) 또는 핸들 누수가 지속될 수 있음. - 개선안: 파일 연산 시
using (FileStream fs = ...)블록 적용.
- 위치:
3. 종합 조치 권고사항 우선순위
| 우선순위 | 구분 | 대상 파일 / 모듈 | 권장 조치 내용 |
|---|---|---|---|
| P1 | 안정성 | csModbusDataProcess.cs | 배열 범위 검사 방어 로직 추가 (완료) |
| P1 | 안정성 | Program.cs | 전역 예외 처리기(Unhandled Exception Handler) 추가 (완료) |
| P2 | 자원 관리 | AlarmFile.cs | using 구문 적용 및 StringBuilder 사용, 경로 동적 추상화(PathHelper) (완료) |
| P2 | 코드 가독성 | csModbusDataProcess.cs | 거대 switch-case 모듈화 및 범위 기반 레지스터 매핑 리팩토링 (완료) |
| P3 | 코드 정리 | 루트 Form 파일들 (Form1~Form4), Service/Class1.cs |
불필요한 더미 소스 정리 및 csproj 동기화 |