Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Proxy Pattern - 예제코드 2 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

Proxy Pattern - 예제코드 2

Seung__ 2021. 11. 23. 23:29

1. 프록시 패턴을 적용


 

 

 

2. CacheProxy


@Slf4j
public class CacheProxy implements Subject{

    private Subject target; //real subject
    private String cacheValue;

    public CacheProxy(Subject target) {
        this.target = target;
    }

    @Override
    public String operation() {
        log.info("프록시 호출");
        if (cacheValue == null){
            cacheValue = target.operation();
        }
        return cacheValue;
    }
}
  • 앞서 설명한 것 처럼 프록시도 실제 객체와 그 모양이 같아야 하기 때문에
  •  Subject 인터페이스를 구현해야한다.
  • private Subject target 
    • 클라이언트가 프록시를 호출하면 프록시가 최종적으로 실제 객체를 호출해야 한다. 
    • 따라서 내부에 실제 객체의 참조를 가지고 있어야 한다. 
    • 이렇게 프록시가 호출하는 대상을 target 이라 한다.
  • operation()
    • 구현한 코드를 보면 cacheValue 에 값이 없으면 실제 객체( target )를 호출해서 값을 구한다. 
    • 그리고 구한 값을 cacheValue 에 저장하고 반환한다. 
    • 만약 cacheValue 에 값이 있으면 실제 객체를 전혀 호출하지 않고, 캐시 값을 그대로 반환한다. 
    • 따라서 처음 조회 이후에는 캐시( cacheValue ) 에서 매우 빠르게 데이터를 조회할 수 있다.

 

 

 

 

3. Test


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

    client.execute();
    client.execute();
    client.execute();
}
23:26:26.111 [main] INFO hello.proxy.pureproxy.proxy.code.CacheProxy - 프록시 호출
23:26:26.113 [main] INFO hello.proxy.pureproxy.proxy.code.RealSubject - 실제 객체 호출
23:26:27.113 [main] INFO hello.proxy.pureproxy.proxy.code.CacheProxy - 프록시 호출
23:26:27.113 [main] INFO hello.proxy.pureproxy.proxy.code.CacheProxy - 프록시 호출
  • 오 3초가 걸려야 하느넫, 1초밖에 안걸렸다. cache덕분!
  • realSubject 와 cacheProxy 를 생성하고 둘을 연결한다.
  • 결과적으로 cacheProxy 가 realSubject 를 참조하는 런타임 객체 의존관계가 완성된다.
  • 그리고 마지막으로 client 에 realSubject 가 아닌 cacheProxy 를 주입한다.
  • 이 과정을 통해서 client -> cacheProxy -> realSubject 런타임 객체 의존 관계가 완성된다.
  • cacheProxyTest() 는 client.execute() 을 총 3번 호출한다.
  • 이번에는 클라이언트가 실제 realSubject 를 호출하는 것이 아니라 cacheProxy 를 호출하게 된다.

 

4. 정리


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

 

 

5. GitHub : 211123 Proxy Pattern Example 2


 

GitHub - bsh6463/Spring_Advanced_2

Contribute to bsh6463/Spring_Advanced_2 development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글

Decorator Pattern 2  (0) 2021.12.28
Decorator Pattern - 1  (0) 2021.12.28
Proxy Pattern - 예제코드 1  (0) 2021.11.23
Proxy, Proxy Pattern, Decorator Pattern  (0) 2021.11.23
요구사항 추가  (0) 2021.11.23
Comments