2020년 10월 5일 월요일

스프링 AOP 충고(Advice) 이론및 실습, Spring AOP 용어 프록시/포인트컷/타겟클래스/위빙(자바동영상/스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)

 스프링 AOP 충고(Advice) 이론및 실습, Spring AOP 용어 프록시/포인트컷/타겟클래스/위빙(자바동영상/스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)

 


ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=867

스프링 AOP 충고(Advice) 이론및 실습, Spring AOP 용어 프록시/포인트컷/타겟클래스/위빙(자바동영상/�

스프링 AOP 충고(Advice) 이론및 실습, Spring AOP 용어 프록시/포인트컷/타겟클래스/위빙(자바동영상/스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바��

ojc.asia

https://youtu.be/e-ommLHoaOA

불러오는 중입니다...


Spring AOP 충고(Advice)


 

스프링 AOP에서 충고(Advice)는 어떤 메소드가 실행하기전에 가로채서 실행전 후로 어떠한 기능을 심어 놓는 것으로 횡단관심사(전체 프로젝트에 걸쳐저 있는 기능, 로깅, 로그인여부검사, 트랜잭션처리등) 기능을 구현한 것인데 다음과 같이 분류한다.



 

 

 


Aroud Advice의 앞단 처리 부분과 Before Advice, Aroud Advice의 뒷단 처리부분과 AfterReturning Advice간 실행순서는 정해져 있지 않고 먼저 추가되는 Advice, Advisor가 먼저 실행된다.


 

프로그래밍적인 방법을 통한 AOP 충고(Advice) 구현(ProxyFactory 이용)


 

프로그래밍적인 방법을 통해 Spring AOP 충고의 기본원리를 이해하자.

 

 


STS에서


 

1. File -> New -> (Spring Boot)Spring Starter Project



 

Next 클릭

 

Name : demo-smallmart

Type  : MAVEN

Package : onj.hello.aop


 

 

Next 클릭 , Finish  클릭

 

 

[SmallMart.java]


package onj.hello.aop;

 

public interface SmallMart {

           public void getProducts(String productName) throws Exception;

}

 

[SmallMartImpl.java]


package onj.hello.aop;

 

public class SmallMartImpl implements SmallMart {

           public void getProducts(String productName) throws Exception {

              System.out.println("[Target Method]getProduct()..." + productName);

              //throw new Exception("error...");  //주석을 출고 실행해 보자.

           }

}

 

[BeforeLoggingAdvice.java]


package onj.hello.aop;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class BeforeLoggingAdvice implements MethodBeforeAdvice{

   public void before(Method method, Object[] args, Object target) throws Throwable {

            String findName = (String)args[0];

             System.out.println(method.getName() + "(" + findName + "):: 사전충고");

   }

}

 

/**

사전 충고용 인터페이스

* 이메소드는 대상메소드, 그 메소드에 전달할 인자, 대상객체에 대한 접근점 제공

* 메소드 인자에 접근 가능하므로 런타임중에 파라미터를 사용하여 충고 구현 가능

*/

public interface MethodBeforeAdvice {

   void before(Method method, Object[] args, Object target) throws Throwable ;

}

 

[AfterLoggingAdvice.java]


package onj.hello.aop;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

 

public class AfterLoggingAdvice implements AfterReturningAdvice {

           public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {

                      System.out.println("[사후충고]" + method.getName() + "(" + args[0] + ")" );

           }

}

 

/* 사후 충고(AfterReturning Advice)용 인터페이스 */


public interface AfterReturningAdvice {

   void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable;

}

 

[AroundLoggingAdvice.java]


package onj.hello.aop;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class AroundLoggingAdvice implements MethodInterceptor {

   @Override

   public Object invoke(MethodInvocation invocation) throws Throwable {

      String findName = (String) invocation.getArguments()[0];

      String methodName = (String) invocation.getMethod().getName();

     System.out.println("[주변충고]" + methodName + "(" + findName + ") 메소드 실행전");

     Object obj = invocation.proceed(); // 타켓클래스의 메소드 호출


     System.out.println("[주변충고]" + methodName + "(" + findName + ") 메소드 실행후");

      return obj;

   }

}

 

/* 이전에 사전,사후 충고를 엮었는데 주변충고를 통해 둘 다를 엮을 수 있다.*/


public interface MethodInterceptor {

    Object invoke(MethodInvocation invocation) throws Throwable;

}

 

MethodInterceptor 구현 클래스(주변충고용 클래스)는 대상 메소드의 실제 호출여부를 제어하며 proceed를 통해 호출 타겟 메소드 호출하며, 원래 메소드의 리턴을 대체가능하다.

 

[ThrowsLoggingAdvice.java]


package onj.hello.aop;

 

import org.springframework.aop.ThrowsAdvice;

 

public class ThrowsLoggingAdvice implements ThrowsAdvice {

           public void afterThrowing(Throwable throwable) {

                      System.out.println("[예외충고]에러 발생...");

           }

}

 

/* 예외가 발생했을 때의 행위를 정의, marker interface */


public interface ThrowsAdvice {   }

 

구현대상이 없지만 아래의 메소드중 하나를 포함해야 한다.

void afterThrowing(Throwable throwable);

void afterThrowing(Method method, Object[] args,  Object target, Throwable throwable);

 

[DemoSmallmartApplication.java]


package onj.hello.aop;

import org.springframework.aop.framework.ProxyFactory;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication


public class DemoSmallmartApplication {

   public static void main(String[] args) {

      SpringApplication.run(DemoSmallmartApplication.class, args);  

      SmallMart target = new SmallMartImpl();                

      ProxyFactory pf = new ProxyFactory();

      pf.addAdvice(new BeforeLoggingAdvice());

      pf.addAdvice(new AfterLoggingAdvice());

      pf.addAdvice(new AroundLoggingAdvice());

      pf.addAdvice(new ThrowsLoggingAdvice());

                     

      pf.setTarget(target);           

      try {

          SmallMart proxy = (SmallMart)pf.getProxy();

           proxy.getProducts("생필품");                              

      }

      catch(Exception e) {e.printStackTrace(System.out);  }

   }

}

 

실행결과

 

getProducts(생필품):: 사전충고

[주변충고]getProducts(생필품) 메소드 실행전

[Target Method]getProduct()...생필품

[주변충고]getProducts(생필품) 메소드 실행후

[사후충고]getProducts(생필품)

 

예외를 던지는 부분의 주석을 해제 후

getProducts(생필품):: 사전충고

[주변충고]getProducts(생필품) 메소드 실행전

[Target Method]getProduct()...생필품

에러 발생...

java.lang.Exception: error...

           at onj.hello.aop.SmallMartImpl.getProducts(SmallMartImpl.java:6)

           at onj.hello.aop.SmallMartImpl$$FastClassBySpringCGLIB$$61b83092.invoke(<generated>)

           at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)

           at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)

           at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)

           at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)

           at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:112)

           at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)

           at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)

           at onj.hello.aop.AroundLoggingAdvice.invoke(AroundLoggingAdvice.java:11)

           at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)

           at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)

           at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:55)

           at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)

           at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)

           at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)

           at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)

           at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)

           at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)

           at onj.hello.aop.SmallMartImpl$$EnhancerBySpringCGLIB$$f7f73673.getProducts(<generated>)

           at onj.hello.aop.DemoSmallmartApplication.main(DemoSmallmartApplication.java:23)

 

DemoSmallmartApplication 클래스에서 마우스 우측버튼 -> Run As -> Spring Boot App 또는 Java Application으로 실행 가능


 


 





#스프링충고, #스프링AOP, #스프링advice, #SpringAOP, #스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원   

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...