DAO와 Proxy 패턴 (GoF)
Client | Server |
사용자(Actor)가 ClientApp을 통해 BoardxxxListener에 call return 받음. BoardxxxListener은 BoardNetworkDao에 call하고 return 받음 BoardNetworkDao는 ServerApp에 요청하고 응답 받음 [프록시] : 프록시와 실제일을 하는 객체는 같은 인터페이스에 따라 설계되어야한다. BoardNetworkDao: 클라이언트 측에서 BoardListDao의 역할을 대행한다. 진짜 일을 하는 것은 아니고 작업을 서버에 전달하고 서버에서 보낸 작업 결과를 호출자에게 리턴하는 역할 |
ServerApp 이 BoardListDao를 call하고 return 받음 BoardListDao는 List를 구현하고 JSON 파일을 read & write함 BoardListDao : 실제 작업을 수행하는 객체 |
[용어] BoardListDao 랑 BoardNetworkDao는 <<interface>>BoardDao를 구현함 BoardListDao : RemoteObject : 실제일을 하는 객체 BoardNetworkDao:클라이언트 쪽 ORB(Object Request Broker) :프록시 객체 // ==> Stub ServerApp: 서버쪽 ORB(Object Request Broker)==> Skeleton BoardNetworkDao와 ServerApp 는 서로 통신함 |
프록시 ~ : 원본을 직접 사용할 수 없는 상황에서 원본을 직접 사용하는 것처럼 짜는 방법
분산컴퓨팅 distributed computing
1. 중앙 집중식 컴퓨팅 - 메인프레임 서버
문제점: 서버에 문제 발생하면 모든 업무 시스템이 정지 , 사용자 증가시 서버 증설(RAM,HDD,CPU추가)해야함.
down sizing : 메인프레임 - > 워크스테이션 : 크기, 가격, 용량 낮아짐.
2. 분산 컴퓨팅
시스템 별 (워크스테이션 Unix)서버 분산
Unix 컴터들: Solaris, HP-ux, IBM, AIX, ...
문제점: 다른 시스템에 있는 코드를 실행할 수 없다 . => 네트워크를 이용하여 메서드 호출 => 개발자/개발사 별로 구현 => 표준화x => 유지보수 어렵다
3. 해결책 - 표준화 기술
C (RPC Remote Procedure Call) |
C++, pascal (객체 지향 프로그램) - RMI ( Remote Method Invocation) |
다른 기종 호환을 위해 - CORBA (Common ORB Architecture) IIOP(인터넷 기반의,,) |
1. Java의 표준화기술: EJB(Enterprise) / 2. Web : 웹서비스 |
2. web 서비스에서 전용 API를 빼버림 ,,!! 이제까진 전용API 필요했음 HTTP 기반으로 다른 시스템 접속하는거 : Rest API(RESTful) => 기술을 사용하여 AJAX, XML/JSON 기술 구현 -어떤 자원에 대해 이름을 부여하고 HTTP로 응답받는 .. - Rest API = 분산컴퓨팅 |
DAO 프록시 객체를 자동 생성하기
-reflect
newProxyInstance() | java.lang.reflect Proxy |
classLoader : 클래스 로딩 담당 |
1. client가 프록시객체(인터페이스 목록들 상속) call return 2.프록시 객체가 A를 invoke() |
인터페이스 목록들 : 프록시 객체가 구현해야할 인터페이스 목록 | |
3.A가 프록시객체에 return, 4.프록시 객체가 client에 return |
<<interface>> InvocationalHandler : 프록시 객체의 사용법 |
|
A: 실제 일을 호출되는 객체 : 프록시 객체의 메서드를 호출하면 이 객체에게 전달된다. |
1. newProxyInstance() |
2. Proxy가 new 프록시객체 (MyInteface를 상속받은) |
3. call 하면 m1{}이 invoke()하고, m2{}가 invoke()함 : invoke() 한다는 것은 MyInvocationHandler 호출(직접 일을 하는 객체) => 메서드 호출하면 InvokationHandler에게 실행을 위임 |
import java.lang.reflect.Proxy;
// Proxy 객체를 만드는 방법
public class Exam0110 {
public static void main(String[] args) {
MyInterface obj = (MyInterface) Proxy.newProxyInstance(
Exam0110.class.getClassLoader(), // 클래스를 메모리에 로딩하는 일을 할 객체
new Class[] {MyInterface.class}, // 자동 생성할 클래스가 구현해야 하는 인터페이스 목록
new MyInvocationHandler());
// 자동 생성된 인터페이스 구현체의 메서드 호출하기
obj.m1();
obj.m2();
}
}
package com.eomcs.reflect.ex06.a;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("호출됨!");
return null;
}
}
프록시 생 자동 생성 = pariticipant;
클라이언트 bitcamp에 dao 패키지, DaoInvocationHandler (InvocationHandler 구현한) 클래스 만들기
마이앱 생겨먹은거:
프록시를 사용하면 프록시 패턴의 프록시 객체를 자동생성할수있당 ,,,,
앞으로 여러가지 Dao를 생성되더라도 클라이언트 구현체를 따로 건들 필요는 없다 . (보드네트워크dao, 멤버네트워크dao 만들 필요가 없음 !! ) 90
클라이언트앱에 daobuilder 추가
daobuilder 안에 invocation 넣고 클래스 삭제
[로컬클래스,,,,]
로컬클래스의 static을 떼어내면,,
바깥 퍼블릭 클래스 안의 로컬 클래스의 파라미터는 컴파일러가 퍼블릭 메서드의 파라미터를 따라 자동생성함,;
컴파일러가 바깥 클래스의 주소를 받는 로컬의 생성자를 자동으로 만듬.
바깥 클래스의 변수를 받는 코드를 자동으로 추가함.
'[네이버클라우드] 클라우드 기반의 개발자 과정 7기 > 웹프로그래밍' 카테고리의 다른 글
[NC7기-54일차(7월11일)] - 웹프로그래밍 35일차 (0) | 2023.07.11 |
---|---|
[NC7기-53일차(7월10일)] - 웹프로그래밍 34일차 (0) | 2023.07.10 |
[NC7기-51일차(7월6일)] - 웹프로그래밍 32일차 (0) | 2023.07.06 |
[NC7기-50일차(7월5일)] - 웹프로그래밍 31일차 (0) | 2023.07.05 |
[NC7기-49일차(7월4일)] - 웹프로그래밍 30일차 (0) | 2023.07.04 |