스프링의 프록시 AOP 대신 AOP 전용 프레임워크인 AspectJ의 AOP를 사용할 수 있다. 

AspectJ AOP는 스프링과 달리 프록시를 타깃 오브젝트 앞에 두지 않는다. 

대신 타깃 오브젝트 자체를 조작해서 부가기능을 직접 넣는 방식이다. 

마치 처음부터 타깃 오브젝트의 클래스에 부가기능을 가진 소스코드가 있었던 것처럼 만들어 준다. 

메소드 실행 지점만 조인 포인트로 사용할 수 있는 프록시 방식의 스프링 AOP에서는 불가능한 다양한 조인 포인트와 고급 기능을 이용할 수 있다. 

대신 별도의 빌드 과정이나 바이트코드 조작을 위한 로드타임 위버 설정과 같은 부가적인 작업(Weaving)이 필요하다.



pom.xml에 AspectJ를 설정한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- AspectJ -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${org.aspectj-version}</version>
</dependency>    
 
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${org.aspectj-version}</version>
</dependency>
 
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjtools</artifactId>
    <version>${org.aspectj-version}</version>
</dependency>
cs



root-context.xml에 aspectj를 설정해준다. 


1
2
<aop:aspectj-autoproxy/
<bean id="loggerAspect" class="com.(...).LoggerAspect" />
cs


이때, bean으로 등록 해주어야 하는데 이는 component-scan을 할때 stereo type중에 AspectJ는 없기 때문에 component-scan에 걸리지 않게 된다. 

그러므로 bean을 따로 등록 해주어야 한다.



이제 클래스를 정의해주고 설정을 해주기만 하면된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Aspect
public class LoggerAspect {
    protected Logger log = LoggerFactory.getLogger(LoggerAspect.class);
    
    @Pointcut("execution(* com..Controller.*Controller.*(..))")
    public void pointCut() {}
    
    @Before
    
    @After
    
    @Around("pointCut()")
    public Object logPrint(ProceedingJoinPoint joinPoint) throws Throwable {
        String type = joinPoint.getSignature().getDeclaringTypeName();
        String name = "";
     
        if (type.indexOf("Controller"> -1) {
            name = "Controller  \t:  ";
        }
        log.debug(name + type + "." + joinPoint.getSignature().getName() + "()");
        return joinPoint.proceed();
    }
 
}
cs



사용하고자 하는 클래스에 @Aspect를 설정한다.


@Pointcut을 사용하여 적용할 클래스 경로를 설정한다.




@Before/ @After / @Around

Pointcut이 실행될 시점을 정한다.

@Before : Pointcut실행되기 이전

@After : Pointcut실행되기 이후

@Around : 둘다




@Before/ @After / @Around시점에 해당하는 객체를 JoinPoint객체로 받아온다.


JoinPoint객체안에서 원하는 값을 뽑아와서 AOP에 필요한 항목을 검사하거나 원하는 로직을 실행시킨다.


return joinPoint.proceed();으로 joinPoint객체를 리턴시킨다.

'Programming > Spring' 카테고리의 다른 글

스프링 컨테이너?  (0) 2018.05.14
POJO  (0) 2018.05.14
spring 사용이유?  (0) 2018.05.14
event.preventDefault() / event.stopPropagation()  (0) 2018.05.13
jstl 간단 사용법  (0) 2018.05.13

+ Recent posts