Qt Remote Objects 복제본
컴파일된 레플리카는 ` QRemoteObjectReplica `을 기반으로 하는 타입으로, 파생 클래스 정의는 repc 컴파일러에 의해 자동으로 생성됩니다. CMake 함수나 qmake 변수를 사용하여 repc 컴파일러를 실행하면, 이 생성 과정이 빌드 프로세스의 일부가 됩니다. 헤더 파일만 생성되지만, 이는 완전한 타입입니다. 공개 생성자가 없으므로, Replica 인스턴스를 생성하려면 ` QRemoteObjectNode::acquire ` 템플릿 함수를 사용해야 합니다.
QRemoteObjectDynamicReplica 는 런타임에 생성할 수 있습니다. 이를 위해 QRemoteObjectNode::acquireDynamic()를 호출하고, 소스 이름( QString)을 인수로 전달하면 됩니다. C++에서 동적 레플리카를 사용하는 방법은 약간 더 복잡하지만, 컴파일이 필요하지 않습니다. 동적 레플리카는 초기화된 후까지 속성의 초기값이나 인트로스펙션을 지원하지 않습니다.
이 두 가지 레플리카 생성 방식 간의 중요한 차이점은 레플리카가 초기화되기 전의 동작에 있습니다. 동적 레플리카는 초기화 후에야 메타오브젝트(metaObject)를 얻기 때문에, 초기화 전에는 기본적으로 API가 전혀 없습니다. 즉, 속성도 없고 슬롯을 연결할 신호도 없습니다.
컴파일된 레플리카의 메타오브젝트는 컴파일 시점에 생성되므로, 레플리카가 인스턴스화될 때 해당 API를 사용할 수 있습니다. 템플릿 파일에서 속성에 대한 기본값을 지정할 수도 있으며, 이 값들은 소스에서 가져온 실제 값으로 레플리카가 초기화될 때까지 사용됩니다.
레플리카 초기화
호스트 노드는 자신이 호스팅하는 소스 목록을 연결된 다른 모든 노드와 공유합니다. 이 호스트는 목록에 소스가 추가되거나 제거될 때 업데이트를 전송합니다. 이러한 방식으로, 연결된 노드는 자신이 어떤 소스에 연결할 수 있는지 항상 파악할 수 있습니다. 특정 소스에 대한 변경 사항은 해당 소스의 복제본을 보유한 노드에게만 전파됩니다. 결과적으로, 이를 통해 불필요한 네트워크 트래픽을 방지할 수 있습니다.
노드가 알려진 소스에 대한 복제본을 획득하면, 해당 소스에 대한 요청을 호스트 노드에 보냅니다. 이 요청을 수신하면 호스트는 해당 소스의 모든 속성에 대한 현재 값을 포함하는 응답 패킷을 생성합니다. 요청된 복제본이 ` dynamic`인 경우, 응답 패킷에는 해당 소스의 API 정의가 포함됩니다. 그 이후부터 해당 복제본의 노드는 해당 소스의 변경 사항을 수신하는 연결 목록에 포함됩니다.
레플리카가 인스턴스화되었지만 해당 노드가 요청된 소스를 호스팅하는 노드에 연결되어 있지 않은 경우, 또는 해당 객체가 호스트 노드 프로세스에 존재하지만 QObject 에 대해 공유/원격 처리가 활성화되지 않은 경우, 레플리카는 생성되지만 초기화되지 않은 상태로 유지됩니다.
나중에 복제본의 노드가 연결된 노드에서 요청된 소스를 사용할 수 있다는 알림을 받으면, 그 시점에서 소스를 요청하고 초기화 프로세스를 시작합니다.
호스트 노드와의 연결이 끊어지면, 레플리카는 ‘무효(invalid)’ 상태로 전환됩니다. 레플리카는 재연결을 시도하며, 연결이 복구되면 재초기화됩니다. 이를 통해 모든 속성이 최신 상태로 유지됩니다.
레플리카 소유권
획득 메서드 QObject 는 노드에 의해 인스턴스화된 복제본에 대한 포인터를 반환합니다. 노드는 복제본의 예상 수명을 알 수 있는 방법이 없습니다. 따라서 복제본이 더 이상 필요하지 않을 때, 이를 삭제하는 것은 호출하는 프로그램의 책임입니다.
동일한 복제본을 여러 개 생성할 수 있습니다. 단일 노드에서 동일한 소스에 대한 모든 복제본은 네트워크 통신을 처리하는 비공개 데이터 멤버를 공유합니다. 즉, 복제본의 인스턴스가 여러 개 있어도 추가적인 네트워크 트래픽은 발생하지 않지만, 약간의 추가 처리 오버헤드는 발생합니다. 레플리카를 삭제하지 않으면 이 비공개 객체의 참조 횟수가 0이 되지 않게 되어, 호출 프로세스가 종료될 때까지 불필요한 네트워크 통신이 발생하게 됩니다. 이러한 이유로, 레플리카의 수명을 추적하는 데 도움이 되도록 QScopedPointer 또는 QSharedPointer 을 사용하는 것이 권장됩니다.
© 2026 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.