업무 시스템 · 2024
배달 주문 접수 데스크톱 클라이언트
매장 PC에서 주문을 받고 영수증 프린터로 전표를 출력하는 Windows 앱
조리 중에도 새 주문을 놓치지 않도록 주문을 주기적으로 확인해 알림음과 알림창으로 알리고, 접수·취소·완료 처리와 전표 출력을 한 프로그램에서 끝내도록 만든 Windows 데스크톱 클라이언트입니다.
- 고객
- 비공개 고객
- 분야
- 업무 시스템

개요
매장이 배달 주문을 받아 처리하는 Windows 데스크톱 클라이언트입니다. 매장 PC나 POS 단말에 설치해 상주시키고, 매장 직원이 주문 확인부터 접수, 취소, 완료 처리와 주방·라이더용 전표 출력까지 이 프로그램 안에서 처리합니다.
주문 데이터는 판매자 시스템 서버에서 가져오고, 전표는 매장에 이미 설치된 시리얼 영수증 프린터로 출력합니다. 설치 파일은 PyInstaller로 묶은 단일 실행 파일이라 매장에서 별도 설치 과정 없이 실행할 수 있습니다.
과제
매장 직원은 조리 중이라 화면을 계속 보고 있을 수 없습니다. 브라우저로 판매자 시스템을 열어 두는 방식으로는 새 주문이 들어온 것을 바로 알기 어렵고, 주문 내용을 주방과 라이더에게 전달할 종이 전표도 따로 만들어야 했습니다.
현장 조건도 제약이었습니다. 매장에서 쓰는 POS 디스플레이는 1024x768처럼 작은 해상도가 섞여 있어 화면 요소 크기를 고정값으로 둘 수 없었고, 영수증 프린터는 매장마다 다른 COM 포트와 통신 속도로 연결되어 있어 직원이 직접 맞출 수 있어야 했습니다.
해결 방법
로그인하면 주문 목록이 열리고, 주문마다 상태에 맞는 버튼이 붙습니다. 신규 주문은 '주문 확인', 접수한 주문은 '진행 중', 그 외에는 완료·취소 주문으로 구분되며 한 페이지에 열 건씩 보여 줍니다.

주문을 누르면 상세 창이 열립니다. 라이더 요청사항, 상품과 옵션별 금액, 도로명·지번 주소와 안심번호, 주문 번호와 주문 시각을 한 화면에 모았습니다. 여기에서 바로 처리할 수 있는 동작은 다음과 같습니다.
- 배달 시간을 5분 단위로 5분에서 90분까지 조정한 뒤 접수
- 고객요청, 가게사정, 배달불가, 재료소진 중 사유를 골라 취소
- 진행 중인 주문을 완료 처리
- 전표 출력
새 주문과 판매자 시스템의 중요 알림은 백그라운드에서 5초마다 확인합니다. 새 주문이 확인되면 항상 맨 앞에 뜨는 알림창과 알림음으로 알리고, 확인을 누르면 주문 목록으로 이동합니다. 창을 닫아도 프로그램은 트레이에 남아 알림을 계속 받습니다.
시스템 구조
- 화면: wxPython 프레임 하나에 로그인, 주문 목록, 운영 설정, 프린터 설정 패널을 두고 메뉴로 전환합니다. 주문 상세와 알림은 별도 창입니다.
- 서버 통신: 통신 코드를 모듈 한 곳에 모아 두고, 단일 엔드포인트에
service값을 바꿔 가며 로그인, 주문 목록, 주문 상세, 신규 주문 수, 중요 알림, 접수·취소·완료, 버전 확인을 요청합니다. 받아 온 주문 목록은 메모리에 캐시해 목록 화면에서 재사용합니다. - 감시 스레드: 새 주문 확인, 중요 알림 확인, 알림음 재생을 각각 데몬 스레드로 돌려 화면 조작과 분리했습니다.
- 출력: 주문 상세를 ESC/POS 명령으로 바꿔 시리얼 프린터로 보냅니다.
구현

새 주문을 가려내기. 서버가 알려 주는 '신규' 상태 주문의 수만 보면, 이미 신규 주문이 쌓여 있을 때 새로 들어온 주문을 구분할 수 없습니다. 그래서 직전에 받아 둔 주문 번호 목록과 비교해, 처음 보는 번호이면서 상태가 '신규'일 때만 알림을 띄웁니다.
알림음. 콜백 방식으로 WAV를 재생하면서 프레임마다 설정된 음량 비율을 적용합니다. 주문 알림은 알림창이 떠 있는 동안 반복 재생하고, 중요 알림은 한 번만 재생합니다. 운영 설정 화면에서 켜짐 여부와 음량을 조절하고 미리 들어 볼 수 있습니다.

한글 전표 조판. 영수증 프린터는 글자 폭이 고정된 장치라 80mm 용지 기준 한 줄 42칸에 맞춰 직접 조판했습니다. 한글은 두 칸으로 계산해 상품명, 수량, 금액 열을 정렬하고, 열 폭을 넘는 상품명은 다음 줄로 접어 내립니다. 코드 페이지는 CP949를 씁니다.
연결 확인과 설정. 출력 전에 WMI로 선택한 COM 포트가 실제로 있는지 확인하고, 없으면 설정을 확인하라는 메시지를 띄웁니다. 포트와 통신 속도는 프린터 설정 화면에서 고르고, 테스트 출력으로 바로 확인합니다.
현장 환경 대응. 글자 크기는 모니터 높이에 비례해 계산하므로 작은 POS 디스플레이에서도 읽을 수 있습니다. 자동 실행은 레지스트리의 사용자 시작 프로그램 항목으로 등록하며, 실행 파일 위치가 바뀌었으면 이전 등록을 지우고 다시 넣습니다. 로그는 자정 기준으로 파일을 나눠 열흘 치를 남기고, 표준 출력과 오류도 같은 로그로 보냅니다.
결과
매장 직원은 주문 알림을 받고, 내용을 확인하고, 배달 시간을 정해 접수하고, 전표를 뽑는 일을 프로그램 하나에서 합니다. 브라우저를 따로 열어 두거나 주문 내용을 손으로 옮겨 적을 일이 없어졌습니다.
PC를 켜면 자동으로 실행되어 트레이에 상주하므로 매장에서 따로 띄울 필요가 없고, 프린터 포트와 통신 속도는 설치 기사나 직원이 화면에서 직접 맞추고 테스트 출력으로 확인할 수 있습니다. 동작 기록이 날짜별 로그로 남아 문제가 생겼을 때 어느 단계에서 어긋났는지 되짚을 수 있습니다.
사용 기술
- Python
- wxPython
- python-escpos
- PyAudio
- PyInstaller
화면



진행하려는 프로젝트가 있으신가요?
해결하려는 문제와 지금 상황을 알려 주시면, 어떤 방식이 맞을지 함께 검토합니다.
프로젝트 문의하기