설정 방법은 크게 두가지가 있다.
첫째는 java5의 annotation 을 이용한 방법과
두번째는 spring XML schema-based 방법이다.
또한 기존(spring 1.2.x)의 방식도 가능하다.(proxy bean 비슷한 설정)
관련문서에는 가능하다면 annotation 방법을 사용하길 권장하지만, java5가 아니라면
schema-based 최선택이라 한다.
그럼,
spring2.0에서 aop 사용이 기존 1.2.x 버젼에서 사용한것과 어떻게 변했는지 알아보자.
아래 예제는 schema-based로 하였다.(이유: jdk1.4에서 되기 때문 ㅡㅡ; )
[진행순서]
1. aspect classs 작성
2. applicationContext.xml 설정
3. 테스트 log
로 간단한 예제를 보자.
1. aspect class 작성
일반적인 POJO로 작성 할 수 있다. 기존엔 각족 interface를 구현해야만 하였다.
물론 그 방법도 가능하므로 이후에 그방법으로 한번 간단히 테스트 해 보자
public class spring2BeforeAdvice { public void getOut() { System.out.println("이전에 출력 합니다.....(before)"); } }
2. applicationContext.xml 설정
기존 beans tag 보다 복잡한 schema rul이 있다. 처음에 1.2.x버젼에서
복사하여 쓸때 이 설정 때문에 오류가 난다. 정확히 해주어야만 새로 추가된 tag를 쓸수 있다.
<?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" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <description>test</description>
<!-- spring 2.0 AOP typed 되지 않은 advice --> <bean id="spring2BeforeAdvice" class="net.domain.user.advisor.spring2BeforeAdvice"/> <aop:config> <aop:pointcut id="getUser" expression="execution(* net.domain.user.service.*.*(..))"/> <aop:aspect id="tester" ref="spring2BeforeAdvice"> <aop:before pointcut-ref="getUser" method="getOut" /> </aop:aspect> </aop:config> <!-- spring 2.0 AOP typed 된 advice -->
</beans>
1.2.x에서는 못보던 tag인 aop 가 있다.
설명 하자면 spring2BeforeAdvice bean을 설정하고, 이걸 aspect으로 설정한다.
pointcut은 expression 조건에 맞는 모듈(서비스)에 설정한다.
(해당 조건에 맞는 서비스 호출시 aspect으로 등록된 메소드와 결합(?)된다.)
advice는 before(다른 typed된 advice도 비슷하다)를 썼고, 해당 메소드인 getOut과 메칭된다.
중요한던 pointcut이 advice에 독립적이라는것이다. 충분히 다른 advice에서 이 pointcut을
사용할수 있다.
expression의 표현 방법은 일반적인 aspectJ의 문법이라고 한다.
그리 어렵지 않게 aspectJ를 익힐수 있다고 하는데.... 해보지 않아서 어렵게 느껴진다. ㅡㅡ;
3. 테스트 log
해당 소스를 빌드 하고 테스트 한 결과
정보: Jk running ID=0 time=0/94 config=E:\Server\Tomcat5.0\conf\jk2.properties 2006. 10. 17. 오후 1:00:51 org.apache.catalina.startup.Catalina start 정보: Server startup in 7375 ms DEBUG - UserController.list(34) | UserController.list()... 이전에 출력 합니다.....(before) 이전에 출력 합니다.....(before) DEBUG - UserController.list(41) | list 카운트 : 1
음.. 잘 나온다.... 근데 왜 두번 찍히지????
pointcut 정책을 잘 세워야 한다.
예제 같은 경우에 execution(* net.domain.user.service.*.*(..)) 라고 설정 했는데
이는 net.domain.user.service에 있는 패키지의 모든 클래스에 대해서
모든 형식의 모든 arg를 다 허용하므로 두번 적용된것 같다.
4. 참조
http://static.springframework.org/spring/docs/2.0.x/reference/index.html
http://openframework.or.kr/framework_reference/spring/ver2.x/html/index.html by 이동국
5. ps
사실 참조문서를 보면서 쉽게 이해는 갔지만, 막상 따라하니 여기 저기서 오류가 났다.
이유는 내가 기존에 1.2.x로 간단히 demo를 만들어서 테스트 했는데, 그 때문에
xml 설정파일의 schema가 기존 .1.2.x기준으로 되어 있었기 때문에 그런것 같다.
관련해서 spring 포럼에도 질문들이 있는것 보니..
첨하는 사람들중에 나 같은 사람들이 좀 있었나 보다.
|