IT/RPC

RPC 사용법 완벽 가이드: IDL로 인터페이스 정의하는 방법

파파대니 2024. 12. 11. 11:31

목차

    728x90
    반응형

    RPC 사용법 완벽 가이드: IDL로 인터페이스 정의하는 방법

    안녕하세요. 파파대니입니다.

    RPC (Remote Procedure Call)는 네트워크를 통해 다른 컴퓨터에서 실행 중인 프로시저나 함수(메서드)를 호출하는 방식입니다. RPC를 사용하여 분산 시스템에서 클라이언트와 서버 간에 데이터를 주고받을 수 있습니다.

    RPC의 동작 방식에는 IDL(Interface Definition Language)을 사용하는 방식과 사용하지 않는 방식이 있으며, 각각의 방식은 다음과 같은 차이점이 있습니다.

     

    1. IDL을 사용하는 RPC 동작 방식

    IDL은 서로 다른 시스템이나 프로그래밍 언어 간에 통신할 때 인터페이스를 표준화하기 위한 언어입니다. IDL을 사용하면 클라이언트와 서버가 서로 다른 언어로 작성되었을 때에도 공통된 인터페이스를 정의할 수 있습니다. 이를 통해 언어 간 호환성과 네트워크 통신을 위한 데이터 직렬화를 처리할 수 있습니다.

     

    동작 방식

    1. IDL 정의: IDL 파일을 작성하여 클라이언트와 서버에서 사용할 함수 시그니처(입력, 출력 파라미터 타입 등)를 정의합니다. IDL은 함수의 이름, 인자, 반환값의 타입을 명시합니다.
    2. 컴파일러 사용: IDL 파일을 컴파일하여 클라이언트와 서버에서 사용할 코드와 데이터 직렬화 관련 코드를 생성합니다. 이 과정에서 사용되는 도구는 언어마다 다르지만, 예를 들어 protobufApache Thrift, CORBA 등 다양한 RPC 시스템이 IDL을 지원합니다.
    3. 서버 구현: 서버는 IDL에서 정의한 인터페이스를 구현합니다. 서버는 클라이언트로부터 오는 요청을 처리할 수 있는 함수들을 실제로 구현해야 합니다.
    4. 클라이언트 구현: 클라이언트는 IDL에서 정의한 인터페이스를 호출합니다. 클라이언트는 서버가 제공하는 함수에 대한 호출을 네트워크를 통해 전송합니다.
    5. 직렬화 및 역직렬화: RPC 프레임워크는 데이터 전송을 위해 데이터를 직렬화하고, 클라이언트와 서버 간에 메시지를 전송합니다. 클라이언트는 서버로부터 받은 응답역직렬화하여 사용할 수 있는 형태로 변환합니다.

    예시: Apache Thrift (IDL 사용)

    IDL을 사용하는 경우, Apache Thrift의 예를 들면 다음과 같습니다:

    1) IDL 정의 (Thrift 파일)
    service Calculator {
        i32 add(1:i32 num1, 2:i32 num2);
    }
     

     

    2) 서버 구현 (Python)
    from thrift.server import TServer
    from thrift.transport import TTransport, TSocket
    from thrift.protocol import TBinaryProtocol
    from calculator import Calculator
    
    class CalculatorHandler:
        def add(self, num1, num2):
            return num1 + num2
    
    handler = CalculatorHandler()
    processor = Calculator.Processor(handler)
    transport = TSocket.TServerSocket(port=9090)
    tfactory = TTransport.TBufferedTransportFactory()
    pfactory = TBinaryProtocol.TBinaryProtocolFactory()
    server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
    server.serve()
     

     

    3) 클라이언트 구현 (Python)
    from thrift.transport import TTransport, TSocket
    from thrift.protocol import TBinaryProtocol
    from calculator import Calculator
    
    transport = TSocket.TSocket('localhost', 9090)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = Calculator.Client(protocol)
    
    transport.open()
    print(client.add(3, 4))  # 서버에 요청
    transport.close()
     

    2. IDL을 사용하지 않는 RPC 동작 방식

    IDL을 사용하지 않는 RPC는 클라이언트와 서버 간의 통신에서 인터페이스를 명시적으로 정의하지 않고, 대신 함수 호출과 데이터를 동적으로 처리합니다. 이 방식은 인터페이스 정의가 필요 없지만, 시스템 간의 호환성을 보장하기 위해서는 프로토콜데이터 직렬화 방식을 협의해야 합니다.

     

    동작 방식

    1. 함수 호출: 클라이언트는 서버에 직접 함수 호출을 보냅니다. 이때 함수의 시그니처를 정해놓지 않고, 클라이언트와 서버가 공유하는 약속에 의해 함수가 처리됩니다.
    2. 데이터 직렬화: 데이터를 전송할 때 직렬화 방식(예: JSON, XML, Protocol Buffers 등)을 미리 결정해야 합니다. 클라이언트와 서버는 이 직렬화 방식을 사용하여 데이터를 전송하고 처리합니다.
    3. 동적 함수 호출: 서버는 함수 이름과 인자를 동적으로 처리할 수 있어야 하며, 함수 호출이 명시적으로 정의된 인터페이스 없이 이루어집니다.
    4. 결과 전송: 서버는 클라이언트가 요청한 함수를 실행한 후, 결과를 직렬화하여 클라이언트에 전송합니다.

    예시: Python xmlrpc (IDL 사용하지 않음)

    1) 서버 구현 (Python)
    import xmlrpc.server
    
    def add_numbers(a, b):
        return a + b
    
    with xmlrpc.server.SimpleXMLRPCServer(('localhost', 8000)) as server:
        server.register_function(add_numbers, 'add_numbers')
        print('서버가 실행 중입니다...')
        server.serve_forever()
     

     

    2) 클라이언트 구현 (Python)
    import xmlrpc.client
    
    server = xmlrpc.client.ServerProxy('http://localhost:8000')
    result = server.add_numbers(3, 4)
    print(result)  # 서버에서 받은 결과
     

    3. IDL 사용 vs. 사용하지 않음

    1) 장점과 단점

    • IDL 사용:
      • 장점: 언어 간 호환성 보장, 정적 타입 시스템을 통한 안정성, 인터페이스의 명시적 정의로 가독성 및 유지 보수 용이.
      • 단점: IDL 파일 작성과 컴파일 과정이 필요하며, 이는 복잡도를 추가할 수 있습니다.
    • IDL 미사용:
      • 장점: 간단한 구현, 인터페이스 정의가 불필요하여 개발이 빠름.
      • 단점: 인터페이스의 일관성 유지가 어려울 수 있으며, 언어나 플랫폼 간 호환성 문제 발생 가능.

    2) 언어 및 플랫폼 호환성

    • IDL 사용: 언어플랫폼 간에 RPC 인터페이스를 표준화하여, 서로 다른 언어로 작성된 클라이언트와 서버 간의 통신을 쉽게 설정할 수 있습니다. (예: C++, Java, Python 간의 RPC 통신)
    • IDL 미사용: 클라이언트와 서버가 동일한 언어플랫폼에서 실행될 때는 효율적이지만, 다른 언어나 시스템 간의 호환성 문제를 해결하기 위해서는 수동으로 데이터 직렬화/역직렬화를 처리해야 합니다.

     

    IDL를 필수적으로 사용할 필요는 없지만, 경우에 따라 필요할 수 있기 때문에 정리하면, 아래와 같습니다.

    • IDL 사용: 언어플랫폼 간의 통신이 중요한 경우, 표준화된 인터페이스 정의로 인해 관리와 유지가 용이합니다.
    • IDL 미사용: 간단하고 빠르게 RPC 시스템을 구축할 수 있으며, 동일 언어 내에서는 적합합니다.

     

    ⬇️ 참고하면 좋은 글 ⬇️

     

    RPC(원격 프로시저 호출)란? 원리, 장점, 단점과 사용 예시

     

    RPC(원격 프로시저 호출)란? 원리, 장점, 단점과 사용 예시

    RPC(원격 프로시저 호출)란? 원리, 장점, 단점과 사용 예시 안녕하세요. 파파대니입니다.RPC(Remote Procedure Call)는 네트워크를 통해 다른 컴퓨터에서 실행되는 프로그램의 함수를 호출할 수 있게 해

    papa-danny.tistory.com

     

    소켓 통신 vs RPC: 차이점과 장단점 비교

     

    소켓 통신 vs RPC: 차이점과 장단점 비교

    소켓 통신 vs RPC: 차이점과 장단점 비교 안녕하세요. 파파대니입니다.소켓 통신과 RPC(Remote Procedure Call)는 모두 네트워크를 통해 두 시스템 간의 데이터를 주고받을 수 있게 해주는 기술입니다. 하

    papa-danny.tistory.com

     

    728x90
    반응형