키워드는 아까워서 남겨둠.
분산 객체는 일반적인 자바 객체와는 다르게 다른 JVM에서 리모트로 접근할 수 있는 객체를 말합니다. 일반적으로 객체는 하나의 JVM 내에서 생성되어 사용되는데, 이런 객체를 로컬 객체라 합니다. | ||||
다른 시스템에서 분산 객체를 리모트로 할 때 | ||||
로우 레벨의 네트워크 관련 코드로써 분산 객체를 사용하는 것이 아니라, 단순하게 로컬 객체를 사용하듯이 메소드를 호출하는 형태임 | ||||
분산 객체를 사용하는 쪽에서는 분산 객체에 대한 리모트 레퍼런스(Remote Reference)를 얻어, 이 리모트 레퍼런스를 이용해 마치 로컬에 있는 객체처럼 분산 객체의 메소드를 호출함 | ||||
분산 객체 기술 | ||||
RPC (Remote Procedure Call)에서 유래됨 | ||||
RPC와 마찬가지로 스텁·스켈레톤간의 통신으로 처리함 | ||||
스텁을 분산 객체에 대한 클라이언트 사이드 프락시라 하고, 스켈레톤은 서버측 프락시라 하는데, 이것은 대개 벤더 툴로 생성함 | ||||
벤더 툴에 의해 네트워크 관련 로우 레벨 코드가 생성되고, 약속에 의해 개발되기 때문에 프로그래밍 하기 쉬움 | ||||
자바 분산 객체 기술로는 RMI(Remote Method Invocation), JavaIDL, 엔터프라이즈 자바 빈이 있는데, 엔터프라이즈 자바 빈은 RMI 분산 객체 기술을 기반으로 함 |
RMI는 자바 분산 객체 기술로써, 분산 객체를 정의하고 실행하기 위한 환경을 제공하는데 J2SE(Java2 Standard Edition)에 기본 아키텍쳐가 구현되어 있습니다. 그래서 JDK외의 별도 툴이나 제품을 필요로 하지 않습니다. |
RMI는 자바 분산 객체 기술로써, 분산 객체를 정의하고 실행하기 위한 환경을 제공하는데 J2SE(Java2 Standard Edition)에 기본 아키텍쳐가 구현되어 있습니다. 그래서 JDK외의 별도 툴이나 제품을 필요로 하지 않습니다. | ||||||||||||||||
RMI | ||||||||||||||||
리모트 JVM에서 레퍼런스를 얻어 메소드 호출을 할 수 있는데, 이때 내부적으로는 RPC와 같이 스텁·스켈레톤 간의 통신으로 처리함 (스텁·스켈레톤에 네트워크 로우 레벨 코드가 구현) | ||||||||||||||||
장점: | 네트워크 및 서버 프로그래밍 방법을 몰라도 약속에 의해 쉽게 분산 객체를 개발할 수 있음 | |||||||||||||||
분산 객체의 메소드 호출 시 파라미터와 리턴 값의 전달은 “pass by value”, “pass by reference” 두 가지 방식을 지원함 (내부적으로 객체 직렬화를 이용하는데, 로컬 객체가 전달될 때에는 “pass by value”로 전달되고, 분산 객체가 전달될 때는 “pass by reference” 방식으로 전달됨) | ||||||||||||||||
RMI의 구성 | ||||||||||||||||
|
RMI는 일반적인 호출 기법 이외에도 여러 가지 프로그래밍 패턴에 따라 다음과 같은 기술이 소개되고 있습니다. | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
RMI 아키텍쳐는 어플리케이션 계층, 스텁·스켈레톤 계층, 리모트 레퍼런스 계층, 트랜스포트 계층으로 구성됩니다. | ||||||||||||||||||||||||||
|
RMI에서 분산 객체 메소드 파라미터, 반환 값을 전달하는 방식은 다음 두 가지 방식을 지원합니다. | ||||||
로컬 객체와 분산 객체가 전달될 때 | ||||||
| ||||||
|
RMI는 약속에 의해 쉽게 프로그래밍할 수 있다는 장점이 있습니다. RMI 프로그래밍 방법은 다음과 같이 정리해 볼 수 있습니다. | |||||||||||
RMI 프로그래밍 방법에 대한 각 단계별 내용을 살펴보겠습니다. | |||||||||||
서번트는 분산 객체를 말하는데, 앞에서 정의한 분산 객체의 명세서인 리모트 인터페이스를 구현해야 합니다. | ||||
서번트 클래스의 개발 방법 | ||||
서번트 클래스는 앞 단계에서 정의한 리모트 인터페이스를 구현하는 클래스로 리모트 인터페이스에 정의한 리모트 메소드의 몸체를 구현함 | ||||
서번트 클래스 이름을 정의할 때 위에서 정의한 리모트 인터페이스 이름에 “Impl”을 붙임 (일종의 네이밍 규칙) | ||||
서번트 클래스 소스 | ||||
서버 어플리케이션은 클라이언트를 위해 분산 객체를 생성하고, 생성한 분산 객체를 네이밍 서비스에 등록하는 어플리케이션입니다. | |||||
서버 어플리케이션에 구현해야 할 내용 | |||||
분산 객체의 생성은 일반 객체를 생성하는 것과 동일함 (new라는 키워드와 생성자 함수를 통해 객체를 생성) | |||||
분산 객체를 네이밍 서비스에 등록할 때 Naming.rebind() 메소드를 이용함 | |||||
네이밍 서비스의 key, value를 쌍으로 하여 분산 객체를 관리함 | |||||
등록할 때 key, value를 쌍으로 등록하고, 분산 객체를 네이밍 서비스로부터 얻어낼 때는 key 값을 이용함 | |||||
key는 다음과 같은 URL 형태를 취함 | |||||
rmi://ip:port/name | |||||
서버 어플리케이션 소스 | |||||
네이밍 서비스가 서버와 같은 위치에 있고 디폴트 포트를 사용하기 때문에 Naming.rebind()에 첫 파라미터는 분산 객체의 이름만 명시함 | |||||
클라이언트는 분산 객체에 대한 실제 구현을 알 필요가 없습니다. 분산 객체가 어떤 메소드를 서비스 하는지만 알면 됩니다. 즉, 서번트 클래스는 클라이언트에게는 필요하지 않고, 리모트 인터페이스만으로 클라이언트 어플리케이션이 개발됩니다. | |||
클라이언트 어플리케이션의 개발 절차 | |||
클라이언트 어플리케이션 소스 | |||
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.