Spring - AOP (공통기능, 관점지향 프로그램), 나름 중요, Aspect, 사용예시

2019. 7. 17. 16:03Spring

------------------AOP(Aspect Oriented Programming) 공통기능--------------

AOP
 - 관점 지향 프로그래밍
 - 같은 컨테이너 안에서만 사용이 가능하다
 - 트랜잭션처리 공통기능은 이미 구현되어있다.
    * interface flatform TranjactionManager
 - 핵심 기능을 가지고있는 메소드를 JoinPoint라고 한다.
 - JoinPoint 를 가지고 있는것을 Target이라 한다.
 - 적용규칙을 PointCut, 공통기능을 Advice, 두 세트를 Aspect라고 한다.


관점지향 프로그램(Aspect Oriented Programming)
        - 핵심로직이 구현된 메소드에 포함된 공통기능 코드를 제거할 수 있다.
        - 공통기능을 별도의 클래스에 정의하고,
           AOP 기능을 지원하는 컨테이너(우리는 Spring Container)를 활용해서 
           핵심기능이 실행될 때 공총기능이 같이 실행되도록 하는 것이다.
        - 스프링 컨테이너는 AOP의 구현체다.

        - 장점
                - 코드의 중복이 제고된다.
                  * 핵심로직 코드마다 포함된 공통기능 코드가 별도의 
                    클래스에 딱 한번 구현되기 때문이다.

                - 핵심 로직의 유지보수가 쉬워진다.
                - 공통기능의 활성화/비활성화가 가능하다.                
                - 개발자는 업무로직의 구현에만 집중할 수 있다.
                   * 프로젝트에서 자주 활용되는 공총기능(Advice)는 프레임워크에서 대부분 제공한다.



관점지향 프로그래밍의 주요 개념
        - Target
                - 공통기능이 적용될 핵심로직 메소드가 구현된 객체

        - JoinPont
                - 공통기능이 적용될 대상(핵심로직이 구현된 메소드)
                - spring AOP에서는 핵심로직이 구현된 메소드의 실행시점

        - Advice(what)
                - 핵심로직과 함께 실행할 공통기능
        
        - Pointcut(When + Where)
                - 공통기능 적용규칙
                - When : @Before -> 실행전, @After -> 실행후, @AfterReturning -> 정상종료후, 
                         @AfterThrowing -> 에러발생시, @Around -> 실행전/후
                - Where : AspectJ 표현식으로 표현한다.
                         "within(x.y.z.클래스명)"
                         "execution(반환타입 x.y.z.클래스명.메소드명())"
                - Aspect(Advice + Pointcut)
                        - AOP 적용의 필수 단위
                        - 공총기능과 적용규칙을 묶어놓은 것
                - Weabing
                        - 핵심로직이 구현된 대상 메소드(JoinPoint)에 Aspect가 적용되는 것
        



Spring의 AOP


        1. ajpectj 라이브러리 의존성을 추가한다.

                <dependency>
                   <groupId>org.aspectj</groupId>
                   <artifactId>aspectjrt</artifactId>
                   <version>${org.aspectj-version}</version>
                </dependency>	
                <dependency>
                   <groupId>org.aspectj</groupId>
                   <artifactId>aspectjweaver</artifactId>
                   <version>1.9.4</version>
                </dependency>


                



        2. Aspect를 정의한다.
                @Aspect
                public class MyAspect {

                }

        3. 공통기능과 적용규칙을 정의한다.
                @Aspect
                public class MyAspect {
                        @Before("within(x.y.z.클래스명)")
                        public void logging() {
                                // 공통기능 구현
                        }
                }


        
        4. 공통기능이 구현된 클래스를 스프링의 빈으로 등록한다.
              

<bean class="com.sample.aop.advice.MyAspect" />


        5. AOP관련 @어노테이션을 분석하고, 적절한 처리를 수행하는 클래스를 
           스프링의 빈으로 등록해서 AOP관련 동작이 수행되도록한다.
                

                1. InternalAutoProxyCreater가 스프링의 비능로 등록
                2. 스프링의 비능로 등록된 것 중에서 @Aspect가 부착된 빈의 적용규칙을 분석한다.
                3. 적용대상이 되는 빈의 대리인 객체(Proxy)를 생성한다.
                4. 실제 조립되거나 실행되는 것은 대리인 객체다.

                ※. mvc-context.xml




                ※. root-context.xml에 설정 예시(Service라 root에 한것이다.)
                   어노테이션 등록과 같은 context에 설정을 해야한다.

(어노테이션을 설정 안했다.) 

 








JoinPoint
        - 공통기능이 적용되는 대상에 대한 정보를 포함하고 있는 객체
        - 공통기능이 구현된 메소드의 배개변수로 선언하면, 공통기능 수행 시
          대상 메소드에 대한 정보가 포함된 객체를 전달받을 수 있다.
        - 주요 메소드
                Object  getTarget() - 공통기능이 적용되는 대상 객체를 반환한다.
                Signature getSignature() - 공통기능이 적용되는 대상 메소드를 반환한다.
                Object[] getArgs() - 공통기능이 적용되는 대상 메소드가 전달받는 매개변수값을 반환한다.




사용예시---------------------------------------------