카테고리 없음
[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 시간이 지났습니다.