신성혁
실무2026.08 (하루)

LTE 모뎀 현장운용 도구 재설계

단일 파일에 얽혀 있던 LTE 모뎀 현장운용 프로그램을 계층별로 재설계하고 숨어 있던 결함을 찾아 고쳤습니다.

3,053→1,734줄
컨트롤러 줄 수
17파일 / 6계층
분리된 모듈
6건
발견한 결함

개요

가이아스에서 LTE 모뎀을 현장에서 점검할 때 쓰는 내부 도구를 재설계한 프로젝트입니다. 하나의 소스 파일이 3,053줄·멤버 함수 63개로 시리얼 포트 제어·재전송 상태머신·바이너리 프로토콜 파싱·암호 핸드셰이크·엑셀 입출력·화면 갱신까지 전부 뒤섞여 있었고, 계정 정보와 암호화 키가 소스 코드에 평문 상수로 박혀 있었습니다.

기존 동작을 100% 보존한 채 아키텍처만 먼저 재구성해 빌드가 통과하는 것을 확인한 뒤 기능을 얹는 순서로 진행해, 구조 변경과 신규 기능이 뒤섞여 원인 범위가 넓어지는 것을 막았습니다. 프로토콜 파싱, 포트 소유·재전송 상태머신, 암호화 절차, 설정 접근, 엑셀 입출력을 각각의 모듈로 분리하고 계정·키 값은 소스에서 설정 파일로 옮겼습니다. 특히 재전송 상태를 나타내던 전역 배열이 'ACK 성공'과 '재시도 소진 실패'를 구분하지 못하던 문제를 Idle/Pending/Acked/TimedOut 상태로 명시화했습니다.

구조를 정리하고 실장비로 직접 검증하는 과정에서, 증상이 조용해 그동안 버그로 인식되지 못했던 결함 6건을 찾아 고쳤습니다 — 고정 길이 필드의 패딩 때문에 주소값이 화면에서 빈칸으로 보이던 문제, 버퍼 길이를 잘못 읽어 시각 동기화 값이 매번 한 글자씩 잘려 전송되던 문제, 패킷을 받을 때마다 할당한 버퍼가 해제되지 않아 발생하던 메모리 누수, 응답 없는 명령이 재시도를 다 소진해도 화면에 아무 표시가 없던 문제 등입니다. 근본 원인은 통신 로그가 어디에도 남지 않는 구조였다는 점이라, 상시 통신 로그 화면을 신설해 같은 유형의 문제를 앞으로도 추적할 수 있게 했습니다. 프로토콜 상수·암호 키 값처럼 단말과 공유하는 값은 그대로 두고 저장 위치만 옮기는 등, 무엇을 고치고 무엇을 그대로 둘지 스스로 판단하며 진행했습니다.

원인 — 진단이 불가능했던 이유

여러 결함의 근본 원인은 통신 기록이 어디에도 남지 않는 구조였다는 점입니다. GUI 서브시스템이라 콘솔이 붙지 않아 hex 덤프를 표준 출력으로 찍어도 확인할 수 없었고, 그래서 상시 통신 로그 화면을 신설하는 것을 최우선 기능으로 삼았습니다.

핵심

  • 단일 파일 3,053줄·63개 함수를 프로토콜/통신/암호/설정/IO 등 6개 계층 17개 파일로 분리, 컨트롤러 43% 감소
  • 기존 동작 100% 보존 후 구조 변경 → 기능 추가 순으로 진행해 변경 범위 통제
  • 화면에 표시되지 않던 데이터 손실, 매번 잘려나가던 전송값, 패킷마다 발생하던 메모리 누수 등 조용히 실패하던 결함 6건 발견·수정
  • 상시 통신 로그 화면을 신설해 원인 추적이 불가능하던 문제들을 진단 가능한 상태로 전환
  • 빌드→런타임 수집→패키징까지 한 번에 처리하는 배포 스크립트 작성, 임의 경로 실행까지 검증

기술 스택

C++Qt 5.15MSVC시리얼 통신AES / SHA-256