카테고리 없음

[2,3강] AOP 자바 코드 이해하기, 순수 자바로 AOP 구현해보기

째로스 2023. 6. 12. 12:00

1. 코드에서 주업무 로직인 Core Concern과 보조 업무인 Cross-cutting Concern 으로 나누기

public class NewlecExam implements Exam{
	public int total(){
		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);
		/*--------------------------------------------------------------------*/
		
		int result = kor+eng+math+com;      // 주 업무 로직
        
		/*--------------------------------------------------------------------*/
		long end = System.currentTimeMillis();

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

위 함수를 보조 업무를 수행하는 Cross-cuting Concern과 주 업무를 수행하는 Core Concern으로 구분하면

아래와 같이 나뉜다.

 

1) Cross-cutting Concern

//<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);

 

2) Core Concern

//<Core Concern>

public class NewlecExam implements Exam{
	public int total(){
    
		int result = kor+eng+math+com;
        
		return result;
	}
}

 

2. Proxy 사용으로 Core Cocern과 Cross-cutting Concern 나누기

@Override
public int total(){
    long start = System.currentTimeMillis();
    int result = kor+eng+math+com;
    
    try{
        Thread.sleep(200);
    }catch(InterruptedException e){
        e.printStackTrace();
    }
    
    long end = System.currentTimeMillis();
    
    String message = (end-start) + "ms 시간이 지났습니다.";
    System.out.println(message);
    
    return result;
}

위와 같은 코드가 있었을 경우 이를 Proxy를 사용하여 나누면

@Override
public int total(){

    int result = kor+eng+math+com;
    
    return result;
}
Exam exam = new NewLecExam(1,1,1,1);

Exam proxy = (Exam) Proxy.newProxyInstance(NewlecExam.class.getClassLoader(),
        new Class[] {Exam.class},
        new InvocationHandler(){
                @Override
                public Object invoke(Object proxy, Method method, Object[] args){
                
                    long start = System.currentTimemillsis();
                    
                    Object result = method.invoke(exam,args);
                    
                    method.invoke(exam,args);
                    
                    long end = System.currentTimemillsis();
                    String message = (end-start)+"ms 시간이 지났습니다.";
                    
                    System.out.println(message);
                
                    retrn result;
                }
        }
);

method.invoke를 통해 exam 객체에서의 특정 함수를 args 를 매개변수로 동작하게 된다.

 

1) System.out.printf("total is %d\n", exam.total());  실행 시 결과값

total is 4

1) System.out.printf("total is %d\n", proxy.total());  실행 시 결과값

total is 4
201ms 시간이 지났습니다.