You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
new DefaultPointcutAdvisor : Advisor 인터페이스의 가장 일반적인 구현체이다. 생성자를 통해 하나의 포인트컷과 하나의 어드바이스를 넣어주면 된다. 어드바이저는 하나의 포인트컷과 하나의 어드바이스로 구성된다.
Pointcut.TRUE : 항상 true 를 반환하는 포인트컷이다. 이후에 직접 포인트컷을 구현해볼 것이다.
new TimeAdvice() : 앞서 개발한 TimeAdvice 어드바이스를 제공한다.
proxyFactory.addAdvisor(advisor) : 프록시 팩토리에 적용할 어드바이저를 지정한다. 어드바이저는
내부에 포인트컷과 어드바이스를 모두 가지고 있다. 따라서 어디에 어떤 부가 기능을 적용해야 할지 어드바이저 하나로 알 수 있다. 프록시 팩토리를 사용할 때 어드바이저는 필수이다.
그런데 생각해보면 이전에 분명히 proxyFactory.addAdvice(new TimeAdvice()) 이렇게 어드바이저가 아니라 어드바이스를 바로 적용했다. 이것은 단순히 편의 메서드이고 결과적으로 해당 메서드 내부에서 지금 코드와 똑같은 다음 어드바이저가 생성된다. DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice())
#save() 호출
TimeAdvice - TimeProxy 실행
ServiceImpl - save 호출
TimeAdvice - TimeProxy 종료 resultTime=0ms
#find() 호출
TimeAdvice - TimeProxy 실행
ServiceImpl - find 호출
TimeAdvice - TimeProxy 종료 resultTime=1ms
5️⃣ 예제 코드2 - 직접 만든 포인트컷
이번에는 save() 메서드에는 어드바이스 로직을 적용하지만, find() 메서드에는 어드바이스 로직을 적용하지 않도록 해보자.
물론 과거에 했던 코드와 유사하게 어드바이스에 로직을 추가해서 메서드 이름을 보고 코드를 실행할지 말지 분기를 타도 된다. 하지만 이런 기능에 특화되어서 제공되는 것이 바로 포인트컷이다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
3️⃣ 포인트컷, 어드바이스, 어드바이저 - 소개
✅ 포인트컷(Pointcut)이란?
✅ 어드바이스(Advice)이란?
✅ 어드바이저(Advisor)이란?
➡️ 정리
🗒️ 쉽게 기억하기
➡️ 역할과 책임
4️⃣ 예제 코드1 - 어드바이저
new DefaultPointcutAdvisor:Advisor인터페이스의 가장 일반적인 구현체이다. 생성자를 통해 하나의 포인트컷과 하나의 어드바이스를 넣어주면 된다. 어드바이저는 하나의 포인트컷과 하나의 어드바이스로 구성된다.Pointcut.TRUE: 항상true를 반환하는 포인트컷이다. 이후에 직접 포인트컷을 구현해볼 것이다.new TimeAdvice(): 앞서 개발한TimeAdvice어드바이스를 제공한다.proxyFactory.addAdvisor(advisor): 프록시 팩토리에 적용할 어드바이저를 지정한다. 어드바이저는내부에 포인트컷과 어드바이스를 모두 가지고 있다. 따라서 어디에 어떤 부가 기능을 적용해야 할지 어드바이저 하나로 알 수 있다. 프록시 팩토리를 사용할 때 어드바이저는 필수이다.
proxyFactory.addAdvice(new TimeAdvice())이렇게 어드바이저가 아니라 어드바이스를 바로 적용했다. 이것은 단순히 편의 메서드이고 결과적으로 해당 메서드 내부에서 지금 코드와 똑같은 다음 어드바이저가 생성된다.DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice())5️⃣ 예제 코드2 - 직접 만든 포인트컷
save()메서드에는 어드바이스 로직을 적용하지만,find()메서드에는 어드바이스 로직을 적용하지 않도록 해보자.ClassFilter와MethodMatcher둘로 이루어진다. 이름 그대로 하나는 클래스가 맞는지, 하나는 메서드가 맞는지 확인할 때 사용한다. 둘다true로 반환해야 어드바이스를 적용할 수 있다.➡️AdvisorTest - advisorTest2() 추가
MyPointcut
Pointcut인터페이스를 구현한다.true를 반환하도록 했고, 메서드 비교 기능은MyMethodMatcher를 사용한다.MyMethodMatcher
MethodMatcher이다.MethodMatcher인터페이스를 구현한다.matches(): 이 메서드에method,targetClass정보가 넘어온다. 이 정보로 어드바이스를 적용할지 적용하지 않을지 판단할 수 있다.여기서는 메서드 이름이
"save"인 경우에true를 반환하도록 판단 로직을 적용했다.isRuntime(),matches(... args):isRuntime()이 값이 참이면matches(... args)메서드가 대신 호출된다. 동적으로 넘어오는 매개변수를 판단 로직으로 사용할 수 있다.isRuntime()이false인 경우 클래스의 정적 정보만 사용하기 때문에 스프링이 내부에서 캐싱을 통해 성능 향상이 가능하지만,isRuntime()이true인 경우 매개변수가 동적으로 변경된다고 가정하기 때문에 캐싱을 하지 않는다.new DefaultPointcutAdvisor(new MyPointcut(), new TimeAdvice())
실행 결과
실행 결과를 보면 기대한 것과 같이
save()를 호출할 때는 어드바이스가 적용되지만,find()를 호출할 때는 어드바이스가 적용되지 않는다.save() 호출
find()를 호출한다.Service클래스의find()메서드에 어드바이스를 적용해도 될지 물어본다.false를 반환한다. 따라서 어드바이스를 호출하지 않고, 부가 기능도 적용되지 않는다.6️⃣ 예제 코드3 - 스프링이 제공하는 포인트컷
을 생성하고setMappedNames(...)성된다. 으로 메서드 이름을 지정하면 포인트컷이 완성된다.save()를 호출할 때는 어드바이스가 적용되지만,find()를 호출할 때는 어드바이스가 적용되지 않는다.✅ 스프링이 제공하는 포인트컷
스프링은 무수히 많은 포인트컷을 제공한다.
대표적인 몇가지만 알아보자.
✅ 가장 중요한 것은 aspectJ 표현식
7️⃣ 예제 코드4 - 여러 어드바이저 함께 적용
✅ 의문점
target에 적용하려면 어떻게 해야할까?target에 여러 어드바이스를 적용하려면 어떻게 해야할까?여러 프록시
✅ 여러 프록시의 문제
이 방법이 잘못된 것은 아니지만, 프록시를 2번 생성해야 한다는 문제가 있다. 만약 적용해야 하는 어드바이저가 10개라면 10개의 프록시를 생성해야한다.
하나의 프록시
addAdvisor()를 통해서 어드바이저를 등록하면 된다.advisor가 호출된다. 여기서는advisor2,advisor1순서로 등록했다.advice2,advice1순서대로 호출된 것을 알 수 있다.✅ 정리
Beta Was this translation helpful? Give feedback.
All reactions