Spring - AOP 구현방식 이해

jodbsgh·2022년 4월 22일
0

🍕"Spring"

목록 보기
15/19

AOP 구현방식 이해하기

Spring을 사용하지 않고 AOP 구현하기

JAVA로 구현해보기

  • Core Concern 주업무 로직
public class NewlecExam implements Exam{
	public int total()
    {
    	int result = kor + eng + math + com;
        
        return result;
    }
}
  • Cross-cutting Concern 보조업무 로직

long start = System.currentTimeMillis();
SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
String str =dayTime.format(new Date(start));
System.out.println(str);
/*---------------------------*/



/*---------------------------*/
long end = System.currentTimeMillis();

String message = (end-start) + "ms가 걸림";
System.out.println(message);

이 코드들을 프락시를 통해서 AOP을 구현한다.

  • 프락시 클래스에 구현되는 Cross-cutting Concern라고 한다.

  • 아래는 프록시의 예시이다.

Exam proxy = (Exam) Proxy.new.ProxyInstance(
	NewlecExam.class.getClassLoader()
    , new Class[] {Exam.clss}
    , new InvocationHandler(){
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {


          return null;
        }
    });
    
int total = proxytotal();
float avg = proxy.avg();
  • 프락시를 적용한 코드
public static void main(String[] args){
	Exam exam = new NewlecCalculator();
    Exam examProxy = (Exam) Proxy.newProxyInstance(
    	NewlecExam.class.getClassLoader(),
        new Class[](Exam.class),
        new InvocationHandler(){
        	
            @Override
            public Object invoke (Object proxy
            , Method method, Object[] args) throws Throwable{
            	
                long start = System.currentTimeMillis();
                
                SimpleDateFormat dayTime = 
                new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
                String str = dayTime.format(new Date(start));

				System.out.println(str);
                /*--------------------*/
                
                Object result = method.invoke(exam, args);
                
                /*--------------------*/
                long end = System.currentTimeMilis();
                String message = (end-start) + "ms가 걸림";
                
                System.out.println(message);
                
                return result;
            
            }//invoke
            
            int result = examProxy.total();
            System.out.println("total is" + reuslt);
        }//InvocationHandler
    )//examProxy 
}//main
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글