2019. 7. 17. 16:03ㆍSpring
------------------AOP(Aspect Oriented Programming) 공통기능--------------
AOP
- 관점 지향 프로그래밍
- 같은 컨테이너 안에서만 사용이 가능하다
- 트랜잭션처리 공통기능은 이미 구현되어있다.
* interface flatform TranjactionManager
- 핵심 기능을 가지고있는 메소드를 JoinPoint라고 한다.
- JoinPoint 를 가지고 있는것을 Target이라 한다.
- 적용규칙을 PointCut, 공통기능을 Advice, 두 세트를 Aspect라고 한다.
관점지향 프로그램(Aspect Oriented Programming)
- 핵심로직이 구현된 메소드에 포함된 공통기능 코드를 제거할 수 있다.
- 공통기능을 별도의 클래스에 정의하고,
AOP 기능을 지원하는 컨테이너(우리는 Spring Container)를 활용해서
핵심기능이 실행될 때 공총기능이 같이 실행되도록 하는 것이다.
- 스프링 컨테이너는 AOP의 구현체다.
- 장점
- 코드의 중복이 제고된다.
* 핵심로직 코드마다 포함된 공통기능 코드가 별도의
클래스에 딱 한번 구현되기 때문이다.
- 핵심 로직의 유지보수가 쉬워진다.
- 공통기능의 활성화/비활성화가 가능하다.
- 개발자는 업무로직의 구현에만 집중할 수 있다.
* 프로젝트에서 자주 활용되는 공총기능(Advice)는 프레임워크에서 대부분 제공한다.
관점지향 프로그래밍의 주요 개념
- Target
- 공통기능이 적용될 핵심로직 메소드가 구현된 객체
- JoinPont
- 공통기능이 적용될 대상(핵심로직이 구현된 메소드)
- spring AOP에서는 핵심로직이 구현된 메소드의 실행시점
- Advice(what)
- 핵심로직과 함께 실행할 공통기능
- Pointcut(When + Where)
- 공통기능 적용규칙
- When : @Before -> 실행전, @After -> 실행후, @AfterReturning -> 정상종료후,
@AfterThrowing -> 에러발생시, @Around -> 실행전/후
- Where : AspectJ 표현식으로 표현한다.
"within(x.y.z.클래스명)"
"execution(반환타입 x.y.z.클래스명.메소드명())"
- Aspect(Advice + Pointcut)
- AOP 적용의 필수 단위
- 공총기능과 적용규칙을 묶어놓은 것
- Weabing
- 핵심로직이 구현된 대상 메소드(JoinPoint)에 Aspect가 적용되는 것
Spring의 AOP
1. ajpectj 라이브러리 의존성을 추가한다.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
2. Aspect를 정의한다.
@Aspect
public class MyAspect {
}
3. 공통기능과 적용규칙을 정의한다.
@Aspect
public class MyAspect {
@Before("within(x.y.z.클래스명)")
public void logging() {
// 공통기능 구현
}
}
4. 공통기능이 구현된 클래스를 스프링의 빈으로 등록한다.
<bean class="com.sample.aop.advice.MyAspect" />
5. AOP관련 @어노테이션을 분석하고, 적절한 처리를 수행하는 클래스를
스프링의 빈으로 등록해서 AOP관련 동작이 수행되도록한다.
1. InternalAutoProxyCreater가 스프링의 비능로 등록
2. 스프링의 비능로 등록된 것 중에서 @Aspect가 부착된 빈의 적용규칙을 분석한다.
3. 적용대상이 되는 빈의 대리인 객체(Proxy)를 생성한다.
4. 실제 조립되거나 실행되는 것은 대리인 객체다.
※. mvc-context.xml
※. root-context.xml에 설정 예시(Service라 root에 한것이다.)
어노테이션 등록과 같은 context에 설정을 해야한다.
JoinPoint
- 공통기능이 적용되는 대상에 대한 정보를 포함하고 있는 객체
- 공통기능이 구현된 메소드의 배개변수로 선언하면, 공통기능 수행 시
대상 메소드에 대한 정보가 포함된 객체를 전달받을 수 있다.
- 주요 메소드
Object getTarget() - 공통기능이 적용되는 대상 객체를 반환한다.
Signature getSignature() - 공통기능이 적용되는 대상 메소드를 반환한다.
Object[] getArgs() - 공통기능이 적용되는 대상 메소드가 전달받는 매개변수값을 반환한다.
사용예시---------------------------------------------