작성
·
225
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
강의 내용을 다시 읊어보면,
" 이번 예제를 보면 execution(* hello.aop..*(..)) 를 통해 적용 대상을 줄여준 것을 확인할 수 있다. args , @args , @target 은 실제 객체 인스턴스가 생성되고 실행될 때 어드바이스 적용 여부를 확인할 수 있다."
여기까지는 이해했습니다.
다음 부분부터 이해가 잘 안되는데,
==
" 실행 시점에 일어나는 포인트컷 적용 여부도 결국 프록시가 있어야 실행 시점에 판단할 수 있다. "
여기서 실행이라는 것이 애플리케이션의 실행을 말씀하시는 것인가요? 아니면 프록시로 생성된 인스턴스의 메소드 실행을 의미하는 것인가요?
== ==
"프록시가 없다면 판단 자체가 불가능하다. 그런데 스프링 컨테이너가 프록시를 생성하는 시점은 스프링 컨테이너가 만들어지는 애플리케이션 로딩 시점에 적용할 수 있다. "
이 부분도 잘 이해가 가지 않습니다. 스프링 컨테이너가 프록시를 생성하는 시점을 애플리케이션 로딩 시점에 적용할 수 있다는 것이 어떤 의미인가요?
스프링 컨테이너가 프록시를 생성하는 시점과, 애플리케이션 로딩 시점이 같다는 의미일까요?
====
" 따라서 args , @args , @target 같은 포인트컷 지시자가 있으면 스프링은 모든 스프링 빈에 AOP를 적용하려고 시도한다. "
예를들어 @target같은 경우는, 주어진 어노테이션이 붙어있는 클래스의 인스턴스가 스프링 빈으로 등록이 되려고 할 때에만 AOP를 적용하려고 시도하는 것이 아닌가요?
답변 1
1
안녕하세요. blackjack_96님
"실행 시점에 일어나는 포인트컷 적용 여부도 결국 프록시가 있어야 실행 시점에 판단할 수 있다."에서 말하는 '실행'은 프록시로 생성된 인스턴스의 메소드 실행을 의미합니다. 즉, 애플리케이션의 전체 실행이 아니라, AOP가 적용된 메소드가 호출될 때를 말합니다. 프록시는 이 메소드 호출이 포인트컷에 정의된 패턴과 일치하는지를 실행 시점에 검사하여, 조건에 맞는 경우에만 어드바이스(Advice)를 적용합니다.
@target
지시자는 특정 어노테이션이 붙은 대상 객체에만 AOP를 적용하도록 합니다. 하지만 중요한 점은 스프링이 이런 포인트컷을 사용할 때, 실제 인스턴스가 생성되어 해당 어노테이션이 적용되었는지 확인하기 전에는 정확하게 AOP 적용 여부를 결정할 수 없다는 것입니다. 따라서 스프링은 포인트컷 조건을 충족할 가능성이 있는 모든 빈에 대해 프록시를 생성하고, 실제 메소드 실행 시에 포인트컷 조건이 맞는지를 검사하게 됩니다.
감사합니다.