## 0.1 동적 라이브러리(.so) 로더를 활용한 런타임 플러그인 동적 주입 구조
ROS2의 rclcpp_components 아키텍처가 지니는 유연성의 기저에는 C++의 정적 타입(Static Type) 한계를 우회하는 클래스 로더(Class Loader) 패턴이 자리 잡고 있다. 이 시스템은 기초적으로 POSIX 운영체제 표준의 dlopen(), dlsym() 시스템 콜을 정교하게 캡슐화한 pluginlib 또는 class_loader 기반의 동적 링킹(Dynamic Linking) 기술을 활용하여, 이미 가동 중인 프로세스의 메모리 공간에 새로운 로보틱스 기능을 실시간으로 주입(Injection)한다.
0.1.1 ComponentManager 컨테이너 서버의 서비스 지향적 로딩
ros2 run rclcpp_components component_container 명령을 통해 시스템상에 컨테이너 프로세스가 생성되면, 이 빈 껍데기 프로세스는 내부적으로 ComponentManager라는 특별한 관리자 노드를 실행한다. 이 관리자 노드는 ROS2 네트워크 상에 /_container/load_node, /_container/unload_node와 같은 일련의 서비스 서버(Service Server) 엔드포인트를 개방하고 클라이언트의 동적 로딩 요청을 대기한다.
외부의 터미널 CLI 도구(ros2 component load)나 launch 스크립트를 통해 특정 패키지의 컴포넌트 이름이 이 서비스로 전달되면, ComponentManager는 Ament 환경 변수의 리소스 인덱스를 탐색하여 해당 컴포넌트가 구현된 동적 라이브러리(.so)의 절대 시스템 경로를 해석(Resolution)해낸다.
0.1.2 메모리 기저 수준에서의 동적 심볼(Symbol) 해석과 팩토리 실행
동적 라이브러리 파일 경로가 특정되면, 컨테이너 프로세스는 dlopen()을 호출하여 해당 .so 파일의 바이너리를 자신의 가상 메모리 주소 공간(Virtual Memory Address Space)으로 맵핑(Mapping)한다. 라이브러리가 메모리에 적재된 후, class_loader 시스템은 dlsym()을 통해 동적 심볼 테이블(Dynamic Symbol Table)을 뒤져 이전에 RCLCPP_COMPONENTS_REGISTER_NODE 매크로가 생성해두었던 컴포넌트 팩토리(Factory) 래퍼(Wrapper) 함수의 메모리 포인터를 획득한다.
컨테이너는 이 획득한 함수 포인터를 안전하게 호출하여 해당 C++ 컴포넌트 클래스의 생성자를 발동시키고 힙(Heap) 메모리에 인스턴스화한다. 생성된 클래스는 rclcpp::Node 형태의 추상 인터페이스 스마트 포인터(std::shared_ptr)로 업캐스팅(Upcasting)되어 반환되며, 즉각적으로 컨테이너 내부의 다중 스레드 이그제큐터(Multi-threaded Executor) 시스템에 바인딩되어 데이터의 서브스크립션과 퍼블리싱 체인에 합류하게 된다.
0.1.3 연속적 비행(Continuous Flight) 유지를 위한 핫 스왑(Hot Swap) 지원
이러한 동적 주입 구조는 자율 무인 에이전트의 런타임 가용성(Runtime Availability)을 비약적으로 향상시키는 공학적 돌파구이다. 예를 들어, 자율 드론이 비행 임무를 수행 중인 도중 궤적 계획기(Trajectory Planner)의 알고리즘에 심각한 메모리 오류나 교착 상태(Deadlock)가 발생할 조짐이 보일 경우, 메인 비행 제어기 프로세스 전체를 재부팅할 필요가 없다.
시스템 엔지니어나 상위 오케스트레이션 노드는 unload_node 서비스 콜을 통해 문제가 된 컴포넌트 인스턴스만을 메모리에서 안전하게 파괴(Destruction)하고, 수정된 혹은 대안 버퍼(Fallback) 모듈에 해당하는 새로운 동적 라이브러리를 동일한 컨테이너 내부에 load_node로 주입(핫 스왑)할 수 있다. 이는 고가용성(High Availability)의 미션 크리티컬(Mission-Critical) 시스템이 추구하는 무정지(Zero-Downtime) 런타임의 진정한 실현이다.