스프링 핵심 원리(고급편)

Ch04. 프록시 패턴과 데코레이터 패턴 - 구체 클래스 기반 프록시(테스트)

webmaster 2022. 4. 10. 16:54
728x90

구체 클래스 기반 프록시 - 테스트(프록시 X)

클레스 다이어그램(프록시 적용 전)
런타임 의존 관계(프록시 적용 전)

구체 클레스(핵심 로직)

@Slf4j
public class ConcreteLogic {

    public String operation(){
        log.info("ConcreteLogic 실행");
        return "data";
    }
}

클라이언트 클래스

public class ConcreteClient {
    private ConcreteLogic concreteLogic;

    public ConcreteClient(ConcreteLogic concreteLogic) {
        this.concreteLogic = concreteLogic;
    }

    public void execute(){
        concreteLogic.operation();
    }
}

Test

@Test
public void noProxy(){
    ConcreteLogic concreteLogic = new ConcreteLogic();
    ConcreteClient client = new ConcreteClient(concreteLogic);
    client.execute();
}

구체클레스 기반 프록시 - 테스트 구현

인터페이스가 아니라 클래스를 기반으로 상속을 받아서 프록시를 만들어보겠다.

클레스 다이어그램
런타임 의존관계

서버 TimeProxy

@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;
    }
}
  • ConcreteLogic 를 상속받아서 만든다.

Test

@Test
public void addProxy(){
    ConcreteLogic concreteLogic = new ConcreteLogic();
    TimeProxy timeProxy = new TimeProxy(concreteLogic);
    ConcreteClient client = new ConcreteClient(timeProxy);
    client.execute();
}
  • ConcreteClient 의 생성자에 concreteLogic 이 아니라 timeProxy를 주입한다.
    • ConcreteClient는 ConcreteLogic을 의존하는데, 다형성에 의해 ConcreteLogic에 concreteLogic 도 들어갈 수 있고, timeProxy 도 들어갈 수 있다
  • ConcreteLogic에 할당할 수 있는 객체
    • ConcreteLogic = concreteLogic (본인과 같은 타입을 할당)
    • ConcreteLogic = timeProxy (자식 타입을 할당
  • 참고: 자바 언어에서 다형성은 인터페이스나 클래스를 구분하지 않고 모두 적용된다. 해당 타입과 그 타입의 하위 타입은 모두 다형성의 대상이 된다. 자바 언어의 너무 기본적인 내용을 이야기했지만, 인터페이스가 없어도 프록시가 가능하다는 것을 확실하게 집고 넘어갈 필요가 있어서 자세히 설명했다

 

728x90