개발이 좋아서/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를 건들이지 않고 수정할 수 있다.