본문 바로가기

Spring/AOP

[Spring Framework] AOP의 구현방식

728x90
반응형

'뉴렉처' 님의 채널(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를 이용하여 해결할 수 있다고 합니다.

 

 

728x90
반응형

'Spring > AOP' 카테고리의 다른 글

[Spring Framework] AOP란 무엇인가?  (0) 2021.02.03