본문 바로가기
Spring|Spring-boot/Spring AOP

[Spring] AOP(Aspect Oriented Programming) 방법론

by oncerun 2020. 6. 22.
반응형

AOP란

 

 

관점에 따라서 프로그램을 만드는 방식입니다. 우리는 보통 사용자의 관점에서만 프로그램을 만들었습니다.

객체지향보다 더 큰 단위인 AOP는 개발자, 운영자들의 관점에 대해 프로그램을 만들 것인가? 하는 이야기입니다.

 

로그 처리 (성능 테스트) , 보안 처리 , 트랜잭션 처리 등등 을 위해  Croos-cutting Concern이 되며

주 업무 로직 사용자가 요청한 서비스를 Primary Concern으로 표현됩니다.

 

우리는 주 업무 로직과 크로스커팅을 합칠 일이 많았습니다.   과거에는 이러한 Core Concern와 Cross-cutting Concern을 합칠 때  크로스커팅을 주석 처리했다가 풀었다가 하는 일이 많았습니다. 관점이 다른 코드를 을 쉽게 뺏다 꽂았다 하는 방법을 생각하다 보니 나온 방법론이 AOP입니다. 프락시를 이용해 주 업무가 실행될 때 앞 뒤로  크로스 컷팅 로직이 자동으로 실행되도록 spring에서 도움을 제공합니다.

 

 

AOP 구현 방식

 

만약 비즈니스 로직에 대하여 걸리는 시간을 알고 싶은 경우 

public static void main(String[] args){

Exam exam = new Exam();
Exam examProxy = =(Exam) Proxy.newProxyInstance(Exam.getClassLoader), new Class[]{Exam.class},
new InvocationHandler(){

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
 		//Cross-cutting Concern
		long start = System.currentTimeMillis();
		SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String str = dayTime.format(start);
		System.out.println(str);
       
		-------------------------------
        
		//int result =kor+ eng + math;
		Object result = method.invoke(exam, args);
        /실질적인 메소드
        
        ---------------------------
		long end = System.currentTimeMillis();
		String message = (end-start)+ "가 걸림";
		System.out.println(message);
         //Cross-cutting Concern
		---------------------------------
		return result;
	}

}
public int total() {
		
	
	}
	
	
}

 

이렇게 작성할 수 있으면 업무 로직과 상관없는 다른 코드들을 같이 넣었지만  만약 업무 로직을 구현하는 소스코드가 없다면 로직을 넣을 수가 없기에  테스트 코드 자체를 넣는 것이 불가능해졌습니다.

 

AOP는 이러한 코드를 분리합니다. 

 

Cross-cutting Concern

		
		long start = System.currentTimeMillis();
		SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String str = dayTime.format(start);
		System.out.println(str);
		-------------------------------
        
		
        ---------------------------
		long end = System.currentTimeMillis();
		String message = (end-start)+ "가 걸림";
		System.out.println(message);
		
	
	

 

Core Concern

public int total() {
		
        
		int result =kor+ eng + math;
		
		
		return result;
	}
	
	

 

 

package spring;


public class Program {

	public static void main(String[] args) {
		 
         Exam exam = new NewExam();
         Exam proxy = (Exam) Proxy.newProxyInstance(NewExam.class.getClassLoader(), new Class[]{Exam.class},
         new InvocationHandler(){
 		//만약 NewExam이 여러개의 인터페이스가 존재하면 2번째인자에 배열형식으로나열
        
        
            @Override
            public Object invoke(Object proxy , Method method, Object[] args){
            
            long start = System.currentTimeMillis();
            
            Object result = method.invoke(exam, args);
            //첫번째 인자 실제업무객체 , 두번째 인자 메소드가 가지고있는 파라미터
            
            long end = System.currentTimeMillis();
            
            return result;
            }
         })
        
         
	}

}

 

즉 AOP는 곁다리 업무를 끼어넣을 수 있도록 도와줍니다.

반응형

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

Pointcut - within, args  (0) 2022.01.29
Pointcut - execution  (0) 2022.01.29
Spring AOP (2)  (0) 2022.01.29
Spring AOP  (0) 2022.01.27
[Spring boot] AOP 활용예제  (0) 2021.06.09

댓글