스프링/스프링 핵심 원리 - 고급편

32. 구체 클래스에 프록시 적용

sdafdq 2024. 1. 19. 19:06

당연한 이야기지만, 구체 클래스를 상속받은 자식으로 프록시를 이용할 수 있다.

 

이미 시스템 다 짜놨는데 나중에 추가적으로 기능 추가하고 싶을 때.

 

@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();
}

빈 등록 할 때만 만져주면 될 듯.