본문 바로가기

스프링

[spring] aop_포인트컷확장_빈후처리기_6

1.     Com.springsource.javax.activation : Spring java-mail

2.     Com.springsource.javax.mail : Spring java-mail

3.     Com.springsource.org.aopalliance : Spring ProxyFactoryBean

4.     Com.springsource.junit : junit

5.     Commons-logging : Spring-context가 사용

6.     Mail : java-mail

7.     Mockito : 목 프레임워크 중 Mockito

8.     Mysql-connector : Mysql JDBC

9.     Org.springframework.context.support : Spring java-mail

10.   Spring-aop : 스프링 기능 자체의 aop, Spring ProxyFactoryBean

11.   Spring-bean : 스프링 빈을 활용하는 경우 필요. 스프링의 XML 설정파일과 자바 애노테이션을 파싱 하는데 필요한 클래스 포함

12.   Spring-context : 스프링 코어를 확장한 많은 클래스가 들어 있는데 모든 클래스는 EJB, JNDI(Java Naming Directory Interface), JMX용 클래스와 연동하는데 applicationcontext기능을 사용해야 하며 스프링 리모팅 클래스, 동적 스크립팅 언어(제이루비, 그루비등)와 연동하는 클래스, 빈 유효성검증(JSR-303) API, 스케줄링을 하는 클래스도 포함되어 있다.

13.   Spring-core : 모든 스프링 모듈에서 필요한 모듈. 다른 스프링 모듈에서 사용하는 공통 클래스가 포함됨.

14.   Spring-dao : EmpltyResultDataAccessException 등 사용을 위한 jar

15.   Spring-expression : 스프링 표현언어(SpEL) 지원 클래스 포함.

16.   Spring-jdbc : 스프링이 지원하는 jdbc.

17.   Spring-test.jar

-       @RunWith : Junit 프레임워크의 테스트 실행방법을 확장시 사용.

-       SpringJUnit4ClassRunner : 어플리케이션컨텍스트를 만들고 관리하는 확장 클래스

-       @ContextConfiguration(경로) : 자동으로 만들어줄 어플리케이션 컨텍스트 설정파일

18.   Spring-tx : DuplicateKeyException.class 파일 존재 및 스프링 트랜잭션

 

 

1.     DefaultAdvisorProxyCreator 빈 후처리기가 등록되어 있으면, 스프링은 빈 오브젝트를 만들 때마다 후처리기에 빈을 보낸다.

2.     빈으로 등록된 어드바이저 내의 포인트컷을 이용해 전달받은 빈이 프록시 적용 대상인지 확인.

3.     프록시 적용 대상이면 내장된 프록시 생성기에 현재 빈에 대한 프록시를 만들게 하고, 만들어진 프록시에 어드바이저를 연결해준다.

4.     프록시가 생성되면 원래 컨테이너가 전달해준 빈 오브젝트 대신 프록시 오브젝트를 컨테이너에게 돌려주고 프록시를 사용한다.

*   즉, 빈 오브젝트가 만들어지고 난 후에, 빈 오브젝트를 다시 가공해줌

 

 

포인트컷은 클래스 필터와 메소드 매처 두가지 기능을 가지고 있음.

 

16. 현재 ProxyFactoryBean(userService)의 문제점 : target이 늘어남에 따라 ProxyFactory 설정이 늘어나야한다. 또한, 어드바이저를 동일하게 사용하는 target이 늘어남에도 같은 설정이 중복으로 들어가게 된다.

 

JDK 다이내믹 프록시의 부가기능 구현

 

 

 

 

포인트컷 확장.

1)    프록시를 적용할 클래스인지 판단하는 ClassFilter

2)    어드바이스를 적용할 메소드인지 확인

 

 

77. NameMatchMethodPointcut : 클래스 필터기능이 있긴하나, 있으나 마나 한 필터가 들어 있다.

78. 로컬클래스로 정의 선언된 영역 내부에서만 사용하기 위함

> 원래 모든 클래스를 다 받아주는 클래스 필터를 리턴하던 getClassFilter()를 오버라이드 해서 HelloT로 시작하는 클래스만 선정해주는 필터 생성.

92~96. 모든 기존에 있던 HelloTarget이라는 클래스를 그대로 상속한 것이라 메소드 내용 동일

 

 

레벨 다음레벨 셋팅은 레벨에게 위임 > 서비스의 if가 줄어듬

 

User정보 셋팅은 User에게 위임 > 서비스의 if가 줄어듬

 

 

JDBC,Hibernate,JDO,JPA 등의 커넥션 API의 확장에 열려 있기 위한 인터페이스

 

 

JDBC DAO 구현

 

 

메일 테스트 스텁

 

프록시 타깃을 위한 인터페이스(데코레이터패턴 혹은 다이내믹 프록시)

 

 

타깃 구현. 트랜잭션 프록시 적용이 필요한 upgradeLevel

 

 

 

 

 

 

34. DefaultAdvisorAutoProxyCreator : 빈 후처리기. 어드바이저를 이용한 자동 프록시 생성기.빈 후처리기가 빈으로 등록되어 있으면 빈 오브젝트가 생성될 때마다 빈 후처리기에 보내서 후처리 작업을 요청. 자동으로 빈 오브젝트를 프록시 빈으로 바꿔줌. 프록시 포장 뿐만 아닌 오브젝트 자체를 바꿔치기 해버리기도 가능.

35. $ : 스태틱 멤버 클래스를 지정할 때 사용. 특정 테스트 클래스에서만 사용되는 클래스는 스태틱 멤버 클래스로 정의하는 것이 편리하다.

35. parent : 다른 빈 설정의 내용을 상속받을 수 있다. , userService 빈의 모든 설정을 그대로 가져와서 사용하겠다는 의미.(클래스, 프로퍼티 설정도 모두 상속 받는다.) 따라서 별도로 userDaomailSender 프로퍼티를 지정해줄 필요가 없다.

 

 

이렇게 빈 후처리기를 사용하면 일일이 ProxyFactoryBean을 등록하지 않아도 타깃 오브젝트에 자동으로 프록시가 적용되게 할 수 있다.

 

33. UserService 같은 타입의 빈이 두개 존재하기에 필드 이름

 

 

스프링 컨텍스트 빈 설정은 변경하지 않아도 되므로 @DirtiesContext 제거. DI 설정을 그대로 따르면 됨. UserServiceTestImplbean으로 등록되었으므로

 

130. TestUserServiceImple : 포인트컷의 클래스 필터에 선정되도록 이름 변경. 이래서 처음부터 이름을 잘 지어야함.

 

 

DefaultAdvisorAutoProxyCreator에 의해 testUserSerivce빈이 프록시로 바꿔치기 된 사실을 충분히 알 수 있다.

 

혹은 일부러 필터를 틀리게하여 트랜잭션이 적용안되어 실패로 프록시가 생성되었는지 확인가능.