web/Spring

Aop 설명과 설정방법

반응형

AOP 설명

AOP는 횡단 관점으로서 어느 메서드가 실행되면 실행되는 과정 
특정 메서드의 예외가 실행되면 실행되야 하는 것, return이 호출되면 실행되야하는 것 등을 지정을 해놓을 수 있다.

자바의 프록시 기능과 유사하다.

Aspect는 이런 AOP를 수행할 객체를 이야기하고,

Pointcut은 어느 시점에 동작을 하게 할것인지
예를 들어 어느 이름을 가진 메서드가 실행될 때 실행해라.
어는 패키지 안에 내용이 들어가 있는 클래스가 호출될 때 실행해라 등 지정할 수 있다.

Around, Before, After 애노테이션을 이용하여 
특정 시점에 지정된 Pointcut을 실행 시킬 수 있다.


설정방법


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
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.aopEx2;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
 
@Aspect //Aspect 역할을 할 클래스라고 명시해줌
public class LogAop {
 
    //Pointcut이라고 명시된 메서드가 필요
    //@Pointcut의 속성에 핵심코드의 어느 부분까지 공통기능을 사용하겠다고 명시
    @Pointcut("within(com.aopEx2.*)")
    private void pointcutMethod(){ 
        
    }
    
    @Around("pointcutMethod()"//around가 적용될 포인트컷을 명시 : pointcutMethod()
    public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
        
        //공통 기능이 적용되는 메서드가 어떤 메서드인지 출력하기 위해 메서드명을 얻어옴
        String signatureStr = joinpoint.getSignature().toShortString();
        System.out.println(signatureStr + "시작"); //메서드 실행
        
        //공통기능
        System.out.println("핵심 기능 전에 실행 할 공통 기능입니다. "+System.currentTimeMillis());
        
        try {
            Object obj = joinpoint.proceed(); //핵심 기능 실행
            return obj;
        } finally {
            //공통기능
            System.out.println("핵심 기능 후에 실행 할 공통 기능입니다. "+System.currentTimeMillis());
            
            System.out.println(signatureStr + "끝");
        }
    }
    
    @Before("within(com.aopEx2.*)")
    public void beforeMethod(){
        System.out.println("beforeMethod()실행");
    }
}
cs



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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
 
<aop:aspectj-autoproxy/> <!-- @Aspect어노테이션이 있는 클래스를 자동으로 찾아서 설정해줌 -->
<bean id="logAop" class="com.aopEx2.LogAop" />
 
<!-- AOP설정 -->
<!-- <aop:config>
    aspect id는 logger이고, logAop를 참조함
    <aop:aspect id="logger" ref="logAop">
        pointcut(핵심 기능)의 id는 publicM이고, com.aopEx패키지에 있는 모든 클래스에 공통 기능을 적용
        <aop:pointcut id="publicM" expression="within(com.aopEx.*)"/>
        loggerAop()라는 기능을 publicM라는 pointcut에 적용
        <aop:around pointcut-ref="publicM" method="loggerAop"/>
    </aop:aspect>
</aop:config> -->
 
 
<bean id="myCat" class="com.aopEx2.Cats">
    <property name="name" value="호랑이"/>
    <property name="age" value="1"/>
    <property name="color" value="yellow"/>
</bean>
 
</beans>
cs



<aop:aspectj-autoporxy/>를 명시해두면 @Aspect어노테이션이 있는 클래스를 찾아서 자동으로 aspect로 만들어줍니다.




반응형