본문 바로가기

스프링

[spring] aop정의 및 포인트컷 표현식_7

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.org.aspectj.tools : AspectJExpressionPointcut 포인트컷 표현식 지원

5.     Com.springsource.junit : junit

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

7.     Mail : java-mail

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

9.     Mysql-connector : Mysql JDBC

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

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

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

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

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

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

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

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

18.   Spring-test.jar

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

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

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

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

 

 

 

데코레이터패턴 혹은 다이내믹 프록시 처리 서비스를 위한 인터페이스

 

 

Target 클래스는 TargetInterface 인터페이스에 정의된 메소드를 구현한 4개의 메소드와 마지막 메소드는 Target 클래스에서 정의한 것(포인트컷 표현식을 이용해 원하는 메소드만 선정하는 방법을 알아보기 위함)

 

 

테스트용 추가 클래스

 

 

* 위는 포인트컷으로 정한 클래스와 메서드 명이 일치하는 지 검증.

12. getMethod : 메소드 풀 시그니처(존재를 남기고 증명함) (2번째 아래 스샷 참조)

13. AspectJExpressionPointcut : 포인트컷 표현식을 지원하는 포인트컷 적용시 사용. 사실 스프링이 사용하는 포인트컷 표현식은 AspectJ라는 유명한 프레임워크에서 제공하는 것을 가져와 일부 문법을 확장해서 사용하는 것.(AspectJ 포인트컷 표현식이라고도 함.)

> NameMatchClassMethodPointcut : 클래스와 메소드 이름의 패턴 비교

14. execution : 포인트컷 표현식 대표적인 지시자(아래 스샷 참조)

26. Bean.class의 메소드에 대해 테스트해보면 당연히 클래스부터 맞지 않으므로 포인트컷 적용결과는 false.

 

사용방법

AspectJExpressionPointcut 클래스의 오브젝트 생성

포인트컷 표현식 expression 프로퍼티에 넣어주면 사용준비 완료.

>  표현식을 execution() 안에 넣어서 작성. execution()은 메소드를 실행에 대한 포인트컷이라는 의미

 

 

1.     [ ] : 옵션항목이기 때문에 생략이 가능

2.     | : OR 조건

 

12라인을 실행하면 Method 오브젝트가 제공하는 풀 시그니처를 볼 수 있다.

콘솔

Public : 접근제한자. 포인트컷 표현식에서는 생략이 가능.

Int : 리턴 값의 타입을 나타내는 패턴. * 을 써서 모든 타입을 다 선택해도됨. 생략불가.

Spring.~.Target : 클래스 타입 패턴. 생략 가능. 패키지 이름과 클래스 또는 인터페이스 이름에 * 사용 가능. ‘..’를 사용하면 한 번에 여러 개의 패키지를 선택할 수 있다.

Minus : 메소드 이름 패턴. 필수항목. 모든 메소드를 다 선택이면 *

(int, int) : 메소드 파라미터 타입 패턴. 타입을 ‘,’로 구분하면서 순서대로 적으면 됨. 파라미터가 없는 경우는 ( ) 로 적음. 파라미터 타입과 개수에 상관없이 모두 다 허용하는 패턴으로 만드려면 ‘..’을 넣으면 된다. ‘…’을 이용해서 뒷부분의 파라미터 조건만 생략할 수 있다. 필수 항목.

>  Throws java.~.RuntimeException : 예외 이름에 대한 타입 패턴. 생략 가능

 

필수가 아닌 항목을 제거하면 위와같이 간단하게 생성 가능.

 

 

37. boolean… : varargs 가변인자. 컴파일시 [ ]로 변환해줌. 47~49라인의 true,false 들을 배열에 담을 필요가 없어짐.

47. 리턴타입, 파라미터, 메소드 이름에 관계없이 모든 메소드 조건을 다 허용하는 표현식

48. 리턴타입, 파라미터의 종류, 개수에 관계없이 hello라는 메소드 이름을 가진 메소드 선정

49. 리턴타입 관계없이 hello라는 메소드, 파라미터는 없는 메소드 선정.

 

 

16번 부연설명

첫번째 * : 리턴타입

두번째 * : 패키지를 표현할 때 임의의 패키지 1계층

>   ..       : 패키지를 표현할 때 임의의 패키지 0개 이상 계층을 의미

 

 

레벨의 역할은 레벨에게 위임

 

 

User의 역할은 User에게 위임

 

 

JDBC, JPA,Hibernate, JDO 등 여러 DataAccessAPI를 사용하기 위한 인터페이스

 

JDBC DAO 구현

 

 

메일서버 테스트스텁

 

 

데코레이터패턴 혹은 프록시를 위한 서비스 인터페이스

 

 

타겟 구현 : 타깃은 부가기능을 부여할 대상. 핵심기능을 담은 클래스 일 수도 있지만 경우에 따라서는 다른 부가기능을 제공하는 프록시 오브젝트(데코레이터 패턴)일 수도 있다.

* 조인포인트 : 어드바이스가 적용될 수 있는 위치. 스프링의 프록시 AOP에서 조인 포인트는 메소드 실행 단계뿐이다. 따라서 타깃 오브젝트가 구현한 인터페이스의 모든 메소드는 조인 포인트가 된다.

 

 

어드바이스 부가기능 구현. 타깃을 안넣어도 되는 스프링참조.

어드바이스 : 타깃에게 제공할 부가기능을 담은 모듈. MethodInterceptor처럼 메소드 호출 과정에 전반적으로 참여하는 것도 있지만, 예외가 발생했을 때만 동작하는 어드바이스처럼 메소드 호출 과정의 일부에서만 동작하는 어드바이스도 있다.

 

 

