[디자인패턴] Proxy

한지연·2023년 2월 11일
0

Proxy Pattern

  • 실체 객체에 대한 대리자를 둠
  • 원격프록시 : 서로 다른 주소 공간에 존재하는 원격 객체를 대리하는 로컬 객체
  • 가상 프록시: 실제 객체가 모두 생성되기 전 대신 해주는 프록시
  • 보호프록시: 실제 객체에 대한 접근 권한을 제어하기 위한 경우 사용
  • 실제 객체와 프록시는 동일한 메서드 제공
  • 클라이언트가 호출하는 메서드는 프록시의 메서드
  • 처리는 프록시가 할 수도 있고 실제 객체가 할 수도 있음
    => 제어의 흐름을 조정
    => DIP와 OCP 적용된 설계 패턴

code : 가상프록시 예시

  • Serviceinterface
public interface Printable {
    void setPrinterName(String name);
    String getPrinterName();
    void print(String str);
}
  • Proxy
public class PrinterProxy implements Printable{

    private String name;
    private Printer real;

    @Override
    public synchronized void setPrinterName(String name) {
        if(real != null) {
            real.setPrinterName(name);
        }
        this.name = name;
        System.out.println("PrinterProxy: setPrinterName()" );
    }
	//.....@Override 해야 하는 메서드들 작성할 것 
}
  • Service
public class Printer implements Printable{

    private String name;

    public Printer(String name){
        this.name = name;
        heavyJob("Printer 생성중....");
    }
//..... @Override해야 하는 메서드들 작성할 것

    public void heavyJob(String msg) {
        System.out.println(msg);
        for(int i=0; i<5; i++){
            try{
            Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        System.out.println(".");
        }
        System.out.println("생성 완료");
    }
}

장단점

장점
1. 클라이언트들이 알지 못하는 상태에서 서비스 객체 제어 가능
2. 클라이언트들이 신경쓰지 않을 때 서비스 객체의 수명 주기 관리 가능
3. 서비스 객체가 준비되지 않았거나 사용할 수 없는 경우에도 작동
4. 개방폐쇄의원칙: 서비스나 클라이언트를 변경하지 않고도 새 프록시 도입할 수 있음
단점
1. 코드가 복잡해질 수 있음

  1. 서비스의 응답이 늦어질 수 있음

정리

synchronized

  • 멀티스레드 환경에서 한 스레드가 해당 영역을 사용중이면 lock을 걸어 다른 스레드가 접근할 수 없도록 함. => 동시 접근 방지
  • 메서드 단위에 적용할 수도 있고 코드 블럭 단위에 적용할 수도 있음

Thread

  • 프로세스 내에서 작업을 수행하는 단위

출처

이 글은 인프런 박은종 강사님의 강의 내용을 정리하기 위하여 작성하였습니다.

profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글