2022. 10. 11. 16:22ㆍ코딩/FRAMEWORK
1.공통으로 처리할 기능 (advice)
2.Joinpoint(서비스 클래스의 모든 메소드) 중 공통으로 처리할 기능이
적용될 메소드를 선택 -> 메소드 선정작업
->2번에 의해서 선정된 메소드를 pointcut
3.point-cut에 advice를 적용(aspect)
->적용 시점이 총 5개
우선 가장 먼저 배우는것은 Joinpoint에서 pointcut 을 선정하는것이다.



마이바티스처럼 별칭지정도 불가
패키지경로 지정시 풀경로 다 적어주어야한다.

메이븐 에서
Aspectjweaver 의 링크를 받아와
pom.xml
AspectJ 아래에 추가
보통 최신일경우 위에다 쌓는식으로 했는데
이경우는 AspectJ 와 Aspectjweaver 가 연관되있기때문에 근처에 두었다.


AOP를 사용하기위해 위와같이 체크박스를 체크
servlet-context.xml
Before : 메소드가 수행되기전 적용
after : 메소드가 수행된후 적용
<!-- 어노테이션으로 만들던것을 bean으로 객체를 만든것
id는 여기서 구분을 짓기위한것이기 때문에 내가 알아볼수있게 지정하면됨
class는 그 경로를 잡는것이기 때문에 확실하게 해야함
-->
<beans:bean id="logAdvice1" class="kr.or.common.LogAdvice1"></beans:bean>
<beans:bean id="logAdvice2" class="kr.or.common.LogAdvice2"></beans:bean>
<beans:bean id="bt" class="kr.or.common.BeforeAdvice"></beans:bean>
<beans:bean id="ar" class="kr.or.common.AfterReturningAdvice"></beans:bean>
<aop:config>
<!-- execution(* ) 에서 괄호안에 띄어쓰기 반드시 있어야함
첫째줄 aop:pointcut 쿼리의 의미
kr.or.member.model.service 패키지에있는 MemberService클래스 내에서
메소드,매개변수,리턴타입이 상관이 없다는 의미
두번째는 selectOneMember 메소드만
-->
<aop:pointcut expression="execution(* kr.or.member.model.service.MemberService.*(..))" id="allPointcut"/>
<aop:pointcut expression="execution(* kr.or.member.model.service.MemberService.selectOneMember(..))" id="selectOne"/>
<aop:pointcut expression="execution(* kr.or.member.model.service.MemberService.insertMember(..))" id="insertPointcut"/>
<!-- 메소드명이 member로 끝나며 매개변수가 없는것 을 선택 -->
<aop:pointcut expression="execution(* kr.or.member.model.service.MemberService.*Member())" id="selectAll"/>
<!--
<aop:aspect ref="logAdvice1">
<aop:before method="testLog" pointcut-ref="selectOne"/>
</aop:aspect>
<aop:aspect ref="logAdvice2">
<aop:before method="logging" pointcut-ref="allPointcut"/>
</aop:aspect>
<aop:aspect ref="bt">
<aop:before method="test2" pointcut-ref="insertPointcut"/>
</aop:aspect>
-->
<aop:aspect ref="ar">
<aop:after-returning method="afterReturn" pointcut-ref="selectAll"/>
</aop:aspect>
</aop:config>
에서
<beans:bean id="logAdvice1" class="kr.or.common.LogAdvice1"></beans:bean>
<beans:bean id="logAdvice2" class="kr.or.common.LogAdvice2"></beans:bean>
<beans:bean id="bt" class="kr.or.common.BeforeAdvice"></beans:bean>
<beans:bean id="ar" class="kr.or.common.AfterReturningAdvice"></beans:bean>
id 는 servlet-context.xml 내에서 인식을 하기위해 지정하는것
class는 내가 사용할 메소드가 존재하는 위치경로를 지정하는것
<aop:aspect ref="logAdvice1">
<aop:before method="testLog" pointcut-ref="allPointcut"/>
</aop:aspect>
ref 에 위에서 지정한 id랑 맞춰준뒤
method 에 그 지정한 id의 클래스에서 사용할 메소드를 고른뒤 선택한 위치에서 해당하는 메소드 에 적용
위 코드는 logAdvice1 에 있는 testLog 메소드를 allPointcut 에서 지정한 메소드 앞 부분에다 사용하겠다는것
<beans:bean id="ar" class="kr.or.common.AfterReturningAdvice"></beans:bean>
kr.or.common.AfterReturningAdvice 라는 경로를 ar이라는 bean객체로 만드는것
<aop:pointcut expression="execution(* kr.or.member.model.service.MemberService.*Member())" id="selectAll"/>
위 코드는 kr.or.member.model.service 패키지에 있는 MemberService 클래스 내에서 Member로 끝나는 메소드중 매개변수가 없는 것을 selectAll 이라는 아이디로 받겠다는 의미이다
<aop:aspect ref="ar">
<aop:after-returning method="afterReturn" pointcut-ref="selectAll"/>
</aop:aspect>
ar이라는 객체에서 afterReturn이라는 메소드를 selectAll 이라고 할당한 메소드가 실행된뒤 적용시켜주겠다는 것이다.
Signature 를 사용할때 .lang으로 끝나는것을 선택

'코딩 > FRAMEWORK' 카테고리의 다른 글
03_Spring_Mybatis(ajax) (0) | 2022.10.11 |
---|---|
03_Spring_Mybatis_member_map(trim,collection,CDATA) (0) | 2022.10.09 |
Mybatis (0) | 2022.10.06 |
Spring[CRUD] 라이브러리 세팅 (0) | 2022.09.30 |
SPRING [CRUD] (0) | 2022.09.29 |