30. AspectJExpressionPointcut : 포인트컷 표현식으로 사랑받는 Pointcut.

* 포인트컷 : 어드바이스를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈. 스프링 AOP의 조인 포인트는 메소드의 실행이므로 스프링의 포인트컷 표현식은 메소드의 실행이라는 의미인 execution으로 시작하고, 메소드 시그니처를 비교하는 방법을 주로 이용. 메소드는 클래스 안에 존재하는 것이기 때문에 메소드 선정이란 결국 클래스를 선정하고 그 안의 메소드를 선정하는 과정을 거침.

31. *ServiceImpl *Service로 적용해도 TestUserServiceImpl, UserServiceImpl 모두 적용된다. 타입이므로 상위 인터페이스가 Service이므로

33. 어드바이저 : 어떤 부가기능(어드바이스)을 어디에(포인트컷) 전달할 것인가를 알고 있는 AOP의 가장 기본이 되는 모듈. 스프링은 DefaultAdvisorAutoProxyCreator 자동 프록시 생성기가 어드바이저를 AOP 작업의 정보로 활용함. 어드바이저는 스프링 AOP에서만 사용되는 특별한 용어이고, 일반적인 AOP에서는 사용되지 않는다.

33. 애스펙트 : AOP의 기본 모듈. 한 개 또는 그 이상의 포인트컷과 어드바이스의 조합으로 만들어지며, 싱글톤 형태의 오브젝트로 존재한다. 스프링의 어드바이저는 아주 단순한 애스펙트라고 볼 수도 있다.

37. DefaultAdvisorAutoProxyCreator : 빈 후처리기. 이것이 빈으로 등록되어 있으면, 설정파일에 있는 모든 빈은 후처리기를 통해 포인트컷을 거쳐 적합한 것들은 프록시 혹은 새로운 오브젝트로 재탄생한다. 어드바이스에 의해.

 

스프링의 프록시 방식 AOP를 적용하려면 최소한 네 가지 빈을 등록해야 한다. 여태 사용하던 UserDaoUserSerivce 빈과는 성격이 다르다. 어플리케이션의 일부 기능을 담고 있는 형태가 아닌, 스프링 컨테이너에 의해 자동으로 인식돼서 특별한 작업을 위해 사용된다.

자동 프록시 생성기 : DefaultAdvisorAutoProxyCreator. 애플리케이션 컨텍스트가 빈 오브젝트를 생성하는 과정에 빈 후처리기로 참여한다. 빈으로 등록된 어드바이저를 이용해서 프록시를 자동으로 생성하는 기능을 담당한다.

어드바이스 : 부가기능을 구현한 클래스를 빈으로 등록. AOP 관련 빈 중에서 유일하게 직접 구현한 클래스를 사용한다.

포인트컷 : 스프링의 AspectJExpressionPointcut을 빈으로 등록하고 expression 프로퍼티에 포인트컷 표현식을 넣어주면 된다.

>  어드바이저 : DefaultPointcutAdvisor 클래스를 빈으로 등록해서 사용한다. 어드바이스와 포인트컷을 프로퍼티에 참조하는 것 외에는 기능은 없다. 자동 프록시 생성기에 의해 자동 검색되어 사용된다.

 

 

 

 

 

빈후처리기에 의해 생성된 프록시에 의해 트랜잭션 처리확인

 

161~174. 일일이 목오브젝트, 스텁 오브젝트를 만들기 힘드므로 목 프레임워크를 이용한 테스트

175~179. 프록시 오브젝트인지 검증

 

 

AOP(Aspect Oriented Programming) 정의?

Aspect : 그 자체로 애플리케이션의 핵심기능(타깃)을 담고 있지는 않지만, 애플리케이션을 구성하는 중요한 한 가지 요소이고, 핵심기능에 부가되어 의미를 갖는 특별한 모듈. 부가기능(어드바이스)와 어드바이스를 어디에 적용할지를 결정하는 포인트컷을 함께 가지고 있다. 지금 위처럼 사용하고 있는 어드바이저는 아주 단순한 형태의 애스펙트라고 볼 수 있다.

OOP를 돕는 보조적인 기술. 부가기능이 핵심기능 안으로 침투해서 들어가면, 핵심기능 설계에 객체지향 기술의 가치를 온전히 부여하기 힘들어짐.

관점 지향 프로그래밍

>  스프링은 다이내믹 프록시 다이내믹 프록시 방식을 사용하지만, 가장 강력한 AOP 프레임워크로 꼽히는 AspectJ는 프록시를 사용하지 않고, 스프링과 같은 DI컨테이너의 도움이 필요없으며, 클래스가 JVM에 로딩되는 시점을 가로채 바이트코드를 조작하는 방법을 사용한다. 때문에 필드 값 조작, 스태틱 초기화 등의 다양한 작업이 가능하다. 하지만, 바이트코드 조작을 위해 JVM 실행 옵션을 변경하거나, 별도의 바이트코드 컴파일러를 사용하거나, 특별한 클래스 로드를 사용하는 등의 번거로운 작업이 필요함. 따라서 일반적인 AOP 적용하는 데는 프록시 방식의 스프링 AOP로도 충분하다. 간혹 특별한 AOP 요구사항이 생겨서 스프링의 프록시 AOP 수준을 넘어서는 기능이 필요하다면, 그때는 AspectJ를 이용할 수도 있다.