레거시 인터페이스를 스마트홈에 연결하는 실용적 접근
소프트웨어 엔지니어가 아날로그 노브만 달린 구형 에어컨을 스마트홈에 통합한 사례는, 백엔드 개발자 시각에서도 꽤 많은 것을 시사한다. 핵심 아이디어는 단순하다. 기존 인터페이스를 전혀 수정하지 않고, 외부에서 물리적으로 제어 레이어를 덧씌운다. 세입자 신분이라 에어컨 자체에 손댈 수 없는 제약 조건이 있었지만, 오히려 이 제약이 더 범용적인 솔루션을 만들어냈다.
구성 요소는 스테퍼 모터, ESP32, 샤프트 커플러, L브라켓, 바인더 클립이 전부다. 총 재료비는 약 15달러. ESP32는 MQTT 브로커를 통해 Home Assistant와 통신하고, 같은 방에 있는 온도 센서 상태에 따라 에어컨 노브를 자동으로 돌려준다.
시스템 통합 관점에서 본 아키텍처
이 프로젝트의 구조는 백엔드 시스템 통합 패턴과 닮아 있다. 레거시 시스템(아날로그 노브)을 직접 수정하지 않고, 그 위에 어댑터 레이어(스테퍼 모터 + ESP32)를 얹어 현대적인 인터페이스(MQTT/Home Assistant)와 연결하는 방식이다.
[온도 센서] → [Home Assistant] → [MQTT Broker]
↓
[ESP32 펌웨어]
↓
[스테퍼 모터 → 노브]
백엔드에서 레거시 DB나 외부 시스템을 연동할 때 Anti-Corruption Layer를 두는 것과 구조적으로 동일하다. 내부 구현(물리적 노브)은 그대로 두고, 외부에서 표준 프로토콜로만 소통한다. MQTT는 경량 pub/sub 프로토콜로, IoT 환경에서 HTTP보다 오버헤드가 훨씬 작아 임베디드 환경에 적합하다.
제약 조건이 설계를 단순하게 만든다
소프트웨어 엔지니어로서 이 프로젝트에서 가장 인상적인 점은 제약을 설계 원칙으로 전환한 방식이다. "보증금을 잃지 않는다"는 제약은 비파괴적(non-destructive) 부착 방식을 강제했고, 결과적으로 어떤 유사한 노브 타입 기기에도 재사용 가능한 솔루션이 됐다.
실무에서도 마찬가지다. 기존 테이블 스키마를 건드릴 수 없는 상황, 외부 API 스펙을 변경할 수 없는 상황에서 우리는 어댑터, 래퍼, 이벤트 브릿지를 만든다. 제약이 명확할수록 해결책의 경계도 명확해진다. "기존 시스템을 건드리지 않고 새 기능을 붙인다"는 명제는 코드든 하드웨어든 동일하게 작동한다.
펌웨어 쪽 로직도 단순하다. MQTT 메시지를 수신하면 목표 위치까지 스텝 수를 계산해 모터를 구동하는 것이 전부다.
void setKnobPosition(int targetStep) {
int delta = targetStep - currentStep;
stepper.step(delta);
currentStep = targetStep;
}
상태는 currentStep 하나로 관리되고, 멱등성 있는 위치 지정 방식을 택해 네트워크 재연결 후에도 안전하게 동작한다.
정리
- 레거시 인터페이스를 수정하지 않고 외부 어댑터 레이어로 감싸는 패턴은 소프트웨어 통합 설계와 구조적으로 동일하다
- MQTT 기반 pub/sub 구조는 IoT뿐 아니라 경량 비동기 이벤트 처리가 필요한 백엔드 컴포넌트 설계에도 참고할 만하다
- 제약 조건을 설계 원칙으로 전환하면, 오히려 더 범용적이고 유지보수하기 쉬운 솔루션이 만들어진다