정리하고기록하자

Spring - AOP 본문

개발 상식

Spring - AOP

정리하고기록하자 2022. 4. 30. 22:58
반응형

AOP

AOP 란 Aspect OOrented Programming 의 약자로 객체지향프로그래밍보다 더 큰 프로그래밍이다.

즉 '측면/양상 지향적인 프로그래밍' 이라는 의미이다.

AOP는 스프링이 아니라 AOP를 구현을 할때 스프링에 도움을 받는다.

스프링과 상관없이 AOP 는 방법론이다.


예전에는 사용자가 원하는 업무 기반의 로직에만 관심이 있었다.

사용자의 주 업무를 분석하고 로직을 구현하는데만 관심이 있었다.

사용자의 업무적인 요구사항 말고, 개발하면서 개발자나 관리자가 사용하기 위해 필요한 코드들이 있다.

프로그램 구현을 하거나 테스트 하기 위해서 필요한 코드들이 있는데 

그러한 코드들은 주 업무는 아니고 개발자를 위해서, 관리자를 위해서 부가적으로 추가한 코드들이다.

관점에 따라 다른 업무 분류 해서 프로그램을 만들때 그 관점들의 내용을
어떻게 분류하고 결합시켜서 프로그램을 만들것인가의 방법론이다.

 


AOP 만으로 구현 하기

package spring.aop.entity;

public class NewAopExam implements Exam{
	private int kor;
	private int eng;
	private int math;
	private int com;
	
	public NewAopExam() {
	}
	public NewAopExam(int kor,int eng,int math, int com) {
		this.kor = kor;
		this.eng = eng;
		this.math = math;
		this.com = com;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getMath() {
		return math;
	}
	public void setMath(int math) {
		this.math = math;
	}
	public int getCom() {
		return com;
	}
	public void setCom(int com) {
		this.com = com;
	}
	
	@Override
	public String toString() {
		return "NewAopExam [kor=" + kor + ", eng=" + eng + ", math=" + math + ", com=" + com + "]";
	}
	@Override
	public int total() {
		// TODO Auto-generated method stub
		//long start = System.currentTimeMillis();
		
		int result = kor + eng + math + com;
		
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//long end = System.currentTimeMillis();
		
		//String message = (end - start) + ":  이만큼 걸렸어요";
		//System.out.println(message);
		
		return result;
	}
	@Override
	public float avg() {
		float result = total() / 4.0f; 
				
		return result;
	}
	
	
	
}
package spring.aop.entity;

public interface Exam {
	public int total();
	
	public float avg();
}
package spring.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import spring.aop.entity.Exam;
import spring.aop.entity.NewAopExam;

public class program {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Exam exam = new NewAopExam(1,1,1,1);
		
		Exam proxy = (Exam) Proxy.newProxyInstance(NewAopExam.class.getClassLoader(),
				new Class[] {Exam.class}, 
				new InvocationHandler() {
					
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						// TODO Auto-generated method stub
						long start = System.currentTimeMillis();
						Object result = method.invoke(exam, args);
						long end = System.currentTimeMillis();
						
						String message = (end - start) + ":  이만큼 걸렸어요";
						System.out.println(message);
						
						return result;
					}
				});
		
		System.out.println(exam.total());
		System.out.println(proxy.total());
	}
}

스프링 AOP

스프링 AOP는 코드 주입이다.

주요 기능과 핵심 기능 구현을 위한 부가적인 기능 구현을 분리하여 각각의 관점별로 묶어서 개발하는 형식이다.

1. 메소드의 호출 이전 또는 이후에 필요한 로직을 수행하는 방법을 제공한다

2. AOP는 코드가 없는데도 코드가 있는 것처럼 사용된다.

3. @Transctional이 AOP 기반을로 만들어진 어노테이션 이다.

 

반응형

'개발 상식' 카테고리의 다른 글

Spring - PSA  (0) 2022.05.02
Spring - DI  (0) 2022.05.02
JDK 1.7 -> 1.8  (0) 2022.04.28
Spring - IoC  (0) 2022.04.22
RESTful API  (0) 2022.03.14