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

김상형님의 프로필 이미지
김상형

작성한 질문수

스프링 핵심 원리 - 고급편

this, target

프록시 객체가 생겼다는 가정 하에 this와 target이 설명되어서 조금 헷갈리는 것 같습니다

해결된 질문

작성

·

44

0

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

[질문 내용]
프록시 적용 여부와 어드바이스 적용 여부가 한번에 설명되어서 약간 헷갈리는 것 같습니다.

예제에서 사용한 방식은 컴포넌트 스캔으로 등록된 빈을 후처리기를 통하여 프록시로 생성합니다

image.png

강의를 들은 후 위의 그림처럼 this(hello.aop.member.MemberServiceImpl) 포인트 컷으로 사용한 어드바이저만을 등록하는 경우를 시험해 보았습니다.

아예 프록시 객체가 생성되지 않을 것 이라고 예상하였는데 로그를 보면

image.png

예상과 다르게 프록시 객체가 생성되었음을 확인하였습니다.
그렇다면
@Around("this(hello.aop.member.MemberServiceImpl)") 여기에서
1. 프록시 객체를 생성할 때는 hello.aop.member.MemberServiceImpl 만을 보고 생성해 준다
2. 후에 어드바이스를 적용할 지 판단할 시에는 this까지 고려하여 판단한다. -> 강의 내용에 따라 적용 안됨
라고 정리할 수 있을까요??


답변 2

1

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

안녕하세요. 김상형님

프록시를 적용하지 않으면 구체 클래스를 기반으로 AOP를 적용한다고 이해하시면 됩니다.

따라서 프록시를 적용하지 않은 경우에는 this, target 모두 AOP가 잘 적용됩니다.

this, target이 일반적인 상황에서는 둘다 똑같이 적용되기 때문에 둘을 구분하는 설명을 위해서 프록시를 적용한 예를 들게 되었습니다 🙂

 

이 문제에서 설명하고 싶은 핵심은 프록시 적용 여부에 따라서 구체 클래스가 달라지기 때문입니다.

 

예를 들어 CGLIB Proxy는 MemberServiceImpl 구현체를 상속 받습니다.

이 경우에도 this, target 모두 AOP가 적용됩니다.

 

JDK Proxy를 적용하는 경우 구체적인 클래스가 MemberServiceImpl과 관련이 없기 때문에 this가 적용되지 않는 것입니다.

 

감사합니다.

0

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

김상형님께서 질문하신 내용은 스프링 AOP에서의 thistarget 표현식의 활용과 그에 따른 프록시 생성 및 어드바이스 적용 여부에 대한 부분인데요. 스프링의 AOP 기능은 실제 클래스나 인터페이스에 프록시를 생성해서 메서드 호출을 제어하는 방식으로 작동합니다.

핵심 개념

  1. 프록시 생성 시점: 스프링은 애플리케이션 컨텍스트 초기화 시점에 AOP 설정에 따라 프록시를 생성합니다. 이 때, @Aspect로 정의된 어드바이저들은 AOP Proxy에 의해 인터셉트될 메서드를 대상으로 하게 됩니다. this 표현식은 프록시 객체 자체를 기준으로 판단하며, 이 프록시는 보통 JDK 동적 프록시나 CGLIB 프록시 중 적절한 방식으로 생성됩니다.

  2. this(hello.aop.member.MemberServiceImpl): this 표현식은 등록된 프록시 객체 기준으로 판별되며, 클래스 기반 판별이기 때문에 특정 클래스 타입의 프록시가 제공되지 않으면 this 표현식에 의해 어드바이스가 적용되지 않을 가능성이 높습니다. 로그에 표시된 대로, 아직도 인터페이스 MemberService의 타입을 가진 경우라면 this 표현식이 적용되지 않을 수 있습니다.

정리

  • 프록시 생성: 컴포넌트 스캔 및 자동 프록싱에 의해 빈이 등록될 때, hello.aop.member.MemberServiceImpl가 빈으로 등록되면 프록시를 생성할 수 있습니다.
  • 어드바이스 적용: 어드바이스를 적용할 지는 이 프록시가 this 표현식을 만족하는 지 여부에 따라 달라집니다. 일반적으로 this 식은 프록시의 대상이 구체 클래스(MemberServiceImpl)가 아닌 경우 적용되지 않습니다. 이로 인해 프록시 객체가 있으나 어드바이스가 적용되지 않는 상황이 발생할 수 있습니다.

이러한 메커니즘에 대한 이해가 맞는지 확인해보고 싶을 경우, 관련된 기존 질문과 답변을 참고해보시는 것도 도움이 될 것입니다. 예를 들어 아래 링크에서 비슷한 주제를 다루고 있습니다:

  • ### this와 target 차이
    여기에서는 thistarget이 어떤 기준으로 어드바이저를 적용하는지에 대한 보다 상세한 논의를 확인할 수 있습니다.

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

김상형님의 프로필 이미지
김상형
질문자

포인트컷의 경로식으로 프록시 적용 여부를 판단하고, this 표현식 + 경로식으로 어드바이스 적용 여부를 판단하는데 부적합하여 적용이 되지 않았다고 결론 지으면 될까요..?

김상형님의 프로필 이미지
김상형

작성한 질문수

질문하기