1. 개요

프록시 패턴을 사용하면 구성 요소의 기본 복잡성을 숨기면서 다른 리소스에 대한 인터페이스 역할을 하는 중개자를 만들 수 있습니다 .

2. 프록시 패턴 예시

일부 초기 구성이 필요한 무거운 Java 객체(JDBC 연결 또는 SessionFactory 와 같은 ) 를 고려하십시오.

우리는 이러한 개체가 요청 시 초기화되기를 원하고 일단 초기화되면 모든 호출에 다시 사용하려고 합니다.

MrvrsH6

이제 이 개체에 대한 간단한 인터페이스와 구성을 만들어 보겠습니다.

public interface ExpensiveObject {
    void process();
}

대규모 초기 구성으로 이 인터페이스를 구현합니다.

public class ExpensiveObjectImpl implements ExpensiveObject {

    public ExpensiveObjectImpl() {
        heavyInitialConfiguration();
    }
    
    @Override
    public void process() {
        LOG.info("processing complete.");
    }
    
    private void heavyInitialConfiguration() {
        LOG.info("Loading initial configuration...");
    }
    
}

이제 프록시 패턴을 활용하고 요청 시 개체를 초기화합니다.

public class ExpensiveObjectProxy implements ExpensiveObject {
    private static ExpensiveObject object;

    @Override
    public void process() {
        if (object == null) {
            object = new ExpensiveObjectImpl();
        }
        object.process();
    }
}

클라이언트가 process() 메서드를 호출할 때마다 처리 과정을 볼 수 있으며 초기 구성은 항상 숨겨진 상태로 유지됩니다.

public static void main(String[] args) {
    ExpensiveObject object = new ExpensiveObjectProxy();
    object.process();
    object.process();
}

우리는 process() 메서드를 두 번 호출하고 있습니다. 배후에서 설정 부분은 개체가 처음 초기화될 때 한 번만 발생합니다.

다른 모든 후속 호출에 대해 이 패턴은 초기 구성을 건너뛰고 처리만 발생합니다.

Loading initial configuration...
processing complete.
processing complete.

3. 프록시 사용 시기

패턴을 사용하는 방법을 이해하는 것이 중요합니다.

사용 시기를 이해하는 것이 중요합니다.

프록시 패턴을 사용하는 경우에 대해 이야기해 보겠습니다.

  • 복잡하거나 무거운 물체의 단순화된 버전을 원할 때. 이 경우 요청 시 원본 개체를 로드하는 스켈레톤 개체로 나타낼 수 있으며 지연 초기화라고도 합니다. 이것은 가상 프록시로 알려져 있습니다.
  • 원래 개체가 다른 주소 공간에 있고 우리가 그것을 로컬로 표현하려는 경우 . 클라이언트가 로컬 주소 공간에 있는 그대로 액세스하는 동안 연결 생성 및 유지, 인코딩, 디코딩 등과 같은 필요한 모든 상용구 작업을 수행하는 프록시를 만들 수 있습니다. 이를 원격 프록시라고 합니다.
  • 클라이언트의 액세스 권한에 따라 제어된 액세스를 제공하기 위해 원본 기본 개체에 Security 계층을 추가하려는 경우 . 이를 보호 프록시라고 합니다.

4. 결론

이 기사에서는 프록시 디자인 패턴을 살펴보았습니다. 이것은 다음과 같은 경우에 좋은 선택입니다.

  • 개체의 단순화된 버전을 원하거나 개체에 더 안전하게 액세스하려는 경우
  • 원격 객체의 로컬 버전을 원할 때

이 예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner