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

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 핵심 원리 - 고급편

구체 클래스 기반 프록시 - 적용

클래스 기반 프록시에서

작성

·

380

3

클래스 기반 프록시를 만들 때,

프록시는 프록시 대상 클래스를 상속 받고, target을 주입 받아서 호출하는데

어차피 프록시 대상 클래스를 상속 받아야한다면, 그냥 super.로직()을 호출하면 안되나요?

그럼 target을 주입 받을 필요도 없어질텐데 혹시 이 방법은 왜 안되는지 궁금해서 질문 드립니다.

답변 1

5

안녕하세요. 뿌우우우님, 공식 서포터즈 David입니다.

super로 호출하게 되면 특정 상황에서 의도치 않게 동작할 수 있습니다.

예를 들어, 아래와 같이 특정 메서드(getName) 내에서 스스로를 호출하는 경우 override된 proxy의 getName()을 호출하게 되어 의도한 바와 다르게 동작하게 됩니다.

더 자세한 사항은 아래 2개의 글을 참고해주세요.

https://mangkyu.tistory.com/193

https://velog.io/@banjjoknim/%EC%95%84%EC%9D%B4%ED%85%9C-18.-%EC%83%81%EC%86%8D%EB%B3%B4%EB%8B%A4%EB%8A%94-%EC%BB%B4%ED%8F%AC%EC%A7%80%EC%85%98%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC

public class NamePrinter {

    private String name = "MyNamePrinter";
    private int count = 0;

    public String getName() {
        System.out.println("NamePrinter.getName() Called");
        if (count < 2) {
            count++;
            getName();
        }
        return name;
    }
}
public class NamePrinterProxy extends NamePrinter {

    private final NamePrinter target;

    public NamePrinterProxy(NamePrinter target) {
        this.target = target;
    }

    @Override
    public String getName() {
        System.out.println("Proxy.getName() Called");
        return super.getName();
//        return target.getName();
    }
}

 

return target.getName() 일 때

image

return super.getName() 일 때

image

감사합니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기