본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!
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();
}
}
}
sleep(1000)
은 쓰레드가 1초를 쉬는 코드인데, 서버에서 1초 동안 걸리는 무거운 작업이라는 것을 가정한다.public class ProxyPatternClient {
private Subject subject;
public ProxyPatternClient(Subject subject) {
this.subject = subject;
}
public void execute(){
subject.operation();
}
}
void noProxyTest() {
RealSubject realSubject = new RealSubject();
ProxyPatternClient client = new ProxyPatternClient(realSubject);
client.execute();
client.execute();
client.execute();
}
//실행 결과
RealSubject - 실제 객체 호출
RealSubject - 실제 객체 호출
RealSubject - 실제 객체 호출
@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;
}
}
Subject
를 구현한다.target
이라 한다.operation()
은 내부에 저장된 값이 있으면 바로 리턴(캐싱), 없으면 실제 서버를 호출해 리턴해주는 로직이다.void cacheProxyTest() {
Subject realSubject = new RealSubject();
Subject cacheProxy = new CacheProxy(realSubject);
ProxyPatternClient client = new ProxyPatternClient(cacheProxy);
client.execute();
client.execute();
client.execute();
}
//실행 결과
CacheProxy - 프록시 호출
RealSubject - 실제 객체 호출
CacheProxy - 프록시 호출
CacheProxy - 프록시 호출
@Slf4j
public class MessageDecorator implements Subject {
private Subject subject;
public MessageDecorator(Subject subject) {
this.subject = subject;
}
@Override
public String operation() {
log.info("MessageDecorator 실행");
String result = subject.operation();
String decoResult = "*****" + result + "*****";
log.info("MessageDecorator 꾸미기 적용 전={}, 적용 후={}", result, decoResult);
return decoResult;
}
}
void decorator() {
Subject realSubject = new RealSubject();
Subject cacheProxy = new CacheProxy(realSubject);
Subject MessageDecorator = new MessageDecorator(cacheProxy);
ProxyPatternClient client = new ProxyPatternClient(MessageDecorator);
client.execute();
}
//실행 결과
MessageDecorator - MessageDecorator 실행
CacheProxy - 프록시 호출
RealSubject - 실제 객체 호출
MessageDecorator - MessageDecorator 꾸미기 적용 전=data, 적용 후=*****data*****
인프런의 '스프링 핵심 원리 고급편(김영한)'을 스스로 정리한 글입니다.
자세한 내용은 해당 강의를 참고해주세요.