Spring | AOP 이용 | MethodBeforeAdvice 클래스 생성


이어서 SampleAopBean에 AOP에 삽입하는 작업을 준비하자. 이것도 물론 Java 클래스로 정의한다.

com.devkuma.spring.aop 패키지에 “SampleMethodAdvice"라는 이름으로 클래스를 만들어 보자. 그리고 아래와 같이 코드를 작성한다.

package com.devkuma.spring.aop;
 
import java.lang.reflect.Method;
 
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
 
public class SampleMethodAdvice 
        implements MethodBeforeAdvice, AfterReturningAdvice {
 
    @Override
    public void before(Method method, Object[] args, 
            Object target) throws Throwable {
        System.out.println("*before: " + method.getName() + "[" + target + "]");
    }
 
    @Override
    public void afterReturning(Object returnValue, Method method, 
            Object[] args, Object target) throws Throwable {
        System.out.println("*after: " + method.getName() + "[" + target + "]");
    }
 
}

이번 작성한 SampleMethodAdvice는 두 개의 인터페이스를 구현하고 있다. 이 인터페이스는 처리의 삽입에 대한 메소드를 추가한다. 각각 간단히 정리를 하면 아래와 같다.

MethodBeforeAdvice
이것은 메소드가 실행하기 전에 처리를 삽입하기 위한 인터페이스이다. 이것은 ‘before’라는 메소드를 하나 가지고 있으며 다음과 같이 정의되어 있다.

public void before (Method method, Object [] args, Object target)
    throws Throwable

Method는 대상 메소드, args는 그에 대한 인수, target은 대상이 되는 객체(인스턴스)가 각각 전달된다. 이러한 인수들은 어떤 인스턴스의 어떤 메서드를 호출하기 전에 이 처리를 수행했는지를 알 수 있다.

AfterReturningAdvice
이것은 메소드의 실행이 끝나고, 호출을 하고 원래대로 돌아오게 될 때 삽입하는 처리의 인터페이스이다. “afterReturning"라는 메소드가 준비되어 있다. 이것은 다음과 같이 정의되어 있다.

public void afterReturning (Object returnValue, Method method,
    Object [] args, Object target) throws Throwable

메소드의 반환 값, 메소드, 메소드에 전달된 인수, 대상 인스턴스가 인수로 전달된다. 반환 값 이외는 위 before와 동일하므로 거의 같은 감각으로 처리하는 것이 가능하다.

여기에서는 각 메소드과 타겟을 System.out.println에서 출력하고 있을 뿐이다. AOP는 “처리 삽입"라고 했지만 어디라도 마음대로 삽입되는 것은 아니다. “이 타이밍에 삽입한다"는 것이 미리 몇 가지 준비되어 있을 것이다.

우선, 이 2개의 인터페이스를 익히면 “메소드를 호출하기 전과 호출 후"에 처리를 삽입할 수 있다. AOP의 기본을 알게 된것으로는 충분하다.