Spring | AspectJ 이용 | Aspect 클래스 생성

Aspect으로 삽입하는 처리되는 클래스를 만들어 보자. 이번에는 AspectJ를 이용하기 때문에 이전과는 다른 형태이다.

아래 코드가 작성한 예제이다. com.devkuma.spring.aop 패키지에 “SampleAspect"라는 클래스 이름으로 코드를 작성한다.

package com.devkuma.spring.aop;
 
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
 
@Aspect
public class SampleAspect {
 
    @Before("execution(* com.devkuma.spring.aop.SampleAopBean.*(..))")
    public void before() {
        System.out.println("before:");
    }
 
    @After("execution(* com.devkuma.spring.aop.SampleAopBean.*(..))")
    public void after() {
        System.out.println("after:");
    }
}

보면 알 수 있듯이, 이것은 매우 일반적인 POJO 클래스이다. 어떤 인터페이스도 구현하지 않고, 어떤 클래스도 상속받지 않는다. 다른 것은 어노테이션이 부여되었다는 것뿐이다.

@Aspect
이 클래스가 Aspect 클래스 임을 나타낸다. AspectJ에서 사용하는 클래스는 이 어노테이션을 부여한다.

@Before
이 어노테이션은 메소드의 앞에 넣는다. 메소드의 실행 전에 삽입하는 처리임을 나타내는 어노테이션이다. Spring AOP에 있는 “before"과 유사한 것으로 생각해도 된다.

@After
이 어노테이션은 메소드의 앞에 넣는다. 이것은 메소드의 실행 후에 삽입되는 처리인 것을 나타내는 어노테이션이다. Spring AOP에 있는 “afterRunning"에 해당하는 것으로 생각하면 된다.

어노테이션 자체는 간단하다. 알기 어려운 것은 @Before와 @After 뒤의 괄호()안에 기술된 내용이다. 이것은 다음과 같이 기술이 되어 있다.

("execution (...... 할당되는 메소드의 지정 ...)")

execution 후의 괄호()에 어떤 메소드에 이 메소드 삽입 할 것인지를 지정한다. 이것은 패키지 이름부터 제대로 정확하게 메소드를 지정해야 한다. 단, 모든 이름을 다 기술해야 한다는 뜻은 아니다.

여기에는 와일드 카드(*)를 사용할 수 있기 때문에, 그것을 이용하여 특정 패키지와 클래스의 모든 메소드 등을 지정할 수 있다. 또한 지정하는 메소드의 인수도 “..” 기호로 불특정 인수를 지정할 수 있다.

여기에 작성된 것을 보면, 다음과 같이 되어 있다.

* com.devkuma.spring.aop.SampleAopBean.*(..)

알기 쉽게 말해, “불특정 값"을 XX라고 기술한다면, 이런 식으로 적혀있는 것을 알 수 있다.

XX com.devkuma.spring.aop.SampleAopBean.XX(XX)

맨 처음에있는 XX는 public이나 private 같은 것이 지정된 경우를 생각하여 붙여 있다. 그리고 SampleAopBean의 후에 붙은 XX는 이 클래스 내에 있는 어떤 방법도 모두 대상으로 지정하는 것이다. 또, (XX)는 인수가 어떤 형태여도 해당되도록 하기 위한 것이다.

이 execution 작성 방법을 어느 정도 알게 된다면, 원하는대로 AOP 처리 대상이 되는 메소드를 지정할 수 있게 될 것이다.