RMI - JMeter 공부하다가 정리

Uno·2022년 12월 7일
0

JMeter

목록 보기
1/3

RMI 란?

  • 분산되어 있는 객체간 메시지 전송을 도와주는 프로토콜 입니다.
  • 클라이언트에서 서버로 접속이 불가능한 환경일 때, 중간에 인터페이스를 두고 통신하는 방식입니다.

다만 RMI 를 이해하기 위해서 "분산 컴퓨팅" 과 "분산 객체" 에 대한 이해가 필요합니다.

분산 컴퓨팅이란?

  • Distributed Computing
  • 인터넷에 연결된 여러 개의 컴퓨터들의 처리능력을 활용합니다.
  • 처리 능력을 통해서 하나의 컴퓨터로 해결할 수 없는 큰 계산 문제렬 해결하는 모델을 분산 컴퓨팅이라고 합니다.
  • 간단하게, 네트워크에 존재하는 시스템을 뭉쳐서, 하나의 응용프로그램을 분산해서 처리하는 환경을 뜻합니다.

분산 객체

  • 분산 컴퓨팅 기술이 객체지향에 접목된 용어입니다.
  • 하나의 프로세서나 컴퓨터에서 실행되는 객체가 있고, 다른 컴퓨터에서 그 객체와 통신하도록 하는 기술이 분산 객체 기술 입니다.
  • RMI 의 경우 Java 와 Java 로 객체가 연결됩니다. Ex) COM / CORBA 를 모두 포함하는 단어가 RMI 입니다.
  • 정리하면, 하나의 런타임의 환경에 있고 또 다른 런타임 환경이 있습니다. 그 양쪽 환경에 통신이 가능한 객체가 분산 객체 입니다.

다시 RMI

  • 클라이언트와 서버가 RPC (Remote Procedure Call) 을 지원하며, 직렬화를 이용하여 네트워크간 객체를 전송하는 기술 입니다.
  • 다시 위에 정의를 보겠습니다.

    분산되어 있는 객체간 메시지 전송을 도와주는 프로토콜 입니다.

"분산되어 있는 객체 간에 RPC(=메시지 전송) 을 도와주는 프로토콜" 이 부분이 조금 더 이해가 잘 되실겁니다.

  • RMI 는 두 개의 객체 스텁 및 스켈레톤을 사용하여 어플리케이션 간의 원격 통신을 제공합니다.

cf) RPC 란?

  • Remote Procedure call
  • UNIX 에서 가장 많이 사용되는 통신 프로토콜 입니다.
  • RPC 를 쓰는 이유는, MSA 와 같이 다양한 언어와 프레임워크로 구성된 서비스를 통신해야할 때, RPC 는 이런 고민을 덜어주기 때문 입니다.
  • 별도의 원격 제어를 위한 코딩 없이 다른 주소의 공간이나 함수나 프로시저를 실행할 수 있게 해주는 통신 기술 입니다.
  • 객체지향이 아닌, 절차지향 언어로 개발된 어플리케이션의 함수만 호출 합니다.
  • 개발자는 RPC 를 이용해서 함수가 실행 프로그램에 로컬위치에 있든지, 원격 위치에 있든지 동일한 코드로 호출 할 수 있게 됩니다.

매커니즘은 다음과 같습니다.

(출처 : geeks for geeks)

(출처: Java-RMI 서버 작성(원격 서비스 제공))

스텁(Stubs)

  • 스텁은 객체 입니다.
  • 미들웨어에 해당합니다.
  • 클라이언트 측의 게이트웨이 역할을 합니다.
  • 서버에 존재하는 메소드를 불러주고, 메소드의 인자를 일정한 포멧으로 바꿔주는 역할을 합니다.
  • "인자를 일정한 포맷을 바꿔주는 일" 을 "Parameter Marshalling" 이라고 합니다.
  • 클라이언트 측에서 요청하므로, 모든 요청은 Stub 을 통해서 라우팅 됩니다.
  • 클라이언트 측에 위치하고 있으며, 실제 원격 객체가 아닌 원격 객체의 껍데기 입니다.
    - 이유는 클라이언트 입장에서는 프로그램에 마치 로컬에 있는 것처럼 보이게 해줍니다.

스텁의 동작 과정

  1. 원격 가상 머신(JVM) 과의 연결 상태를 만듧니다.
  2. JVM에게 전송될 메소드 호출의 매개변수를 특정한 형식으로 맞춰서 정렬시키고(마샬링, 직렬화) 전송합니다.
  3. await
  4. 값(혹은 예외) 를 읽어서 해석합니다.(언마샬링, 역직렬화)
  5. 클라이언트에게 값을 반환합니다.

cf) 마샬링 언마샬링
마샬링은 데이터를 바이트로 쪼개서 TCP/IP 와 같은 통신 채널로 전송되도록 바꿔주는 과정입니다. 언마샬링은 데이터를 받은 후, 반대로 원래 형태로 복완하는 것을 의미합니다.
Marshaling - ObjectOutputStream 클래스를 이용
UnMarshaling - ObjectInputStream 클래스를 이용

스켈레톤

  • Skeleton 은 객체입니다. 서버 측의 게이트웨이 역할을 합니다.
  • 서버는 요청을 모든 요청을 받습니다. 그러므로 모든 요청은 Skeleton 을 통해서 라우팅 됩니다.
  • 스켈레톤 역시 껍데기입니다. (로컬에 있는 것처럼 사용되지만)

동작 순서

  1. 클라이언트의 Stub으로 부터 받은 받은 원격 메소드의 매개변수 값을 읽고, 해석합니다. (언마샬링, 역직렬화)
  2. 실제 원격 객체에서 매개변수를 넘겨주고 함수를 실행합니다.
  3. 실행된 메소드의 결과를 특정한 형식에 맞춰서 정렬시키고, 호출자에게 전송(마샬링, 직렬화) 합니다.

Stub / Skeleton 에 대해서 잘 정리된 글이 있어서 공유합니다.

※ Stub, Skeleton은 매개변수의 직렬화, 역 직렬화 같은 처리와 네트워크 레벨에서의 통신을 감춰줌으로써, 우리가 작성할 어플리케이션과 RMI의 내부 구조 사이의 인터페이스 역할을 합니다. 이런 특성으로 인해, 프로그래머는 마치 로컬에 존재하는 객체의 메서드를 호출하는 것처럼 일반적인 자바 플랫폼상의 프로그래밍 스타일을 그대로 사용할 수 있습니다. 이렇게 객체 지향적으로 만들어지는 분산 시스템을 분산 객체 모델(Distributed Object Model)이라고 합니다.
출처: 자북(JABOOK) Java 강의 (http://www.jabook.co.kr/) 편집: chetgood

참고자료

profile
iOS & Flutter

0개의 댓글