AOP어플리케이션 작성 (XML)이란?
Advice 클래스 작성에 대하여 이해
AOP 설정 및 테스트
PointCut 문법
SpringAOP의 구현방식
xml방식
@Aspect(어노테이션)방식
xml구현방식 절차
- Advice(부가기능)클래스 작성한다.
- xml파일에 <aop:config>를 이용해서 애스펙트를 설정한다.
(aspect애스펙트란? 어드바이스+포인트컷)
Advice의 종류
- Around어드바이스
타겟(핵심로직)메서드가 호출되기 이전(before) 시점과 이후(after) 시점에
모두 처리해야할 필요가 있는 부가기능을 정의한다.
Joinpoint 앞과 뒤에서 실행되는 Advice 이다.
- Before어드바이스
타겟(핵심로직)메서드가 호출되기 이전(before) 시점에 처리해야 할
필요가 있는 부가기능을 정의한다.
Joinpoint 앞에서 실행되는 Advice 이다.
- After어드바이스
타겟(핵심로직)메서드가 정상적으로 실행된 이후(After)시점에 처리해야 할
필요가 있는 부가기능을 정의한다.
Joinpoint 메서드호출이 정상적으로 종료된뒤 실행되는Advice 이다.
- AfterThrowing어드바이스
타겟(핵심로직)메서드가 예외를 발생된 이후(after)시점에 처리해야할 필요가 있는 부가기능을 정의한다.
예외가 던져질 때 실행되는 Advice 이다.
Advice클래스의 정보
클래스명 : PerformanceTraceAdvice.java
클래스 기능 : 이 어드바이스는 타겟 객체의 메서드 실행시간을 계산해서 출력해주는 부가기능을 제공한다.
advice유형 : Around 어드바이스
(타겟 객체의 메서드 실행 전, 후의 시간을 측정하여 계산하면 타겟객체의 메서드 실행시간을 알 수 있다.)
구현 메서드명:trace(ProceedingJoinPoint joinPoint)
JoinPoint인터페이스
- JoinPoint는 SpringAOP혹은 AspectJ에서 AOP가 적용되는 지점을 뜻한다.
- 해당지점을 AspectJ에서 JoinPoin라는 인터페이스로 나타낸다.
- JoinPoint에서 제공하는 메소드
getArgs |
메소드 아큐먼트를 반환(오브젝트배열) |
getThis |
프록시 객체를 반환 |
getTarget |
대상 객체를 반환(오브젝트형태) |
getSignature |
어드바이즈되는 메서드의 설명을 반환(메소드명,리턴타입) |
toString |
어드바이즈되는 메서드의 설명을 출력 |
- 모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언해야한다.
- Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPorint를 필수적으로 선언해야한다.
JoinPoint(인터페이스)before,after사용한다.
↑
proccedingJoinPoint(상속받은 인터페이스) around사용한다.
proccedingJoinPoint 인터페이스란?
- around 조인포인트에서 사용한다.
- 계속해서 진행하다를 뜻이다.
- 타겟객체 앞뒤에서 모두사용할떄 사용한다.
- procced메서드 : 요청을 가로채 실행하고 타겟을 실행시킨다.
(아규먼트가 있는 메서드와 없는메서드가있음)
PerformanceTraceAdvice.class
bean설정방법
AOP설정
Advice를 정의하는 태그
<aop:before>
- 메서드 실행 전에 적요오디는 어드바이스를 정의한다.
<aop:after-returning>
- 메서드가 정상적으로 실행된 후에 적요오디는 어드바이스를 정의한다.
<aop:after-throwing>
- 메서드가 예외를 발생시킬 때 적용되는 어드바이스를 정의한다.
<aop:after>
- 메서드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의한다.
try-catch-finally에서 finally블록과 비슷하다.
<aop:aroung>
- 메서드 호출 이전, 이후, 예외발생 등 모든 시점에 적용가능한 어드바이스를 정의한다.
PointCut표현식
예제
execution([접근제한제 패턴] 타입패턴 [타입패턴.]이름패턴 (타입패턴|"..",...)
execution(* hello(..))
- hello라는 이름을 가진 메서드를 선정하는 것이다.
파라미터는 모든종류를 다허용한다.
execution(* hello())
- 위와동일하나 파라미터가없는것이다.
execution(* myspring.user.service.UserServiceImpl.*(..))
- myspring.user.service.UserServiceImpl 클래스를 직접 지정하여
이 클래스가 가진 모든 메서드를 선택한다.
execution(* myspring.user.service.*.*(..))
- myspring.user.service 패키지의 모든 클래스에 적용한다.
하지만 서브패키지의 클래스는 포함되지 않는다.
execution(* myspring.user.service..*.*(..))
- myspring.user.service 패키지의 모든 클래스에 적용된다.
그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함한다.
execution(* *..Target.*(..))
- 패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용한다.
다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의해야한다.
'개발 소발 > 개발 Spring' 카테고리의 다른 글
MyBatis란? (0) | 2017.11.27 |
---|---|
AOP어플리케이션 작성 (annotation)이란? (0) | 2017.11.27 |
AOP란? (0) | 2017.11.24 |
jdbc환경설정(mysql)이란? (0) | 2017.11.21 |
데이터엑세스개념(jdbc,springjdbc)이란? (0) | 2017.11.21 |