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) 메시지빈 클래스 : 기존 예제와 동일


package spring.aop.ch03;

public class MessageBeanImpl implements MessageBean{
private String name;
private String greeting;
public void setName(String name){
this.name = name;
}
public void setGreeting(String greeting){
this.greeting = greeting;
}
@Override
public void sayHello() {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(greeting+", "+name+"!");
}
}





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
Posted by netyhobby
,