본문 바로가기
CLASS/SPRINGBOOT

#2-1 / AOP-java

by hingu 2024. 8. 13.

얜 springboot 아님

 

🤷‍♂️❓

AOP 

관점 지향 프로그래밍

속도, 프로세서 관리 변경사항 위해 사용 多

가상공간으로 본코드를 복제해 가져와 수정한뒤 문제 없으면 본코드 버리고 새로 적용? 한다 

본코드가 작동되고있는 상황에서 테스팅, 추가코드도 추가로 실행되어야함 

ex ) 금융기관 점검시간

 

  1. ---- 본코드 ---- 
    interface를 활용하는 형태
  2. 실행할 class에서 해당 inteface를 로드
  3. 코드 작성
  4. 실행
    -----코드   추가 또는 변경되는 사항이 있을 경우 : AOP----
  5. proxy를 생성
  6. proxy에 추가 코드 작성(본코드와 동일한 변수,조건을 사용하면 X)
  7. 테스트 후 문제가 되지 않을 경우 본코드를 실행하지 않고 AOP(proxy)로 실행

 

  👀 AOP-java 

- examinterface.java   (interface)

package ja.aop;

public interface examinterface {
	public int total();
	public float avg();
}

 

 

- example.java  - 걍 class

package ja.aop;

public class example implements examinterface{
	private int js,html,spring;
	
	public example(int a, int b, int c) { //즉시 실행
		this.js = a;
		this.html = b;
		this.spring=c;
	}
	
	@Override
	public int total() {  //합계
		//start,end : 소요시간 check
		long start = System.currentTimeMillis();
		int result = this.js + this.html + this.spring;
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		return result;
	}

	@Override
	public float avg() { //평균값
		float avgs = this.total()/3.0f;
		
		return avgs;
	}

}

 

 

-  java_aop.java  - void main(String[] args)

package ja.aop;

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

public class java_aop {

	public static void main(String[] args) {
		//interface를 로드 후 해당 interface를 implements 한 즉시실행 메소드를 호출
		examinterface ex = new example(100, 80, 90);
		
		//AOP영역 (Proxy : AOP의 P)
		examinterface aops = (examinterface)Proxy.newProxyInstance(
				examinterface.class.getClassLoader(), //모든 class를 다 가져와 
				new Class[] {examinterface.class}, 
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						/* 본코드 복붙 후 중복 제거 */
						long start2 = System.currentTimeMillis();
						Object result = method.invoke(ex, args); //본코드의 값을 가져와서 실행

						//본코드에는 없고 AOP에서만 실행되는 영역
						long end = System.currentTimeMillis();
						String msg = (end-start2)+"처리시간 소요됨-AOP";
						System.out.println(msg);
						String userid="hong";
						
						return result;
					}
				});
		
		//본코드 값 출력 - 여기를 주석처리해버리면 aop만 실행되는..것!
		int result = ex.total();
		System.out.println("본코드에서 실행된 결과값 :"+result);
		
		//AOP 값 출력
		int result_aop = aops.total();
		float result_avg = aops.avg();
		System.out.println("aop에서 실행된 결과값 :"+result_aop);
		System.out.println("aop에서 실행된 결과 평균값 :"+result_avg);
	}
}

Proxy : AOP의 P

 

Proxy.newProxyInstance (

동적 프록시 ClassLoad(프록시 클래스를 만들 클래스 로더),

Class : 프록시 클래스가 구현할 인터페이스 목록,

InvocationHandler : 메소드가 호출되었을때 실행될 추가 코드

)

 

Throwable

class, AOP의 예외처리 / exception의 상위 class임

Throwable > Exception > RuntimeException > IOException ... 

 

요렇게 출력