오봉이와 함께하는 개발 블로그
스프링 핵심 원리 - 고급편 > 구체 클래스 기반 프록시 본문
728x90
스프링 핵심 원리 - 고급편 > 구체 클래스 기반 프록시
이전 글에서 인터페이스 기반 코드에 프록시를 추가했다면, 이제는 구체 클래스에 프록시를 적용하자.
@Slf4j
public class ConcreteLogic {
public String operation() {
log.info("Concrete Login execute");
return "data";
}
}
위 ConcreteLogic 코드는 인터페이스를 기반으로 작성한 코드가 아닌, 그냥 순수한 클래스다.
여기에 프록시를 도입하려면 어떻게 해야 좋을까?
@RequiredArgsConstructor
public class ConcreteClient {
private final ConcreteLogic concreteLogic;
public void execute() {
concreteLogic.operation();
}
}
위 ConcreteClient는 ConcreteLogic 클래스에 의존하고 있는 클래스고 ConcreteLogic의 operation() 메서드를 사용한다.
그렇다면 의존 관계는 아래와 같을 것이다.
그럼 이제 정말로 클래스 기반 프록시를 도입해보자.
자바는 인터페이스를 구현하든, 클래스를 상속받든 상위 타입만 맞으면 다형성이 적용된다.
즉, ConcreteLogic을 상속 받은 프록시 클래스를 생성하여 프록시를 도입할 수 있다는 뜻이다.
아래는 ConcreteLogic을 상속 받은 TimeProxy이다.
@Slf4j
@RequiredArgsConstructor
public class TimeProxy extends ConcreteLogic {
private final ConcreteLogic readLogic;
@Override
public String operation() {
log.info("TimeDecorator execute");
long startTime = System.currentTimeMillis();
String result = readLogic.operation();
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("TimeDecorator End resultTime = {}", resultTime);
return result;
}
}
실제로 아래 코드를 통해 돌아가는지 테스트해 볼 수 있다.
@Test
void addProxy() {
ConcreteLogic concreteLogic = new ConcreteLogic();
TimeProxy timeProxy = new TimeProxy(concreteLogic);
ConcreteClient client = new ConcreteClient(timeProxy);
client.execute();
}
인터페이스를 통해 프록시를 도입하든, 상속을 통해 도입하든 ConcreteClient를 생성할 때 TimeProxy를 주입하여 생성이 된다.
출처: 김영한 지식공유자의 스프링 핵심 원리 고급편
728x90
'BE > Spring' 카테고리의 다른 글
스프링 핵심 원리 - 고급편 > 인터페이스 기반 vs 클래스 기반 프록시 정리 (0) | 2024.08.27 |
---|---|
스프링 핵심 원리 - 고급편 > 구체 클래스 기반 프록시 적용 (0) | 2024.08.27 |
스프링 핵심 원리 - 고급편 > 인터페이스 기반 프록시 적용 (0) | 2024.08.27 |
스프링 핵심 원리 - 고급편 > 프록시 패턴과 데코레이터 패턴 정리 (0) | 2024.08.25 |
스프링 핵심 원리 - 고급편 > 데코레이터 (0) | 2024.08.25 |
Comments