HarmonyOS Next IPC Kit 기반의 프로세스 간 통신 아키텍처 및 구현

HarmonyOS의 IPC(Inter-Process Communication) Kit은 서로 다른 프로세스에서 실행되는 클라이언트와 서버 간의 효율적인 통신을 지원하는 프레임워크입니다. 시스템 능력을 안전하고 빠르게 전달하기 위해 Proxy와 Stub이라는 핵심 객체를 사용합니다.

클라이언트와 서버 간의 기본 통신 흐름

IPC Kit을 통한 통신은 다음과 같은 단계를 거칩니다.

  1. 서비스 능력 등록: 서버 프로세스는 자신이 제공하는 서비스(System Ability)를 시스템 능력 관리자(SAMgr)에 등록합니다.
  2. 프록시 획득: 클라이언트는 SAMgr로부터 특정 서비스 식별자를 통해 해당 서비스에 접근할 수 있는 Proxy 객체를 얻습니다.
  3. 요청 전송: 클라이언트는 Proxy 객체의 메서드를 호출하며, Proxy는 이 요청을 메시지 형태로 포장하여 서버로 전달합니다.
  4. 요청 처리: 서버 측의 Stub 객체가 메시지를 수신하여 해석한 뒤, 실제 서버의 비즈니스 로직을 실행합니다.
  5. 결과 반환: Stub은 처리된 결과를 다시 메시지에 담아 Proxy로 전송합니다.
  6. 응답 수신: Proxy는 전달받은 데이터를 클라이언트에 최종 결과로 반환합니다.

Proxy와 Stub의 역할 정의

  • Proxy (대리자): 클라이언트 측에 존재하는 객체로, 서버의 인터페이스를 추상화합니다. 클라이언트는 서버의 실제 구현 위치를 몰라도 Proxy를 통해 로컬 메서드를 호출하듯 통신할 수 있습니다.
  • Stub (스텁): 서버 측에서 요청을 받아들이는 게이트웨이 역할을 합니다. 원격에서 온 데이터를 수신하고 적절한 함수를 호출하는 디스패처 역할을 수행합니다.

원격 Proxy 및 Stub 생성 예시

IPC Kit의 C/C++ API를 사용하여 원격 통신을 위한 기반을 구축하는 방법은 다음과 같습니다.

// 서버 측: Stub 생성 및 시스템 능력 등록
OHIPCRemoteStub *myStub = OH_IPCRemoteStub_Create("ohos.sample.service", &ServiceHandler::OnRemoteRequest, nullptr, this);
OH_IPCRemoteStub_RegisterSystemAbility(myStub, SERVICE_ID_EXAMPLE);

// 클라이언트 측: Proxy 생성
OHIPCRemoteProxy *myProxy = OH_IPCRemoteProxy_Create(SERVICE_ID_EXAMPLE, "ohos.sample.service");

동기 및 비동기 통신 모드

IPC Kit은 요청의 성격에 따라 동기(Sync)와 비동기(Async) 모드를 선택할 수 있습니다. 비동기 모드를 사용하면 서버의 처리가 끝날 때까지 클라이언트가 대기하지 않고 즉시 다음 로직을 수행할 수 있습니다.

// 비동기 요청 옵션 설정
OH_IPC_MessageOption asyncOption = { OH_IPC_REQUEST_MODE_ASYNC, 0 };

// Proxy를 통한 비동기 데이터 송신
OH_IPCRemoteProxy_SendRequest(targetProxy, CMD_PROCESS_DATA, dataParcel, responseParcel, &asyncOption);

통신 구현 상세 예제: 덧셈 서비스

다음은 클라이언트가 두 정수를 보내면 서버가 이를 더해 결과를 반환하는 간단한 IPC 통신 구현 예제입니다.

// [서버 측 구현]
class CalculatorStub : public OHIPCRemoteStub {
public:
    CalculatorStub() : OHIPCRemoteStub("com.dev.calc.service", &CalculatorStub::Dispatch) {}

    static int Dispatch(uint32_t code, const OHIPCParcel *data, OHIPCParcel *reply, void *userData) {
        CalculatorStub *service = static_cast<CalculatorStub *>(userData);
        if (code == CMD_ADD_NUMBERS) {
            int32_t val1 = 0, val2 = 0;
            OH_IPCParcel_ReadInt32(data, &val1);
            OH_IPCParcel_ReadInt32(data, &val2);
            
            int32_t sum = val1 + val2;
            OH_IPCParcel_WriteInt32(reply, sum);
            return OH_IPC_SUCCESS;
        }
        return OH_IPC_CHECK_PARAM_ERROR;
    }
private:
    static const uint32_t CMD_ADD_NUMBERS = 101;
};

// [클라이언트 측 구현]
void ExecuteAddOperation(OHIPCRemoteProxy *proxy, int a, int b) {
    OH_IPC_MessageOption option = { OH_IPC_REQUEST_MODE_SYNC, 0 };
    OH_IPCParcel *requestData = OH_IPCParcel_Create();
    OH_IPCParcel *replyData = OH_IPCParcel_Create();

    OH_IPCParcel_WriteInt32(requestData, a);
    OH_IPCParcel_WriteInt32(requestData, b);

    // 원격 호출 수행
    int result = OH_IPCRemoteProxy_SendRequest(proxy, 101, requestData, replyData, &option);

    if (result == OH_IPC_SUCCESS) {
        int32_t finalSum = 0;
        OH_IPCParcel_ReadInt32(replyData, &finalSum);
        // 결과 사용 (예: 로그 출력)
    }

    OH_IPCParcel_Destroy(requestData);
    OH_IPCParcel_Destroy(replyData);
}

위 구현을 통해 클라이언트는 서버의 CalculatorStub 로직을 원격에서 호출할 수 있게 됩니다. OHIPCParcel 객체는 데이터를 직렬화하여 프로세스 경계를 넘나들 수 있도록 돕는 역할을 합니다.

태그: HarmonyOS IPCKit C++ NativeDevelopment InterProcessCommunication

7월 21일 20:19에 게시됨