12장 AOP
Aspect oriented programming관점 지향 프로그래밍
1.하나의 프로그램을 관점 이라는 논리적인 단위로 분리하여 관리하는 개념
2.로깅,트랜잭션,보안,캐싱등 다양한 곳에서 다용된다
3.여기에서는 메서드 호출을 관심사로 설정하여 aop에 관한 실습을 진행할것이다.
4.관점을 통해 spring framework가 어떤 메서드가 호출되는지 관심있게 지켜보다가 특정 메서드가 호출되면 자동으로
메서드 전과 후에 다른 메서드가 호출 될 수 있도록 한다.
관점 지향 프로그램
프로그램을 개발할때 관점(관심사)를 설정한다, 해당 관점(관심사)가 수행되는지 지켜보다가 해당 관점이 수행되면 구현되어져있는 다른 작업을 먼저 수행하고 관점을 동작시킨다 반대로 관점을 먼저 수행후 다른 작업을 수행하기도함
spring aop 용어
Joint Point (메서드 호출) (관심사 설정부분)
모듈이 삽입되어 동작하게 되는 특정 위치(메소드 호출등)
Point Cut(전,후)
다양한 Joint Point 중에 어떤 것을 사용할지 선택
Advice(호출된 메서드 전,후 실행될 모듈)
Joint Point 에 삽입되어 동작할 수 있는 코드
- before:메서드 호출 전에 동작하는 advice
- after-returning:예외 없이 호출된 메서드의 동작이 완료되면 동작하는 advice
- ather-throwing:호출된 메서드 동작 중 예외가 발생했을 때 동작하는 advice
- after:예외 발생 여부에 관계없이 호출된 메서드의 동작이 완료되면 동작하는 advice
- around:메서드 호출 전과 후에 동작하는 advice
Weaving(모듈 삽입,호출된 메서드 ,모듈 삽입 세 부분을 하나의 동작으로 만듬 )
Advice를 핵심 로직 코드에 적용하는 것
Aspect
Point Cut+Advice
aop를 사용하기 위해선 라이브러리를 추가해야한다
Maven Repository: Search/Browse/Explore
flexmark-java core and all extension modules and converters Last Release on Apr 29, 2020
mvnrepository.com
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
pom.xml에 추가
package kr.co.softcampus.beans;
public class TestBean {
public void method1() {
System.out.println("method1 호출");
}
}
package kr.co.softcampus.advisor;
import org.aspectj.lang.ProceedingJoinPoint;
public class AdvisorClass {
public void beforeMethod() {
System.out.println("beforeMethod 호출");
}
public void afterMethod() {
System.out.println("afterMethod 호출");
}
public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("arroundMethod 호출1");
Object obj = pjp.proceed();
System.out.println("arroundMethod 호출2");
return obj;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id='xml1' class='kr.co.softcampus.beans.TestBean'/>
<bean id='advisor1' class='kr.co.softcampus.advisor.AdvisorClass'/>
<!-- 관심사 설정 -->
<aop:config>
<aop:aspect ref='advisor1'>
<aop:pointcut id="point1" expression="execution(* method1())"/><!-- 모든 패키지의 모든 클래스의 method1을 호출하는 행위를 관심사로 설정한다 -->
<aop:before method="beforeMethod" pointcut-ref="point1"/>
<aop:after method="afterMethod" pointcut-ref="point1"/>
<aop:around method="aroundMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
</beans>
package kr.co.softcampus.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import kr.co.softcampus.beans.TestBean;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
TestBean bean1 = ctx.getBean("xml1",TestBean.class);
bean1.method1();
ctx.close();
}
}
출력값
beforeMethod 호출
arroundMethod 호출1
method1 호출
arroundMethod 호출2
afterMethod 호출