본문 바로가기

PATTERN

[PATTERN] Proxy Pattern

 프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미입니다. 일종의 비서라고 생각하시면 됩니다. 사장님한테 사소한 질문을 하기보다는 비서한테 먼저 물어보는 개념이라고 생각할 수 있겠습니다.

> https://blog.outsider.ne.kr/789에서 프록시 패턴의 정의를 작성한건데 다른 어느곳보다 제일 이해가 쉬웠다.

 

프록시 패턴의 쓰임

 

가상프록시

 

꼭 필요로 하는 시점까지 객체의 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을때 사용하는 패턴입니다. 프록시 클래스에서 자잘한 작업들을 처리하고 리소스가 많이 요구되는 작업들이 필요할 때에만 주체 클래스를 사용하도록 구현하며 위에서 예로 들었다시피 해상도가 아주 높은 이미지를 처리해야 하는 경우 작업을 분산하는것을 예로 들 수 있겠습니다.

 

원격프록시

 

원격 객체에 대한 접근을 제어 로컬 환경에 존재하며, 원격객체에 대한 대변자 역할을 하는 객체 서로다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하게 만드는 패턴입니다. 

 

보호프록시

 

주체 클래스에 대한 접근을 제어하기 위한 경우에 객체에 대한 접근 권한을 제어

 

프록시 패턴 장점

  1.  사이즈가 큰 객체(ex : 이미지)가 로딩되기 전에도 프록시를 통해 참조를 할 수 있다.
  2.  실제 객체의 public, protected 메소드들을 숨기고 인터페이스를 통해 노출시킬 수 있다. 
  3. 로컬에 있지 않고 떨어져 있는 객체를 사용할 수 있다. 
  4.  원래 객체의 접근에 대해서 사전처리를 할 수 있다.

 

프록시 패턴 단점

  1.  객체를 생성할때 한단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우 성능이 저하될 수 있다.
  2.  프록시 내부에서 객체 생성을 위해 스레드가 생성, 동기화가 구현되야 하는 경우 성능이 저하될 수 있다.
  3.  로직이 난해해져 가독성이 떨어질 수 있다.

 

 

 실무에서 예를들자면 수 많은 코드데이터를 로드할때 필요한 데이터만 미리 로드하고 나머지는 그 이후 천천히 로딩할 수도 있다.

 

Proxy :  캐시에 저장된 코드가 없다면 RealSubject를 이용해 로드 후 캐시에 저장, 이미 캐시에 있다면 저장값 된 리턴

             즉, 코드로딩을 대신 처리하는 대리인

RealSubject :  DB에서 코드조회

Subject : 사실상 크게 필요성은 모르겠다...

 

 

// 서비스 인터페이스
public interface Service {
    void doSomething();
}

// 실제 서비스 구현 클래스
public class RealService implements Service {
    @Override
    public void doSomething() {
        System.out.println("RealService: 실제 동작을 수행합니다.");
    }
}

// 프록시 클래스
public class ProxyService implements Service {
    private Service realService;

    public ProxyService(Service realService) {
        this.realService = realService;
    }

    @Override
    public void doSomething() {
        System.out.println("ProxyService: 프록시 동작 전에 추가적인 작업을 수행합니다.");
        realService.doSomething();
        System.out.println("ProxyService: 프록시 동작 후에 추가적인 작업을 수행합니다.");
    }
}

// 클라이언트 클래스
public class Client {
    public static void main(String[] args) {
        Service realService = new RealService();
        Service proxyService = new ProxyService(realService);

        proxyService.doSomething();
    }
}

 

 

참조

https://coding-factory.tistory.com/711

'PATTERN' 카테고리의 다른 글

[PATTERN] Producer - Consumer  (0) 2021.08.27
[PATTERN]Adapter Pattern  (0) 2021.07.14
[PATTERN] DelegationPattern  (0) 2021.07.13