'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)
이번 시간에는 AOP를 코드로 구현하기 전에, 구현 방식에 대해서 이해를 해보겠습니다.
아래는 저번 시간에 예시로 든 AOP 방식입니다.
현재는 이러한 방식을 사용하지 않는다고 말했는데, 그 정확한 이유를 코드로 직접 확인하면서 다루어봅시다.
@Component
public class Animal {
@Value("_TECH")
private String name;
private int age;
private int adopted_age;
...
public int getLivingTerm() {
SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss.SS");
Date today = new Date();
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );
long reqTime = System.currentTimeMillis();
String reqTimeStr = dayTime.format(new Date(reqTime));
//// core concern start ////
int value;
value = adopted_age - age;
//// core concern end ////
long resTime = System.currentTimeMillis();
String resTimeStr = dayTime.format(resTime);
return value;
}
...
코드를 확인하면, 가운데에 core concern 부분이 있고, 그 겉을 cross cutting concern 부분이 감싸고 있는 걸 볼 수 있습니다.
그러나 만약 우리가 print() 메소드에 대한 코드를 갖고 있지 않다면, cross cutting concern 부분을 core concern 부분에 껴넣을 수 없게 됩니다.
따라서 저번에 말했던 아래와 같은 방식을 사용해야합니다.
이렇게 노란색의 부분에 cross cutting concern 부분을 두고, 중간의 텅 빈 부분에 core concern 부분을 껴넣을 수 있으면 메소드의 코드가 없더라도 문제가 되지 않죠.
그러기 위해서는 노란색 부분의 사이에 core concern 을 호출해주기 위한 무언가가 필요한데, 그것이 바로 proxy입니다.
즉, 위의 그림에서 파란색 원이 proxy 가 되는 것이죠.
따라서 사용자는 core conern 부분을 직접 호출하지 않고, proxy를 호출하여 자신이 요청한 업무를 수행해달라고 합니다.
개발자의 입장에서는 Cross cutting concern에 해당하는 코드를 직접 구현할 수 있기 때문에 core concern 코드가 자신에게 없어도 상관 없습니다.
다음은 이러한 Proxy를 구현하였을 때의 코드입니다.
Proxy가 없을 때와 비교해보면, cross cutting 부분이 core 부분과 분리되어 있는 것을 볼 수 있습니다.
...
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss.SS");
Date today = new Date();
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );
long reqTime = System.currentTimeMillis();
String reqTimeStr = dayTime.format(new Date(reqTime));
//// proxy가 core concern 호출 ////
Object result = method.invoke(animal, args);
//// ////
long resTime = System.currentTimeMillis();
String resTimeStr = dayTime.format(resTime);
System.out.println("걸린시간 : " + (resTime - reqTime)/1000.000);
return result;
}
int result = animalProxy.getLivingTerm();
System.out.println("입양 기간 : " + result);
...
위와 같이 proxy를 사용하게 되면, proxy를 결합하고 다시 떼는 과정에 문제가 생기게 되는데,
이러한 부분을 Spring DI를 이용하여 해결할 수 있다고 합니다.
'Spring > AOP' 카테고리의 다른 글
[Spring Framework] AOP란 무엇인가? (0) | 2021.02.03 |
---|