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를 건들이지 않고 수정할 수 있다.
'개발이 좋아서 > Spring이 좋아서' 카테고리의 다른 글
구체 클래스 기반 프록시 (0) | 2024.12.30 |
---|---|
프록시 - 프록시 패턴(기능 추가) (0) | 2024.12.30 |
디자인 패턴 - 전략 패턴(템플릿 콜백 패턴) (0) | 2024.12.29 |
디자인 패턴 - 템플릿 메서드 패턴 (0) | 2024.12.29 |
ThreadLocal - 동시성 문제 (0) | 2024.12.29 |