참조 : SIA 3장

Spring이 제공하는 Advice 종류와 특징
1. arond advice :: MethodInterceptor :: 대상 메소드에 대한 호출을 가로챔
2. before advice :: BeforeAdvice :: 대상 메소드가 실행되기 전에 호출됨
3. after advice :: AfterReturningAdvice :: 대상 메소드가 리턴한 후에 호출됨
4. throws advice :: ThrowsAdvice :: 대상 메소드가 예외를 던질 때 호출됨

2.0 부터는 after finally 였나.. 대상 메소드가 끝났거나 예외가 발생했거나 종료하면 무조건 실행하는 Advice가 추가 됐습니다.

1. Before Advice 만들기
MethodBeforeAdvice 인터페이스를 구현합니다. 구현해야 할 메소드는 한 개 입니다.

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

    Callback before a given method is invoked.

    Parameters:
        method - method being invoked
        args - arguments to the method
        target - target of the method invocation. May be null.
    Throws:
        Throwable - if this object wishes to abort the call. Any exception thrown will be returned to the caller if it's allowed by the method signature. Otherwise the exception will be wrapped as a runtime exception.

첫번째 인자는 대상이 되는 메소드
두번째는 그 메소드에 전달하는 인자들
세번째는 대상 메소드를 가지고 있는 객체

2. After Advice 만들기
AfterReturningAdvice 인터페이스를 구현합니다.

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

    Callback after a given method successfully returned.

    Parameters:
        returnValue - the value returned by the method, if any
        method - method being invoked
        args - arguments to the method
        target - target of the method invocation. May be null.
    Throws:
        Throwable - if this object wishes to abort the call. Any exception thrown will be returned to the caller if it's allowed by the method signature. Otherwise the exception will be wrapped as a runtime exception.

첫번째 인자에 대상 메소드의 리턴값이 추가 됐고 나머진 한칸씩 밀렸습니다.
메소드가 끝난 뒤 실행하는 Advice니까 가용한 정보가 하나 늘었습니다.

3. Throws Advice 만들기
ThrowsAdvice 인터페이스를 구현합니다.

void afterThrowing( ThrowableSubclass)
void afterThrowing(Method , args, target, ThrowableSubclass)

위에 있는 두 가지 적어도 한 가지는 구현해야 합니다.
궁금한건... 이 인터페이스는 마커 인터페이스인데.. 어떻게 둘 중 하나만 구현하거나 둘 다 구현해도 되게 만든건지 신기합니다.

4. Around Advice 만들기
MethodInterceptor 인터페이스를 구현합니다.

가장 자주 사용될 것 같은 Advice로 Spring의 인터페이스가 아닌 AOP alliance의 인터페이스 입니다. 따라서 다른 AOP alliance 진영에 속한 AOP 구현체에서도 이 것을 구현한 Advice를 재사용할 수 있겠습니다.

public java.lang.Object invoke(MethodInvocation invocation)
                        throws java.lang.Throwable

    Implement this method to perform extra treatments before and after the invocation. Polite implementations would certainly like to invoke Joinpoint.proceed().

    Parameters:
        invocation - the method invocation joinpoint
    Returns:
        the result of the call to Joinpoint.proceed(), might be intercepted by the interceptor.
    Throws:
        java.lang.Throwable - if the interceptors or the target-object throws an exception.

유일한 인자인 MethodInvocation에는 getMethod()가 있어서 Method 타입의 객체를 넘겨 받을 수 있습니다.

리턴 타입이 있는 이유? 이 Advice는 대상 메소드의 리턴값을 바꿀 수 있습니다. 대상 메소드의 수행 여부 또한 결정할 수 있는 매우 강력한 기능을 가진 Advice입니다.

대상 메소드 실행 여부는 어떻게 결정하는가? invocation.proceed(); 를 넣어 주면 실행이 되고 해당 메소드가 값을 리턴 한다면 리턴 값을 받을 수도 있겠죠.

5. Introduction Adice

공부해야 할 것