Spring - AOP
5. BeforeAdvice 구현하기
앞에만 삽입하기
<bean id ="logBeforeAdivce" class="spring.aop.advice.LogBeforeAdivce"/>
추가하고
핸들러는 리스트이기 때문에 그냥 밑에 추가해도된다.
<property name = "interceptorNames">
<list>
<value>logAroundAdivce
<value>logBeforeAdivce
</list>
</property>
함수에 대한 이름을뽑고싶다. method 파라미터=args target객체 사용하고싶다. 사용
around 는 타겟에 대한 함수 요청이 들어갓어는데 얘는 앞에 들어갈 내용만 작성하면된다.
앞에서 실행될 로직
215ms 시간이 걸렸습니다.
total is 4
앞에서 실행될 로직
203ms 시간이 걸렸습니다.
avg is 1.000000
6. After Returning / Throwing 어드바이스 구현하기
before와 차이
public void before(Method method, Object[] args, Object target)
코어 실행되기 전에 실행하기 때문에 전에 앞서서 필요한 내용이 전달됨
public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
애프터는 코어 함수가 호출된후 반환값이 있으면 그게 필요하면 사용한다.
앞에서 실행될 로직
returnValue4, Method: total
215ms 시간이 걸렸습니다.
total is 4
앞에서 실행될 로직
returnValue1.0, Method: avg
211ms 시간이 걸렸습니다.
avg is 1.000000
Throwing 어드바이스
얘는 구현해야할 함수가 정해지지 않기때문에 인자가 달라진다.
public void afterTrowing(? e) throws Throwable{}
?부분 어떤 예외가 발생할지 모르기 때문이다.
target이 있으면 total이든 뭐든 before가 호출된다.
그다음after로 간다. 이 중간에 예외가발생하면 throwing이 발생한다.
total에 100점이 넘으면 예외가 발생하도록 처리 해둔다.
if(kor > 100)
throw new IllegalArgumentException("유효하지 않은 국어점수");
before 실행 -> 앞에서 실행될 로직
예외실행 -> Exception in thread "main" 예외가 발생하였습니다. 예외가 발생하게된다.
7. Point Cut(Weaving, Join Point)
원하는 메소드에만 곁다리 함수를 하고 싶다.
포인트컷 조인포인트 위빙
크로스커팅 컨선과 코어 컨선을 엮는 것을 위빙(뜨개질)이라고 한다.
곁다리업무가 대상으로 삼고있는 메소드를 Join Point라고 한다.
target으로 삼고있는 내용이있다면 타겟을 대상으로 모든 메소드를 조인포인트라고 생각한다.
우리가 원하는 것은 한개의 메소드에만 추가 하고싶다. 이것을 Point Cut이라고 한다.
원하는 메소드만 할 수 잇게 된다.
가장기본적인 것만 알아보도록하자ㅣ.
<bean id="classicPointCut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="total"/>
</bean>
이름을 매핑해주고 각 어드바이스에 연결을 해줘야한다.
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logBeforeAdivce"/>
<property name="pointcut" ref="classicPointCut"/> //setPointcut인데 그냥 pointcut
</bean>
classicBeforeAdvisor를 만들고 포인트컷과 비포어드바이스와 연결해준다.
그리고 리스트에 비포어드바이저대신 추가해주면 total()ㄱ이 실행될때만 실행되게 된다.
앞에서 실행될 로직
returnValue4, Method: total
208ms 시간이 걸렸습니다.
total is 4
returnValue1.0, Method: avg
213ms 시간이 걸렸습니다.
avg is 1.000000
어라운드에도 추가하면
<bean id="classicArroundAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logAroundAdivce"/>
<property name="pointcut" ref="classicPointCut"/>
</bean>
앞에서 실행될 로직
returnValue4, Method: total
201ms 시간이 걸렸습니다.
total is 4
returnValue1.0, Method: avg
avg is 1.000000
이렇게된다.
그런데 불편한점은 한개추가할때마다 결합을 하나씩해야한다는 점이 귀찮다.
8. 간소화된 Advisor
필요에 따라서 어드바이저 포인트컷을 합치는 것이 필요하다.
어드바이저 중에서 포인트컷을 가지고 있는 것이 잇다.
NameMatchMethodPointcutAdvisor
함수가 한개일때 Name
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdivce"/>
<property name="mappedName" value="total"/>
</bean>
포함할 함수가 여러개일때 mappedNames하고 list에 넣기
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdivce"/>
<property name="mappedNames">
<list>
<value>total</value>
</list>
</property>
</bean>
포인트컷이 설정했던 내용을 값으로 가지게 된다.
함수명이 많을 경우 하나하나 추가하기 어렵다.
RegexpMethodPointcutAdvisor
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdivce"/>
<property name="mappedNames">
<list>
<value>.*to.*</value>
</list>
</property>
</bean>
정규식 문자를 사용해서 to가 들어간것이 실행되게 할 수 있다.
9. 어노테이션으로 하는 aop는 알아서 찾아보기.
강의가 끊겼다!
'기초단계 > SPRING' 카테고리의 다른 글
| 2023.01.17 Spring (0) | 2023.01.17 |
|---|---|
| 2023.01.16-2 Spring (1) | 2023.01.16 |
| 2023.01.15-2 Spring (0) | 2023.01.15 |
| 2023.01.15-1 Spring (0) | 2023.01.15 |
| 2023.01.13 Spring (0) | 2023.01.13 |