인프런 커뮤니티 질문&답변

손영민님의 프로필 이미지
손영민

작성한 질문수

스프링 핵심 원리 - 고급편

구체 클래스 기반 프록시 - 예제2

콘크리트프록시를 구현시 원본 구체를 파라메터로 받는이유

해결된 질문

작성

·

213

·

수정됨

3

콘크리드프록시를 생성 할 때 기존 구체를 상속을 받고 오버라이딩 할 때 아래 예시와 같이 부모 메소드를 super를 통해서 호출이 가능한데요

public class OrderControllerConcreteProxy extends OrderControllerV2 {

    private final LogTrace logTrace;

    public OrderControllerConcreteProxy(OrderServiceV2 orderService, LogTrace logTrace) {
        super(orderService);
        this.logTrace = logTrace;
    }

    @Override
    public String request(String itemId) {
        TraceStatus status = null;
        try {
            status = logTrace.begin("OrderController.request()");
            //target 호출
            String result = super.request(itemId);
            logTrace.end(status);
            return result;
        } catch (Exception e) {
            logTrace.exception(status, e);
            throw e;
        }
    }

    @Override
    public String noLog() {
        return super.noLog();
    }
}

이렇게 super를 통해서 호출하지 않고 OrderControllerV2를 따로 new 해서 멤버 변수로 받고 그 원본 구현체를 호출하는 이유가 있을까요?

답변 1

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 손영민님

프록시와 원본을 하나로 같이 사용하면 되지 않을까요? 라는 질문으로 이해했습니다.

프록시는 원본 객체를 상속 받기 때문에 프록시에서 오버라이딩 한 기능이 호출되어 버릴 수 있습니다.

이런 문제가 발생하지 않도록 프록시 객체와 원본 객체를 명확하게 분리하기 위해서 별도로 나누게 됩니다.

감사합니다.

손영민님의 프로필 이미지
손영민

작성한 질문수

질문하기