자바의 프록시 패턴

1. 개요

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

2. 프록시 패턴 예

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

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

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

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. 프록시 사용시기

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

언제 사용하는지 이해 하는 것이 중요합니다.

Proxy 패턴을 언제 사용할 지에 대해 이야기 해 봅시다 :

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

4. 결론

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

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

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