AOP를 구현하는 3가지 방법
1) POJO Class를 이용한 AOP구현 (전통적인 방식)
2) 스프링 API를 이용한 AOP구현 (<aop> 엘리먼트 이용)
3) 어노테이션을 이용한 AOP 구현 (@Aspect으로 직접 구현)
AOP라는 엘리먼트를 이용하여 설정하는 방법
1) 설정파일
설정파일 생성시 스키마에서 aop를 선택하자.
2) pom.xml에 아래를 추가해준다.
AOP 엘리먼트 모듈 다운로드를 위한 부분이다.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
Maven Deoendencies에 aspectjweaver가 설치된다.
3) 메시지빈 인터페이스 : 기존 예제와 동일
package spring.aop.ch03;
public interface MessageBean {
public void sayHello();
}
4) 메시지빈 클래스 : 기존 예제와 동일
5) AOP 기능을 수행하기 위한 클래스: 공통모듈을 정의
어떤 포인트컷을 적용할지는 AOP 엘리먼트에서 설정해주면 되므로 여기에선 별도의 인터페이스 구현 필요 없음.
package spring.aop.ch03;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.util.StopWatch;
public class LoggingTest {
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { // 공통기능을 수행할 임의의 메서드
// 입력으로 ProceedingJoinPoint 타입의 참조변수를 전달받게끔 메서드를 정의해야만 한다.
String methodName = joinPoint.getSignature().getName();
// 현재 인터셉트한 메서드의 이름을 가져옴
StopWatch sw = new StopWatch(); // 스프링에서 제공하는 타이머 기능의 클래스
sw.start();
System.out.println("[메서드 추적 로그 정보]: "+methodName+" 메서드를 호출합니다.");
Object rtnObj = joinPoint.proceed(); // proceed는 인터셉트를 수행하러 가라는 오브젝트 타입의 메서드
sw.stop(); // 위 메서드가 끝나면 StopWatch도 끝내기
System.out.println("[메서드 추적 로그 정보]: "+methodName+" 메서드를 호출을 완료합니다.");
System.out.println("[메서드 실행 시간]: "+sw.getTotalTimeMillis()/1000+"초");
return null;
}
}
6) AOP 엘리먼트를 이용한 설정 파일
<?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: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/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
<!-- 공통 관심이 되는 대상객체(클래스) name과 greeting을 전달받는다. -->
<bean id="target" class="spring.aop.ch03.MessageBeanImpl">
<property name="name" value="홍길동" />
<property name="greeting" value="안녕하십니까, " />
</bean>
<!-- 공통 관심을 적용한 클래스 -->
<bean id="aspect" class="spring.aop.ch03.LoggingTest" />
<aop:config>
<aop:aspect id="aspectTest" ref="aspect"> <!-- 공통모듈로 사용할 객체를 정의 -->
<!-- around pointCut 방식으로 인터셉트 -->
<aop:around method="logAround" pointcut-ref="point" /> <!-- 어드바이스를 수행할 메서드를 스프링에 알려줌 -->
<!-- 언제 인터셉트할 지 스프링에 알려줘야 함 -->
<aop:pointcut expression="execution(* sayHello())" id="point" /> <!-- execution() 명시자 이용 -->
<!-- 어드바이저에서 필요한 사항: 포인트컷(pointcut), advice(aspect로) -->
</aop:aspect>
</aop:config>
</beans>
7) 실행 클래스
package spring.aop.ch03;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloAop {
public static void main(String[] args) {
AbstractApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext3.xml");
context.registerShutdownHook();
MessageBean msgBean =
context.getBean("target", MessageBean.class);
msgBean.sayHello();
context.close();
}
}
[메서드 추적 로그 정보]: sayHello 메서드를 호출합니다.
안녕하십니까, , 홍길동!
[메서드 추적 로그 정보]: sayHello 메서드를 호출을 완료합니다.
[메서드 실행 시간]: 5초
' Spring Framework' 카테고리의 다른 글
Spring 과 DB (0) | 2016.04.04 |
---|---|
@Aspect 어노테이션을 이용한 AOP (0) | 2016.04.01 |
AOP 용어 및 개념 이해를 위한 예제 (0) | 2016.04.01 |
AOP 실습 (0) | 2016.03.31 |
스프링에서 어노테이션을 이용한 MVC패턴 구성 (0) | 2016.03.31 |