BeforeAdvice & AroundAdvice & AfterAdvice

Soozoo·2024년 8월 20일

Spring

목록 보기
9/12

BeforeAdviceAroundAdvice는 스프링 AOP(Aspect-Oriented Programming)에서 사용하는 두 가지 종류의 어드바이스(Advice)입니다. 어드바이스는 애플리케이션의 메인 로직에 추가적인 동작을 삽입할 수 있는 코드 조각을 의미합니다. 각각의 어드바이스는 타겟 메소드의 실행 시점에 따라 다르게 동작합니다.

BeforeAdvice

BeforeAdvice는 타겟 메소드가 실행되기 직전에 실행되는 어드바이스입니다. 주로 로깅, 보안 체크, 유효성 검사 등의 사전 작업을 수행하는 데 사용됩니다.

  • 특징:
    • 타겟 메소드가 호출되기 전에 실행됩니다.
    • 타겟 메소드의 실행 여부에 영향을 주지 않고, 예외를 발생시키지 않는 한 항상 타겟 메소드가 실행됩니다.
  • 예제:
    import org.springframework.aop.MethodBeforeAdvice;
    import java.lang.reflect.Method;
    
    public class MyBeforeAdvice implements MethodBeforeAdvice {
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            System.out.println("Before method: " + method.getName());
        }
    }
    
    위 예제에서 MyBeforeAdviceMethodBeforeAdvice 인터페이스를 구현하며, 타겟 메소드가 호출되기 전에 실행됩니다.

AroundAdvice

AroundAdvice는 타겟 메소드의 실행 전후에 모두 실행되는 어드바이스입니다. 이 어드바이스는 타겟 메소드의 호출을 감싸며, 타겟 메소드의 실행 전후에 원하는 로직을 수행할 수 있습니다. 심지어 타겟 메소드의 실행 여부를 결정하거나 결과를 변경할 수도 있습니다.

  • 특징:
    • 타겟 메소드의 실행을 완전히 제어할 수 있습니다.
    • 타겟 메소드가 실행되기 전, 실행 중, 실행 후에 동작할 수 있습니다.
    • 메소드 호출을 방해하거나, 조건에 따라 실행하지 않을 수도 있습니다.
  • 예제:
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class MyAroundAdvice implements MethodInterceptor {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("Before method: " + invocation.getMethod().getName());
    
            // 타겟 메소드 호출
            Object result = invocation.proceed();
    
            System.out.println("After method: " + invocation.getMethod().getName());
            return result;
        }
    }
    
    위 예제에서 MyAroundAdviceMethodInterceptor 인터페이스를 구현하며, invoke 메소드 내에서 타겟 메소드의 실행 전후에 로직을 추가합니다. invocation.proceed()가 타겟 메소드를 호출하는 부분입니다.

요약

  • BeforeAdvice: 타겟 메소드가 실행되기 직전에 실행되는 어드바이스로, 타겟 메소드 실행 전에 추가적인 동작을 수행할 때 유용합니다.
  • AroundAdvice: 타겟 메소드의 실행 전후에 모두 실행되는 어드바이스로, 타겟 메소드의 실행을 감싸며 호출 전후에 추가적인 로직을 수행하거나, 타겟 메소드의 실행 여부를 제어할 수 있습니다.

AfterAdvice는 스프링 AOP(Aspect-Oriented Programming)에서 사용되는 어드바이스 유형 중 하나로, 타겟 메소드가 실행된 후에 실행되는 코드를 정의하는 데 사용됩니다. 이를 통해 메소드 실행이 완료된 후에 실행해야 하는 부가 작업들을 처리할 수 있습니다.

종류와 사용 예시

AfterAdvice에는 다음과 같은 세 가지 주요 형태가 있습니다:

  1. AfterReturningAdvice:

    • 타겟 메소드가 정상적으로 실행되고 반환된 후에 실행됩니다.
    • 주로 메소드의 반환값을 검증하거나, 메소드 실행 후 수행해야 할 로직이 있을 때 사용됩니다.
    package ex05.aop;
    
    import org.springframework.aop.AfterReturningAdvice;
    import java.lang.reflect.Method;
    
    public class LogPrintAfterReturningAdvice implements AfterReturningAdvice {
        @Override
        public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
            System.out.println("AfterReturning Advice: 메소드 실행 후");
            System.out.println("반환 값: " + returnValue);
        }
    }
    
  2. AfterThrowingAdvice:

    • 타겟 메소드가 예외를 던진 후에 실행됩니다.
    • 예외가 발생했을 때 로깅하거나, 예외 처리 로직을 구현하는 데 사용됩니다.
    package ex05.aop;
    
    import org.springframework.aop.ThrowsAdvice;
    
    public class LogPrintThrowingAdvice implements ThrowsAdvice {
        public void afterThrowing(Method method, Object[] args, Object target, Exception e) {
            System.out.println("AfterThrowing Advice: 예외 발생 후");
            System.out.println("예외 메시지: " + e.getMessage());
        }
    }
    
  3. After (Finally) Advice:

    • 타겟 메소드의 성공 여부와 상관없이, 즉 예외가 발생하더라도 항상 실행됩니다.
    • 보통 메소드 실행 후 리소스를 해제하거나, 무조건 수행해야 하는 작업을 처리할 때 사용됩니다.
    package ex05.aop;
    
    import org.springframework.aop.AfterAdvice;
    
    public class LogPrintAfterFinallyAdvice implements AfterAdvice {
        public void after(Method method, Object[] args, Object target) {
            System.out.println("AfterFinally Advice: 메소드 종료 후 (성공/실패 무관)");
        }
    }
    

적용 예시

Spring XML 설정에서 AfterAdvice를 적용하는 방법은 다음과 같습니다:

<aop:config>
    <aop:aspect id="aspect" ref="logPrintAfterAdvice">
        <!-- 특정 메소드 호출 후에 Advice 실행 -->
        <aop:pointcut id="pointCut" expression="execution(* ex05.aop.ICalc.*(..))"/>
        <aop:after method="after" pointcut-ref="pointCut"/>
    </aop:aspect>
</aop:config>

언제 사용하는가?

  • AfterReturningAdvice는 메소드 호출 후 반환된 값을 기반으로 추가 처리를 할 때 유용합니다.
  • AfterThrowingAdvice는 예외 발생 시 이를 로깅하거나 특정 로직을 수행해야 할 때 사용됩니다.
  • After (Finally) Advice는 메소드 실행 후 무조건 수행해야 하는 클린업 작업이나 기타 로직이 있을 때 사용됩니다.

요약

  • AfterAdvice는 메소드 실행 후에 실행되는 코드 블록을 정의합니다.
  • 다양한 형태의 AfterAdvice는 메소드의 실행 결과(성공, 실패)에 따라 적절한 후처리 로직을 구현할 수 있게 합니다.
profile
넙-죽

0개의 댓글