AOP(aspect oriented programming)

구잉·2021년 12월 29일

AOP(aspect orineted programming)
-> concern을 분리함으로써 관점에따라 모듈화할 수 있도록 한다.
코드를 수정하기보다 advice를 추가(혹은 분리)함으로써 좀 더 편리하게 프로그래밍을 수행한다.

주요용어
Advice : 수행해야하는 기능
Jointpoint : Advice를 적용하는 위치
Pointcut : Jointpoint의 부분으로 실제로 Advice가 적용된 부분
Weaving : Advice를 핵심기능에 적용하는 행위


1. Before
메소드 수행 전에 실행하는 advice

package spring.aop.advice;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class LogBeforeAdvice implements MethodBeforeAdvice{

	@Override
	public void before(Method method, Object[] args, Object target) throws Throwable {
		System.out.println("메소드 수행 전 실행되는 advice");
		
		//target 함수호출 필요 x
	}
	
}

2. AfterRetruning
메소드 수행 후에 실행하는 advice

package spring.aop.advice;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class LogAfterReturningAdvice implements AfterReturningAdvice{

	@Override
	public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
		//target 실행 후 실행
		System.out.println("returnValue:"+returnValue+" method: "+method.getName());
	}

}

4. Around
메소드 수행 전/후에 실행하는 advice

package spring.aop.advice;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class  LogAroundAdvice implements MethodInterceptor{
	//context 사용한 proxy
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		long start = System.currentTimeMillis();
		
		//원래 업무 호출
		Object result = invocation.proceed();
	
		long end = System.currentTimeMillis();
		
		String message = (end-start) + "ms 시간이 걸렸습니다.";
		System.out.println(message);
		
		return result;
	}

}

4. AfterThrowing
메소드 수행 시 예외발생하면 처리하기 위해 실행하는 advice

package spring.aop.advice;

import org.springframework.aop.ThrowsAdvice;

public class LogAfterThrowingAdvice implements ThrowsAdvice{
	//예외 발생시 실행
	public void afterThrowing(IllegalArgumentException e) throws Throwable{
		System.out.println("예외 발생: "+e.getMessage());
	}
}

Pragram.java

public static void main(String[] args) {
		ApplicationContext context = 
				//new AnnotationConfigApplicationContext(NewlecDIConfig.class);
				new ClassPathXmlApplicationContext("spring/aop/setting.xml");
		
		//원래 업무
		//Exam exam = new NewIecExam(1, 1, 1, 1);
		Exam proxy = (Exam)context.getBean("proxy");
		
		System.out.printf("total is %d\n", proxy.total());
		System.out.printf("total is %f\n", proxy.avg());
profile
시작을 두려워하지말자

0개의 댓글