Qt D-Bus 개요
D-Bus는 원래 Linux용으로 개발된 프로세스 간 통신(IPC) 및 원격 프로시저 호출(RPC) 메커니즘으로, 기존 및 경쟁 IPC 솔루션을 하나의 통합된 프로토콜로 대체하기 위해 개발되었습니다. 또한 시스템 수준 프로세스(예: 프린터 및 하드웨어 드라이버 서비스)와 일반 사용자 프로세스 간의 통신을 허용하도록 설계되었습니다.
빠른 바이너리 메시지 전달 프로토콜을 사용하며, 지연 시간이 짧고 오버헤드가 적어 동일 머신 간 통신에 적합합니다. 이 프로토콜의 사양은 현재 freedesktop.org
프로젝트에서 정의되어 있으며 모든 당사자가 사용할 수 있습니다.
일반적으로 통신은 '버스'라는 중앙 서버 애플리케이션을 통해 이루어지지만(따라서 이름도 버스), 애플리케이션과 애플리케이션 간의 직접적인 통신도 가능합니다. 버스에서 통신할 때 애플리케이션은 사용 가능한 다른 애플리케이션과 서비스를 쿼리할 수 있을 뿐만 아니라 필요에 따라 활성화할 수도 있습니다.
버스
D-Bus 버스는 다대다 통신이 필요할 때 사용됩니다. 이를 위해 애플리케이션이 버스에 연결하기 전에 중앙 서버가 먼저 실행됩니다. 이 서버는 연결된 애플리케이션을 추적하고 소스에서 목적지까지 메시지를 적절하게 라우팅하는 역할을 담당합니다.
또한 D-Bus는 시스템 버스와 세션 버스라는 두 개의 잘 알려진 버스를 정의합니다. 이 버스는 의미가 잘 정의되어 있다는 점에서 특별합니다. 일부 서비스는 이 버스 중 하나 또는 둘 모두에서 찾을 수 있도록 정의되어 있습니다.
예를 들어 컴퓨터에 연결된 하드웨어 장치 목록을 쿼리하려는 애플리케이션은 시스템 버스에서 사용 가능한 서비스와 통신하고, 사용자의 웹 브라우저를 여는 서비스는 세션 버스에서 찾을 수 있을 것입니다.
시스템 버스에서는 각 애플리케이션이 제공할 수 있는 서비스에 대한 제한 사항도 찾을 수 있습니다. 따라서 특정 서비스가 존재한다면 신뢰할 수 있는 애플리케이션에서 제공하는 서비스라는 것을 합리적으로 확신할 수 있습니다.
개념
메시지
낮은 수준에서 애플리케이션은 서로에게 메시지를 전송하여 D-Bus를 통해 통신합니다. 메시지는 원격 프로시저 호출과 이와 관련된 응답 및 오류를 전달하는 데 사용됩니다. 버스를 통해 사용될 때 메시지는 목적지가 있으므로 "스워밍" 또는 방송으로 인한 혼잡을 피하여 관심 있는 당사자에게만 라우팅됩니다.
그러나 "시그널 메시지"(Qt의 신호와 슬롯 메커니즘에 기반한 개념)라고 하는 특별한 종류의 메시지는 미리 정의된 목적지가 없습니다. 신호 메시지는 일대다 컨텍스트에서 사용되는 것이 목적이므로 "옵트인" 메커니즘을 통해 작동하도록 설계되었습니다.
Qt D-Bus 모듈은 메시지의 저수준 개념을 Qt 개발자에게 익숙한 보다 단순한 객체 지향 접근 방식으로 완전히 캡슐화합니다. 대부분의 경우 개발자는 메시지 송수신에 대해 걱정할 필요가 없습니다.
서비스 이름
버스를 통해 통신할 때 애플리케이션은 "서비스 이름"이라는 것을 얻게 되는데, 이는 동일한 버스에 있는 다른 애플리케이션이 해당 애플리케이션을 알 수 있도록 선택하는 방법입니다. 서비스 이름은 D-Bus 버스 데몬에 의해 중개되며 한 애플리케이션에서 다른 애플리케이션으로 메시지를 라우팅하는 데 사용됩니다. 서비스 이름과 유사한 개념으로 IP 주소와 호스트 이름이 있습니다. 컴퓨터는 일반적으로 하나의 IP 주소를 가지며, 네트워크에 제공하는 서비스에 따라 하나 이상의 호스트 이름을 가질 수 있습니다.
반면 버스를 사용하지 않는 경우에는 서비스 이름도 사용하지 않습니다. 이를 다시 컴퓨터 네트워크에 비유하면 지점 간 네트워크와 같으며, 피어를 알 수 있으므로 호스트 이름을 사용하여 피어 또는 해당 IP 주소를 찾을 필요가 없습니다.
D-Bus 서비스 이름의 형식은 사실 호스트 이름과 매우 유사하며, 점으로 구분된 문자와 숫자의 시퀀스입니다. 심지어 해당 서비스를 정의한 조직의 도메인 이름에 따라 서비스 이름을 정하는 것이 일반적인 관행입니다.
예를 들어 D-Bus 서비스는 freedesktop.org
에 의해 정의되며 서비스 이름 아래 버스에서 찾을 수 있습니다:
org.freedesktop.DBus
개체 경로
네트워크 호스트와 마찬가지로 애플리케이션은 개체를 내보냄으로써 다른 애플리케이션에 특정 서비스를 제공합니다. 이러한 객체는 QObject 에서 파생된 클래스가 갖는 부모-자식 관계와 마찬가지로 계층적으로 구성됩니다. 그러나 한 가지 차이점은 모든 객체가 궁극적인 부모로 갖는 '루트 객체'라는 개념이 있다는 것입니다.
웹 서비스로 계속 비유하자면, 객체 경로는 URL의 경로 부분과 동일합니다:
D-Bus의 개체 경로는 파일 시스템의 경로 이름과 유사하게 형성되며, 각각 문자, 숫자 및 밑줄 문자("_")로 구성된 슬래시로 구분된 레이블입니다. 항상 슬래시로 시작해야 하며 슬래시로 끝나면 안 됩니다.
인터페이스
인터페이스는 C++ 추상 클래스 및 Java의 interface
키워드와 유사하며 호출자와 수신자 간에 설정되는 "계약"을 선언합니다. 즉, 사용 가능한 메서드, 시그널 및 프로퍼티의 이름과 통신이 설정될 때 양쪽에서 예상되는 동작을 설정합니다.
Qt는 플러그인 시스템에서도 매우 유사한 메커니즘을 사용합니다: C++의 베이스 클래스는 Q_DECLARE_INTERFACE() 매크로를 통해 고유 식별자와 연결됩니다.
실제로 D-Bus 인터페이스 이름은 Qt 플러그인 시스템에서 제안하는 것과 유사한 방식으로 명명됩니다: 식별자는 일반적으로 해당 인터페이스를 정의한 엔티티의 도메인 이름으로 구성됩니다.
치트 시트
명명 형식과 그 목적을 쉽게 기억하기 위해 다음 표를 사용할 수 있습니다:
D-Bus 개념 | 비유 | 이름 형식 |
---|---|---|
서비스 이름 | 네트워크 호스트 이름 | 점으로 구분("호스트 이름처럼 보임") |
개체 경로 | URL 경로 구성 요소 | 슬래시로 구분("경로처럼 보임") |
인터페이스 | 플러그인 식별자 | 점으로 구분 |
디버깅
D-Bus를 사용하는 애플리케이션을 개발할 때 각 애플리케이션이 버스를 통해 주고받는 메시지에 대한 정보를 볼 수 있으면 유용할 때가 있습니다.
이 기능은 각 애플리케이션을 실행하기 전에 QDBUS_DEBUG
환경 변수를 설정하여 애플리케이션별로 활성화할 수 있습니다. 예를 들어, 다음과 같은 방법으로 컨트롤러와 자동차를 실행하여 D-Bus 원격 제어 자동차 예제에서 자동차에 대해서만 디버깅을 활성화할 수 있습니다:
examples/dbus/remotecontrolledcar/controller/controller & QDBUS_DEBUG=1 examples/dbus/remotecontrolledcar/car/car &
메시지 관련 정보가 애플리케이션이 실행된 콘솔에 기록됩니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.