국비지원학원/Spring Framework

126일차-Spring AOP~127일차-AOP

초코맛 2019. 8. 24. 14:23
반응형
 
*Spring AOP(Aspect Oriented Programming)
  • 관점 지향 programming(횡단 관심사의 처리)
    • 종단관심사 처리
      • | (상속의 특징)
      • | 부모-업무정의하면 자식 사용가능 //=>단점이 자식이지만 하고싶지않을때 해결할 방법이 없다.
      • | 자식A 자식B
      • ↓ 자식AA
    • 횡단관심사 처리
      • =>부기능을 분리할 수 있다.      부분  
      • 공선의   오영근   정택성
      • 지문()     지문()    지문()   //=>부
      • 수업()     수업()     수업()  //=>주
      • -------------------------→
  • 주 업무로직에서 부가적인 기능의 코드가 분리되므로 코드의 복잡도가 낮아진다(떨어진다) //=>장점
  • 용어)
    • Aspect(관점) : Advice와 JoinPoint를 묶어놓은 것.
    • Advice : 부가적인(공통) 코드를 정의하는 것.  //부가적인 업무처리-세션(로그인이 되었나) (간섭)
    • JoinPoint : 부가적인 코드가 실행되는 지점을 정의하는 것. 
    • PointCut : JoinPoint를 기술하는 표현식
      • execution( 식 ) : Annotation의 속성
    • Target : Advice를 받을 대상.

    • JoinPoint 
      • Before : target method가 호출되기 전에 Advice를 실행 할 때 (Before Advice)  
        • Advice가 동작하는 시점.
      • After : target method가 호출되고 난 후 Advice를 실행
      • AfterReturning : target method가 호출되고 Return값이 반환되고 난 후에 Advice를 실행하는것
      • AfterThrowing : target method가 예외를 날린 이후에 Advice를 실행할 때
      • Around : target method가 호출되기 전과 호출된 이후에 실행되는 Advice.


  • 사용 jar ( pom.xml에 설정)
    • aspectjrt.jar
    • aspectjweaver.jar
  • 설정 파일 : application-context, root-context,servlet-context,,들이 있었는데
    • <aop : aspectj-autoproxy/>
지우고>>mvc import>spring>convert to maven>pom 덮어쓰고>lib에 추가>추가




*AOP Annotation
  • @Aspect : class위에 설정
  • -method위에 설정하고 Advice가 동작하는 target method와 시점을 정의-
  • @Before : Before Advice사용할 때(method 호출 전 사용), method 위 설정
    • @Before("execution(pointCut)")
  • @After 
    • @After("execution(pointCut)")
  • @AfterReturning : return값이 target method에서 반환되고 난 이후 
    • @AfterReturning("execution(pointCut), return=리턴값")
  • @AfterThrowing : target method가 예외를 날린 이후에 실행
    • @AfterThrowing("execution(pointCut), throwing=예외처리객체")
  • @Around
    • @Around("execution(porintCut)")
*Advice 내에 사용하는 객체
  • 모든 객체를 받을 수 있다.
  • JoinPoint, ProceedingJoinPoint(around에서만 사용가능)두가지를 사용하여 target에서 사용되는 Parameter, return 값들을 받을 수 있다
*PointCut
  • target에 JoinPoint를 설정하는 표현식 같은것 (method) 
    • method=>package.class.method
  • execution에 정의
    • execution( [(method의)접근지정자 반환형 패키지명.클래스명.]method명)
    • []생략가능 하고 ..이란걸 쓸수 있는데 "모든 대상"이란 뜻
    • *을 사용할 수 있다.
      • public void kr.co.sist.controller.*Controller.test 
      •                                                    Cntroller*.method명

 
*AOP(Aspect Oriented Programming)
  • 핵심 로직에서 공통로직을 분리하기 위해 사용
  • ///상속처럼 내자식이어야 적용되는게 아니라 상관없는 class에 적용가능.
  • aspectjrt.jar, aspectjweaver.jar POM.XML에 정의
  • 설정파일에 <aop:aspectj-autoproxy/> 정의
    • aop -> xmlns : prefix
    • 설정파일=>applicationContext.xml(Spring_DI), root_context.xml, Servlet_context.xml(Spring_MVC)
  • Class 작성 -약결합으로 의존성 주입
    • @Before(pointCut)<-JoinPoint : 이 advice가 실행되는 시점
    • 공통로직-Advice    
  • Aspect : Advice와 JoinPoint를 합친것
  • Advice : 공통로직 
  • JoinPoint : 공통로직이 들어갈 시점
    • Before Advice : target method가 실행되기 전
      • @Before("execute(pointcut")
    • After Advice  : target method가 실행된 후
      • @After("execute(pointcut")
    • AfterReturning Advice  : target method가 return값을 return하고난 후
      • @AfterReturning(pointcut, return="데이터형") 
    • AfterThrowing Advice  : target method가 throws하고 난 이후
      • @AfterThrowing(pointcut, throwing="예외처리객체명")
    • Around Advice : target method가 실행되기 전 또는(과?) 실행된 후
      • @Around("execute(pointcut")
    • //매개변수라(는 Parameter를 받을 수 있다)->JoinPoint 객체)
    • //return -> ProceedingJoinPoint
  • pointCut : targer method 설정
  • target : Advice를 받을 대상(method) 



*JoinPoint
  • JoinPint가 @Before, @After, @AfterReturning, @AfterThrowing에서 사용되는 Parameter를 Advice에서 처리하는 객체
  • Advice의 매개변수로 정의
  • @Before(...)
  • public void test(JoinPoint jp){
    • Object[] =jp.getArgs(); //target의 매개변수를 받기
    • //target method의 method명
    • Signature s= jp.getSignature()
    • s.getName() //메소드명??
    • s.getModifier() //접근지정자를 얻을 수 있다.
  • }

*ProceedingJoinPoint interface
  • JoinPoint가 @Around에서만 사용
  • target method의 return값을 처리하는 객체
  • Advice제작시 주의점)
    1. method를 반드시 void가 아닌 return을 가져야 한다.
    2. 매개변수에 ProceedingJoinPoint 선언
    3. Advice method에 throws Throwable을 정의
    4. return value를 ProceedingJoinPoint를 사용하여 처리해야 한다.
  • @Around("execution(...)")
  • public 반환형 advice(ProceedingJoinPoint pop) throws Throwable{ 
    • //이때 반환형은 Object 또는 Target method의 return타입과 동일해도 상관없다.
    • Object o=pjp.proceed(); //target method의 반환값을 얻어온다.
          • String, Integer(Wrapper class)
          • String일때만 님 을 붙이고 싶다면...
    • if(o instenceof String|ItemDomain){  //클래스 식별할꺼야..?
    • }
    • return o;
  • }

 

반응형