。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-52일차(7월7일)] - 웹프로그래밍 33일차

quarrrter 2023. 7. 7. 15:28

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을 떼어내면,,

바깥 퍼블릭 클래스 안의 로컬 클래스의 파라미터는 컴파일러가 퍼블릭 메서드의 파라미터를 따라 자동생성함,;

컴파일러가 바깥 클래스의 주소를 받는 로컬의 생성자를 자동으로 만듬. 

바깥 클래스의 변수를 받는 코드를 자동으로 추가함. 

컴파일러가 바깥 클래스의 필드를 받는 생성자를 자동으로 생성함