개발이 좋아서/Spring이 좋아서

프록시 - 프록시 패턴(접근 제어)

zoaseo 2024. 12. 30. 13:36
public interface Subject {
    String operation();
}
@Slf4j
public class RealSubject implements Subject {

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

    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class ProxyPatternClient {

    private Subject subject;

    public ProxyPatternClient(Subject subject) {
        this.subject = subject;
    }

    public void execute() {
        subject.operation();
    }
}
@Test
void noProxyTest() {
    RealSubject realSubject = new RealSubject();
    ProxyPatternClient client = new ProxyPatternClient(realSubject);
    client.execute();
    client.execute();
    client.execute();
}

- 테스트 코드를 실행하면 opertion을 3번 실행시키기 때문에 3초가 걸린다.

 

 

@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
void cacheProxyTest() {
    RealSubject realSubject = new RealSubject();
    CacheProxy cacheProxy = new CacheProxy(realSubject);
    ProxyPatternClient client = new ProxyPatternClient(cacheProxy);
    client.execute();
    client.execute();
    client.execute();
}

- 테스트 코드를 실행하면 cacheProxy의 cacheValue에 opertion한 값이 담아지기 때문에 operation을 3번 실행시킬 필요없이 이미 담아진 값을 불러들여 1초의 시간밖에 걸리지 않는다.

- RealSubject, client를 건들이지 않고 수정할 수 있다.