spring로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

spring로 검색한 결과
등록일:2008-03-16 16:15:44
작성자:
제목:Spring2.0 의 새로워진 AOP 설정 예제


설정 방법은 크게 두가지가 있다.

첫째는 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 포럼에도 질문들이 있는것 보니..

첨하는 사람들중에 나 같은 사람들이 좀 있었나 보다.