당연한 이야기지만, 구체 클래스를 상속받은 자식으로 프록시를 이용할 수 있다.
이미 시스템 다 짜놨는데 나중에 추가적으로 기능 추가하고 싶을 때.
@Slf4j
public class ConcreteLogic {
public String operation(){
log.info("ConcreateLogic 실행");
return "data";
}
}
먼저 이런 핵심 로직이 있다고 치고
public class ConcreteClient {
private ConcreteLogic concreteLogic;
public ConcreteClient(ConcreteLogic concreteLogic) {
this.concreteLogic = concreteLogic;
}
public void execute(){
concreteLogic.operation();
}
}
이렇게 execute()를 통해서 실행 하는데,
@Test
void noProxy(){
ConcreteLogic concreteLogic = new ConcreteLogic();
ConcreteClient client = new ConcreteClient(concreteLogic);
client.execute();
}
이렇게,
만약 소요시간 로그 기능을 추가하고 싶다면,
@Slf4j
public class TimeProxy extends ConcreteLogic{
private ConcreteLogic concreteLogic;
public TimeProxy(ConcreteLogic concreteLogic) {
this.concreteLogic = concreteLogic;
}
@Override
public String operation(){
log.info("TimeDecorator 실행");
long startTime = System.currentTimeMillis();
String result = concreteLogic.operation();
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("TimeDecorator 종료 resultTime={}ms", resultTime);
return result;
}
}
그냥 바로 상속 받아서 @Override로 기능 부분 바꾸면 끝.
@Test
void addProxy(){
ConcreteLogic concreteLogic = new ConcreteLogic();
TimeProxy timeProxy = new TimeProxy(concreteLogic);
ConcreteClient client = new ConcreteClient(timeProxy);
client.execute();
}
빈 등록 할 때만 만져주면 될 듯.
'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글
34. 인터페이스 기반 프록시 vs 구체클래스 프록시 (0) | 2024.01.19 |
---|---|
33. 구체클래스 프록시 적용 (0) | 2024.01.19 |
31. 로그트레이스 프록시 적용 (0) | 2024.01.19 |
30. 데코레이터 패턴 (0) | 2024.01.19 |
29. 프록시 패턴 (0) | 2024.01.19 |