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

bae jewoo님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 AOP 주의 사항 - 프록시 내부 호출1

프록시 객체의 this

작성

·

143

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
안녕하세요!

이번 강의 내용 중에 자바 언어에서 메서드 앞에 별도의 참조가 없으면 this라는 뜻으로 자기 자신의 인스턴스를 가리킨다
는 this.internal() 이 되는데, 여기서 this 는 자기 자신을 가리키므로, 실제 대상 객체(target)의 인스턴스를 뜻한다.
라고 설명이 되어 있는데


지금 까지 알던 개념은
CallService(부모), CallServiceProxy(자식)
관계가 존재한다면
CallServiceProxy 입장에서는 this는 자기 자신의 주솟값을 가리킨다. super는 부모 즉 CallService의 주솟값을 가리킨다 입니다



여기서 this는 그럼 프록시 자기 자신의 객체 주솟값이 아닌
(부모의 주솟값 == super == trarget )
를 가리킨다고 이해하면 될까요?



그렇다고 하면 해당 프록시 객체는 자기 자신의 참조 주솟값은 스택 프레임에서 가지지 않는 걸까요?

답변 2

0

bae jewoo님의 프로필 이미지
bae jewoo
질문자

pdf에 있는 내용은 CallService 프록시가 아니라
실제 CallService에서 this를 통해 호출한다는 내용이었군요
다음부턴 더 자세히 읽어보겠습니다!

0

안녕하세요, 인프런 AI 인턴입니다.

bae jewoo님께서 주신 질문은 스프링 프레임워크의 프록시 패턴과 관련된 this 키워드의 의미에 대한 깊은 이해를 필요로 합니다. 자바 내에서 this 키워드는 현재 객체, 즉 인스턴스 자신을 가리키는 참조이며, 프록시 객체 내에서 this를 사용할 때는 프록시 객체 자신을 가리킵니다. 그러나 스프링에서는 동적 프록시를 통해서 원본 객체(target)에 대한 프록시 객체를 생성하게 되는데, 이 때 내부 메서드 호출 시 프록시 로직을 거치지 않고 직접 원본 객체의 메서드를 호출하는 상황에 대한 혼란을 초래할 수 있습니다.

이와 관련된 교안에서 질문하신 CallServiceCallServiceProxy 관계에 있어서, this는 실제로 프록시 객체를 가리킴에도 불구하고, 메서드 내부에서 this를 통한 방식으로 다른 메서드를 호출하게 되면 원본 객체의 메서드를 직접 호출하는 것이 아닌, 프록시 객체 내의 메서드를 호출하게 됩니다. 즉, CallServiceProxythisCallServiceProxy 인스턴스 자신을 가리키며, 이를 통해 프록시 객체 내의 다른 메서드를 호출하면 프록시 로직이 적용된 메서드 호출이 가능합니다.

관련하여 유사 질문에서 제공된 설명에 따르면, static class CallService 예제 코드에 대한 설명으로는, @Transactional 어노테이션이 적용된 메서드를 내부적으로 호출할 때 프록시를 통해야 트랜잭션이 적용되며, 같은 클래스 내의 this를 통한 메서드 호출은 프록시를 거치지 않기 때문에 주의가 필요하다는 점을 강조합니다. 이에 대해 더 깊은 이해를 도와줄 수 있는 다음 질문과 답변을 확인해보시는 것이 좋을 것 같습니다:

프록시 호출

이 경우, 프록시 객체가 자신의 참조 주솟값을 가지지 않는 것이 아니라, 프록시 객체 내부에서 this를 통해 참조하는 것이 자기 자신(프록시 객체)임을 의미합니다. 결국 프록시 객체와 원본 객체(target) 간의 관계성을 이해하는 것이 중요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.