일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 책너두
- 상속
- 책읽기
- 주니어개발자
- 헤드퍼스트
- 코딩
- 독서일지
- IntelliJ
- docker
- JavaScript
- 직장인
- DesignPattern
- 성수직장인
- 클린코드
- Linux
- 헤드퍼스트디자인패턴
- 독서
- 성수맛집
- JAVA개발자
- 직장인점심
- 객체지향프로그래밍
- 성수볼거리
- 성수
- 깨끗한코드
- 오브젝트
- Java
- 디자인패턴
- 객체지향
- 성수핫플
- 개발자
- Today
- Total
닭발개발
[헤드퍼스트 디자인패턴] 35일차. 464-474pg 본문
35일차
헤드퍼스트 디자인패턴 [6주차_금요일]
464-474pg
요약
**CHAPTER 11. 객체 접근 제어하기 (feat. 프록시 패턴)**
사람들이 좋은 경찰에 접근하는 일을 나쁜 경찰이 제어한다. 패턴에서 나쁜 경찰은 프록시(proxy)이다. 접근을 제어하고 관리한다.
[ 원격 프록시의 역할 ]
- 원격 객체의 로컬 대변자 역할
- 원격 객체 : 다른 자바 가상 머신의 힙에서 살고 있는 객체(다른 주소 공간에서 돌아가고 있는 객체)
- 로컬 대변자 : 로컬 대변자의 어떤 메소드를 호출하면, 다른 원격 객체에게 그 메소드 호출을 전달해주는 객체
- 클라이언트 객체는 프록시를 활용하는 객체다 : 클라이언트 객체는 원격 객체의 메소드 호출을 하는 것처럼 행동한다. 하지만 실제로는 로컬 힙에 들어있는 '프록시' 객체의 메소드를 호출하고 있다. 네트워크 통신과 관련된 저수준 작업은 이 프록시 객체에서 처리해준다.
- 웬만한 원격 호출기능은 자바에 내장되어 있다.
[ RMI(Remote Method Invocation) ]
- 자바의 원격 메소드 호출
<클라이언트 힙> | <서버 힙>
클라이언트 객체 -> 클라이언트 보조 객체 | 서비스 보조 객체 -> 서비스 객체
- 메소드 호출 과정
1. 클라이언트 객체 -> 클라이언트 보조 객체의 doBigThing() 호출
2. 클라이언트 보조 객체는 메소드 호출정보를 네트워크로 서비스 보조객체에게 전달
3. 서비스 보조 객체는 클라이언트 보조 객체로부터 받은 정보를 해석해서 어떤 객체의 어떤 메소드를 호출할지 알아낸 다음 진짜 서비스 객체의 메소드를 호출
4. 서비스 객체의 메소드 실행이 끝나면 서비스 보조 객체에 어떤 결과가 리턴 됨.
5. 서비스 보조 객체는 호출 결과로 리턴된 정보를 네트워크로 클라이언트 보조 객체에게 전달
6. 클라이언트 보조 객체는 리턴된 정보를 해석해서 클라이언트 객체에게 리턴
7. 클라이언트 객체는 메소드 호출이 어디로 전달되었는지, 어디에서 리턴되었는지 전혀 알 수 없음.
- RMI를 사용하면 네트워킹 및 입출력 관련 코드를 직접 작성하지 않아도 된다.
- 클라이언트가 원격 객체를 찾아서 접근할 때 쓸 수 있는 룩업(lookup) 서비스도 RMI에서 제공함.
- RMI와 로컬 메소드 호출의 차이점 : 클라이언트는 로컬 메소드 호출과 똑같은 식으로 메소드를 호출하지만, 실제로는 클라이언트 보조 객체가 네트워크로 호출을 전송해야 하므로 네트워킹 및 입출력 기능이 반드시 필요함
- RMI 용어
1. 스텁(stub) : RMI에서 클라이언트 보조 객체를 부르는 말
2. 스켈레톤(skeleton) :RMI에서 서비스 보조 객체를 부르는 말
[ 원격 서비스 만들기 ]
1. 원격 인터페이스 만들기 : 클라이언트가 원격으로 호출할 메소드 정의, 스텁과 실제 서비스에 이 인터페이스를 구현한다.
2. 서비스 구현 클래스 만들기 : 실제 작업을 처리하는 클래스. 나중에 클라이언트에서 이 객체에 있는 메소드를 호출한다.
3. RMI 레지스트리(rmiregistry) 실행하기 : rmiregistry는 전화번호부와 비슷하다고 보면 된다. 클라이언트는 이 레지스트리로부터 프록시를 받아간다.
4. 원격 서비스 실행하기 : 서비스 객체 실행. 서비스를 구현한 클래스에서 서비스의 인스턴스를 만들고 그 인스턴스를 RMI 레지스트리에 등록한다.
[ 1단계 : 원격 인터페이스 만들기 ]
1. java.rmi.Remote를 확장한다.
2. 모든 메소드를 RemoteException을 던지도록 선언한다 : 클라이언트가 원격 인터페이스를 구현하는 스텁의 메소드를 호출하는데 스텁이 각종 입출력 작업을 처리할 때 네트워크 등에 오류가 발생할 수 있기 때문이다. (모든 원격 메소드 호출은 위험이 따르는 것으로 간주해야 한다.)
3. 원격 메소드의 인자와 리턴값은 반드시 원시 형식(primitive) 또는 Serializable 형식으로 선언한다.
[ 2단계 : 서비스 구현 클래스 만들기 ]
1. 서비스 클래스에 원격 인터페이스를 구현한다.
2. UnicastRemoteObject를 확장한다. : 객체에 '원격 객체' 기능 추가
3. RemoteException을 선언하는 생성자를 구현한다.
4. 서비스를 RMI 레지스트리에 등록한다 : 원격 서비스를 원격 클라이언트에서 쓸 수 있게 만들어야 한다. 서비스를 등록할 때는 java.rmi.Naming 클래스에 있는 rebind() 정적 메소드를 사용한다.
[ 3단계 : rmiregistry 실행하기 ]
터미널을 새로 띄워서 rmiregistry를 실행한다. 클래스에 접근할 수 있는 디렉토리에서 실행해야 한다.
[ 4단계 : 원격 서비스 실행하기 ]
다른 터미널을 열고 서비스를 실행한다.
'책책책 책을 읽읍시다‼ ver.개발 > [ 헤드퍼스트 디자인패턴 ]' 카테고리의 다른 글
[헤드퍼스트 디자인패턴] 37일차. 488-502pg (2) | 2023.06.12 |
---|---|
[헤드퍼스트 디자인패턴] 36일차. 475-487pg (0) | 2023.06.12 |
[헤드퍼스트 디자인패턴] 34일차. 453-463pg (0) | 2023.06.08 |
[헤드퍼스트 디자인패턴] 33일차. 440-452pg (0) | 2023.06.07 |
[헤드퍼스트 디자인패턴] 32일차. 428-439pg (0) | 2023.06.06 |