04_Spring_AOP

2022. 10. 11. 16:22코딩/FRAMEWORK

1.공통으로 처리할 기능 (advice)
2.Joinpoint(서비스 클래스의 모든 메소드) 중 공통으로 처리할 기능이
적용될 메소드를 선택 -> 메소드 선정작업
->2번에 의해서 선정된 메소드를 pointcut
3.point-cut에 advice를 적용(aspect)
->적용 시점이 총 5개

 

우선 가장 먼저 배우는것은 Joinpoint에서 pointcut 을 선정하는것이다.

 

 

 

 

 

마이바티스처럼 별칭지정도 불가

패키지경로 지정시 풀경로 다 적어주어야한다.

메이븐 에서 

Aspectjweaver 의 링크를 받아와

pom.xml

AspectJ 아래에 추가

보통 최신일경우 위에다 쌓는식으로 했는데

이경우는 AspectJAspectjweaver 가 연관되있기때문에 근처에 두었다.

 

 

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