달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
Spring 프레임워크를 사용함에 있어서 가장 좋은 기능중 하나가 선언적인 트랜잭션 관리를 통해 코드에 트랜잭션 관리를 위한 코드를 하나도 넣지 않아도 된다는 것입니다.
3.0에서는 Spring AOP와 @Transactional 애노테이션을 제공하여 그 기능을 사용할 수 있는데요.

Spring AOP를 사용함에 있어서 발행하는 많은 문제를 해결하기 위해서는 SpringSource Tools Suite(정확히는 Spring IDE의) 의 AOP Extension을 사용해서 시각적으로 확인하는 것이 가장 좋습니다.

@ Spring IDE AOP Extension eclipse plugin


메뉴얼을 볼때 기본 설정은 대략 아래와 같습니다.
조금 다른건 저는 Spring Bean을 인터페이스가 아닌 클래스로 사용하기 때문에 proxy-target-class속성값이 true인 점 정도죠.
그리고 expose-proxy 값을 true로 주었습니다. AOP가 적용되어야 할 메서드 두개중 한군데가 계속 적용이 되길래 테스트 코드를 돌렸더니 JUnit 에러에서 친절하게 저 옵션을 켜달라고 해서 추가했습니다.
AOP가 적용되어야 할 메서드 중 일부만 적용될 경우 테스트 코드를 돌려보시거나 저 설정을 고려해보시면 될듯 합니다.
Spring AOP Extension을 사용하면 아래처럼 설정파일에 아이콘을 pointcut이 작동함으로 시각적으로 보여줍니다.
@ Spring AOP설정


그리고 그 대상 소스에도 함께 표기가 되죠. 즉 이 두 아이콘이 표기되면 설정상에 문제가 없다는 뜻입니다.
@ 대상 코드


근데, 이렇게 하더라도 안되는 경우가 있습니다.
특히 Spring @MVC 를 사용할때인데요. 이 경우 설정파일에서 @Controller 를 컨포넌트 스캔할때 옵션을 확인해보시면 됩니다.
use-default-filters를 false로 설정하시거나, @Service, @Repository를 모두 exclude로 제외하시면 됩니다.

<context:component-scan base-package="com.naver.newsstand.service" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>






Posted by fromm0
|
[이전 블로그 백업글][2007.9.10]

AOP에 의해 처리가 되는지 체크하기 위한 로깅용 소스입니다.


AOP를 적용하기 위한 인터페이스입니다.


위 인터페이스를 구현한 클래스입니다.


다음은 Spring설정파일입니다. 파일명은 applicationContext.xml 으로 했습니다. 여기서 주의깊게 볼 부분은 부분입니다.

1. aop:before의 경우
- 메소드 실행직전에 작동
- ref=”simpleLogger” 에 의해 참조되는 빈인 example.SimpleLogger의 logTwoString 메소드를 실행
- logTwoString 메소드가 실행되는 시점은 pointcut정의에 의해 example로 시작하는 패키지내 Service라는 글자를 포함하는 클래스의 모든 메소드, 그 메소드 중에 인자를 두개 가지는 메소드가 실행시 자동으로 작동하게 됩니다.

2. aop:after-returning의 경우
- 메소드가 정상적으로 값을 반환한 뒤에 작동
- ref=”simpleLogger” 에 의해 참조되는 빈인 example.SimpleLogger의 logOneString 메소드를 실행
- logOneString 메소드가 실행되는 시점은 pointcut정의에 의해 example로 시작하는 패키지내 Service라는 글자를 포함하는 클래스의 모든 메소드가 실행시 자동으로 작동하게 됩니다.


실행을 시켜보기 위한 소스입니다. 다음처럼 실행하면 일단 concatService 아이디를 가지는 빈인 example.ConcatServiceImpl의 concat메소드가 작동하게 됩니다. 그리고 앞서 설정한 사항에 의해 각각의 AOP가 작동하게 됩니다.


결과물을 보면 다음처럼 작동하는것을 볼수 있습니다.


http://blog.interface21.com/main/2006/03/22/pojo-aspects-in-spring-20-a-simple-example/
Posted by fromm0
|