1. OS 호환 문제: Windows 10 버전?
기존 Windows 8 -> 10 업그레이드 버전을 밀어버리고 기벼운 Windows 10 LTSB 2016을 설치하였다. LTSB는 Long Time Support Branch의 약자로, 윈도우 10의 기능 업데이트 없이 보안만 업그레이드해주는 고안정성 운영체제이다.
문제는 Flutter에서 Firestore 라이브러리를 불러오는 순간 앱이 아예 뻗어버린다. 문제는 Firestore Native는 무조건 'gPRC’라는 최신 HTTP 2기반 서비스를 사용하는데, 이게 Windows 10 2016에는 없었다.
Windows 10 LTSC 2021로 재설치를 해도, 여전히 저사양 하드웨어와 gPRC 호환성 문제로 작동이 되지 않았다. 가장 좋은 방법은 Firebase Admin SDK나 MongoDB Compatibility 모드로 돌리는 방식이지만, 하드웨어가 버틸지 의문이었다.
그래서 선택한 방식이 바로 Firebase RTDB이다. 이 친구는 HTTP 1.1, 원시적인 방식으로 굴러간다. 하지만 이미 다른 어플리케이션에서 사용하는 HTTPService가 실행하고 있기 때문에, 사실상 오버헤드 없이 원격 DB를 구축할 수 있다. 초기화 실패 시 로컬 로그로 전환하는 Fallback 기능을 넣어놓고, '개인정보’는 송신하지 않음으로써 안정적인 서버를 구축했다.
![]() |
![]() |
2. 인코딩 문제 : DB에 외계어가 나온다
Firebase RTDB 결제 정보 연동 후 문제가 터진다. 바로 외계어 "모지바케"가 나온다는 것. 문제는 이게 전체 언어가 아니라, 카드 이름에서만 나온다는 것이다. 가령 KB카드는 잘 나오더라도, KB’와이즈’카드는 ‘???댁즈’ 식으로 깨져서 보인다는 것이다.
원인은 EVCAT 소프트웨어가 Windows 라이브러리의 CP949 인코딩을 사용한다는 것. 이를 UTF-8인 Flutter가 깨뜨려서 보내버린다. 그래서 데이터를 보내기 전, CP949 -> UTF-8 번역 레이어를 적용하여 인코딩을 통일하니 발생하지 않는다.
![]() |
![]() |
3. 데이터 보안 및 규제 준수 (Compliance)
‘개인정보보호법’ 상, 로그나 데이터에 Plain-Text로 개인정보를 저장하면 안된다. 또한 저장할 때도, 로깅 데이터는 3개월 이상 경과 시 폐기가 원칙이다. 3개월 이후 자동 폐기하도록 앱 내 로직을 구현하였고, EVCAT에서 마스킹을 지원하기 때문에 카드번호는 마스킹하고 로컬에만 저장하는 식으로 방식을 확립했다.
또한 로깅에서 Severity High (Error/Payment)인 항목만 Firebase RTDB 실시간 전송을 통해 정리할 수 있다.
4. CI/CD 및 자동 업데이트 시스템 (진행 중)
목표는 Github Release API를 통해 최신 빌드를 체크하고, 빌드가 업데이트됬을 경우 Batch 스크립트를 통해 Update를 실행하는 것이다.
Update Script는 임시 폴더 다운로드 -> 실행 중인 프로세스 종료 -> 파일 교체 -> 재실행 형식으로 진행되며, 하드웨어 제한으로 인해 보류하였다.
5. PEBCAK 문제 : 영수증 커팅을 기다려주세요 제발
영수증은 기본적인 시리얼 방식의 115200 프린터를 통해 작동한다. 그런데 몇 번 문제가 발생했다. 바로 프린터 재밍 문제가 발생한다는 것. 커팅 작업은 별도의 커맨드이기 때문에 시리얼 플러쉬 후 커팅하도록 세팅했는데, 사용자가 커팅 사이에 있는 3초 루프를 기다리지 않고 손으로 잡아당기면 재밍이 일어나 다음 영수증을 출력할 수 없다. “제발 기다려주세요!!!”
추후에 영수증 가드나 플러시 속도 개선을 통해 해결할 예정이다.
6. Docs 문제와 결제 -> DB 갱신 문제 : 닭이 먼저냐 알이 먼저냐?
주차장 업체에서 제공한 Docs에는 '필수 필드’로 작성이 되어있으나 비고에 '미작성 시 차량 번호로 대체’라는 내용이 있었다. 나는 전적으로 비고란을 믿고 '미작성하면 서버측에서 번호로 대체하는 로직이 있겠지’하고 공백으로 보낸다. 문제는 필수 필드라서 오류가 발생, "결제는 했는데 주차가 안되요"라는 최악의 연락이 오게 된다. DB에서 오류가 나오면 결제를 한 것을 취소할 수도 없고, 난감한 상황이 나온다.
이 문제도 추후 해결할 예정이다.
![]() |
![]() |
7. 프로젝트를 마치며
단순한 프론트 앱 하나 개발이라고 생각했지만, 생각보다 실 사용자 측면에서 생각하고, 유지관리와 보수 시스템을 만들고, 유저의 피드백을 들으면서 실제 제품의 완성도를 올리는 것은 단순한 개발 능력이 필요한 것 뿐만 아니라 '소통’의 영역임을 느끼게 되었다. 특히 많은 프로그래밍이 AI에게 대체되는 요즘, 사용자의 필요성을 맞추어 개발하는 능력이야 말로 기본 소양이 아닐까?





