장비를 제어하는 앱은 화면을 만드는 일과 성격이 다릅니다. 버튼을 눌렀을 때 화면이 바뀌는 게 아니라, 실제 기계가 움직여야 합니다. 움직이지 않으면 앱이 아무리 잘 만들어져 있어도 소용이 없습니다.
저희가 만든 건 초콜릿을 출력하는 3D 프린터를 조작하는 앱이었습니다. 사용자가 모델을 고르면 앱이 명령을 만들어 프린터로 보내고, 프린터가 보내오는 온도와 진행률을 받아 화면에 그립니다.
일반적인 앱 개발에서는 서버가 우리 편입니다. 응답이 느리면 서버를 고치면 되고, 형식이 불편하면 바꿔달라고 하면 됩니다. 장비는 그렇지 않습니다. 정해진 형식으로만 말하고, 정해진 속도로만 받습니다.
그래서 이런 개발은 장비가 무엇을 어떻게 받는지 파악하는 데서 시작합니다. 명령을 어떤 순서로 보내야 하는지, 한 번에 얼마나 보낼 수 있는지, 응답이 오기 전에 다음 것을 보내도 되는지를 하나씩 확인합니다.
개발 중에 출력이 도중에 20~30초씩 멈추고 속도가 들쭉날쭉해지는 증상이 있었습니다. 처음에는 장비 문제로 보였는데, 확인해 보니 저희가 보내는 순서에 원인이 있었습니다.
출력 중에도 화면에 온도와 진행률을 보여줘야 하니 상태를 주기적으로 물어봅니다. 그런데 이 질문과 출력 데이터 전송이 뒤섞이면서 응답 순서가 엉키고, 프린터의 수신 공간이 일시적으로 가득 차버렸습니다.
기능은 각각 잘 동작했습니다. 같이 동작할 때만 문제가 생겼습니다.
해결은 순서를 정리하는 것이었습니다. 출력 중에는 상태 조회도 전송과 같은 줄에 세워 순서대로 처리하고, 줄 사이에 불필요하게 기다리던 지연을 없앴습니다. 그 뒤로는 출력이 끊기지 않고 이어집니다.
장비 연동은 화면 개발보다 확인할 것이 많습니다. 다만 한 번 자리를 잡으면 그 뒤로는 안정적으로 돌아갑니다. 처음에 시간을 들이는 편이 결과적으로 빠릅니다.