프록시 패턴

salgu·2021년 12월 20일
0

Spring

목록 보기
17/22

대리자를 영어로 Proxy라고 하고
클라이언트가 서버에게 직접 요청을 하는것이 아니고 프록시를 통해서
간접적으로 서버에 요청할 수 있습니다.
대표적으로 접근제어, 캐싱, 부가기능 추가, 프록시 체인(프록시가 프록시를 호출할 수 있음) 등이 가능합니다.

서버와 프록시는 같은 인터페이스를 사용하여야 하고
서버 객체를 프록시 객체로 변경하여도 클라이언트는 아무 지장없이 사용할 수 있어야 합니다.

참고로 프록시 패턴과 데코레이터 패턴은 둘다 프록시를 사용하는점은 같지만
사용하는 의도에 따라서 프록시 패턴과 데코레이터 패턴을 구분합니다.

interface code

  public interface Subject {
      String operation();
  }

구현체 code

@Slf4j
public class RealSubject implements Subject {

    @Override
    public String operation() {
	log.info("실제 객체 호출"); 
        sleep(1000);
	return "data";
    }
}      

client code

public class ProxyPatternClient {

      private Subject subject;
      
      public ProxyPatternClient(Subject subject) {
          this.subject = subject;
      }
      
      public void execute() {
          subject.operation();
      }
}

Proxy code

@Slf4j
public class CacheProxy implements Subject {
      private Subject target;
      private String cacheValue;
      
      public CacheProxy(Subject target) {
          this.target = target;
      }
      
      @Override
      public String operation() {
	   log.info("프록시 호출");
           if (cacheValue == null) {
                 cacheValue = target.operation();
           }
           return cacheValue;
      }
}
 

Test code

@Test
void cacheProxyTest() {
      Subject realSubject = new RealSubject();
      Subject cacheProxy = new CacheProxy(realSubject);
      ProxyPatternClient client = new ProxyPatternClient(cacheProxy);
      
      client.execute();
      client.execute();
      client.execute();
}

client -> cacheProxy -> realSubject 런타임 객체 의존 관계가 완성된다.
그리고 realSubject가 3번 호출되는것이 아니고
프록시가 받아 realSubject는 한번 반환되고 두번은 proxy cache에서 반환된다.

프록시 패턴의 핵심은 RealSubject 코드와 클라이언트 코드를 전혀 변경하지 않고, 프록시를 도입해서 접근 제어를 했다는 점이다.
그리고 클라이언트 코드의 변경 없이 자유롭게 프록시를 넣고 뺄 수 있다.
실제 클라이언트 입장에서는 프록시 객체가 주입되었는지, 실제 객체가 주입되었는지 알지 못한다.










reference : 김영한님

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

0개의 댓글