Skip to content

RDP 블라인드 조작 문제부터 MS Store 등록까지: RDP Heartbeat 탄생기

2026-03-29

Tags: [개발 일지](/ko/blog/tags/#개발 일지) · 제품 · RDP · Windows

프롤로그: Vibe Coding 중의 «불청객»

저는 자주 UDP 프로토콜 기반 RDP(원격 데스크톱) 머신에 연결하여 코드를 작성하며, 집중하면서도 편안한 «vibe coding» 상태에 빠집니다.

그 과정에서 시간이 오래 걸리는 작업을 만나는 것은 불가피합니다: 반응이 느린 API를 기다리거나, 백그라운드에서 오래 조용히 처리 중인 스크립트 등. 화면이 한 창에 오래 멈춰 있는 것은 지극히 정상적인 일입니다. 보통은 신경 쓰지 않고 웹서핑을 하거나 의자에 기대어 기다립니다.

하지만 나중에 미치게 만드는 현상을 발견했습니다: 때로는 작업이 이미 끝났는데, RDP 화면만 완전히 멈춰 있었던 것입니다.

순수 TCP 연결에서도 같은 문제가 있는지는 확실하지 않습니다(TCP 지연이 상대적으로 높아서 저는 UDP의 부드러움을 선호합니다). 하지만 UDP 모드에서는 이 «슈뢰딩거의 정지» 현상이 분명히 존재합니다.

최악의 시나리오: 연결이 끊긴 게 아니라 — 그냥 장님이 된 것

네트워크가 나빠서 RDP가 «연결이 끊어졌습니다»라고 팝업을 띄워주면 오히려 좋습니다 — 적어도 재연결해야 한다는 것을 알 수 있으니까요.

하지만 가장 고통스러운 것은, 화면은 더 이상 업데이트되지 않는데 키보드와 마우스 이벤트는 여전히 전송되고 있다는 것입니다!

상상해 보세요: 멈춰 있는 화면을 보며 스크립트가 아직 안 끝났다고 생각합니다. 참다못해 마우스를 움직여 보아도 화면은 반응하지 않습니다. 눈 가리고 아무렇게나 클릭하고 엔터를 몇 번 눌러 «깨워» 보려 하지만... 여전히 침묵뿐입니다.

결국 RDP 창을 수동으로 닫고 다시 연결합니다. 연결 후에야 공포에 질려 발견합니다: 방금 그 블라인드 클릭과 타이핑이 모두 원격 머신에서 실제로 실행되었다는 것을. 시각적 피드백 없는 조작은 개발자에게 최악의 악몽입니다.

복잡한 패널은 필요 없어요 — 한눈의 안심만 있으면 됩니다

이 문제에 대한 제 요구 사항은 극도로 단순하고 순수했습니다: 화면 구석에 영원히 조용히 떠 있는 작은 무언가 하나만 있으면 됩니다.

그것이 깜빡이면 화면이 실시간으로 업데이트되고 있다는 것을 알고 안심하고 API 응답을 기다릴 수 있습니다. 멈추면 즉시 깨닫습니다: «아, 또 정지했네, 재연결해야지» — 블라인드 조작의 재앙을 완벽하게 피할 수 있습니다.

뜻밖의 행운: 마법 같은 «Keep-Alive» 효과

이렇게 RDP Heartbeat가 탄생했습니다. 클릭스루를 지원하고, 정상적인 조작을 절대 방해하지 않도록 존재감을 최소화하여 설계되었습니다. 유일한 사명: 원격 작업 시 가장 필요한 «시각적 확인감»을 제공하는 것.

하지만 재미있는 일이 생겼습니다: 이것을 사용하기 시작한 후, RDP 화면 정지 현상이 놀라울 정도로 거의 발생하지 않게 되었습니다.

이것은 완전한 의외의 기쁨이었습니다. 제 추측: 이 숨쉬는 조명이 화면 구석에서 계속 픽셀 수준의 새로고침을 수행하기 때문에, 이 지속적인 화면 업데이트가 애플리케이션 계층의 «keep-alive» 메커니즘으로 작용하여 RDP 세션에 활성 데이터 스트림을 유지시키는 것이 아닌가 합니다. 솔직히 기반 네트워크 프로토콜 메커니즘을 깊이 조사하지는 않았으므로 단언할 수는 없습니다. 한마디로: 마법처럼 작동합니다.

만든 김에 스토어에 등록해볼까요 (그리고 겪었던 시행착오들)

구석에서 조용히 깜빡이는 이 작은 것을 보며, 같은 고통을 겪는 다른 개발자들도 쓸 수 있을 것 같아 Microsoft Store에 등록하기로 결정했습니다.

결과적으로, 이것은 극도로 고역스러운 결정이었습니다.

Python으로 작성했기 때문에, 전체 패키징 및 등록 과정은 피와 눈물의 서사시였습니다: Python 소스 코드 → PyInstaller로 exe 생성 → Inno Setup으로 설치 프로그램 제작 → 최종적으로 MSIX 패키지로 변환. 네이티브 WinUI 3의 매끄러운 패키징 경험과 비교하면, 이 워크플로우는 구불구불한 산길이었습니다.

또한 Python 데스크톱 앱이 시각적인 세련됨에서 약간 부족하다는 점도 인정해야 합니다.

향후 계획

시간이 나면 Python에서 MSIX까지의 전체 패키징 과정을 자세히 공유하는 글을 쓸 계획입니다. 최적의 해결책은 아니지만, 적어도 갈 수 있는 길입니다 — Python 도구를 스토어에 등록하고 싶은 분들에게 도움이 되길 바랍니다.

RDP Heartbeat 자체는 다른 프로젝트가 마무리되면 네이티브 WinUI 3로 완전히 재작성하여, 이 작은 숨쉬는 조명을 더욱 부드럽고 우아하게 만들고 싶습니다.

정지된 원격 화면을 멍하니 바라보는 일이 잦거나 RDP의 갑작스러운 정지 때문에 고통받고 있다면, 이 작은 도구를 사용해 보세요. 모든 vibe coding 세션에서 좋은 기분을 지켜주길 바랍니다.

Microsoft Store에서 받기

RDP Heartbeat에 대해 자세히 알아보기