ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] AOP (Aspect Oriented Proramming)
    공부방/JSP 2013. 7. 5. 15:18

    ■  핵심 관심 사항(core concern)과 공통 관심 사항 (cross-cutting concern)

     

     

    ■  기존 OOP에서는 공통관심사항을 여러 모듈에서 적용하는데 중복된 코드를 양산과 같은 한계가 존재

       -  이를 극복하기 위해 AOP가 등장

       -  여러곳에서 공통으로 사용되는 메서드를 Spring이 호출

     

     

    ■  Aspect Oriented Proramming은 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통관심 사항 기준으로

         프로그래밍함으로써 공통 모듈을 손쉽게 적용할 수 있게 해준다.

     

     

    ■  공통적으로 사용하는 클래스의 메소드를 XML에 정의, Spring이 알아서 실행

    =>

    Login 클래스에 있는 loginCheck 기능을 여러 기능을 담당하는 메소드들이 사용할 때, 만약 새로운 메소드를 써야되는 일이

    생긴다면 일일히 찾아서 다 수정해주어야 할 것이다. 이것을 간편하게 하기 위해 XML에 공통적으로 사용하는 메소드들을

    정의해주어 Spring이 알아서 실행하도록 하면 일일히 찾아서 수정할 필요가 없을 것이다.

     

     

    ■  POJO 기반 AOP 구현 - 설정파일 작성

     

      -  Org.kosta.spring 패키지 : org.kosta,.spring 패키지의 모든메서드 호출시 자동으로 LogAspect logging 호출하고픔

      -  언제 Spring이 자동으로 메소드를 호출하는가?

     

      -  AOP 설정 태그

         1)  <aop:config> : aop 설정의 root 태그. - weaving들의 묶음

         2)  <aop:aspect> : Aspect 설정 - 하나의 weaving에 대한 설정

         3)  <aop:pointcut> : Pointcut 설정

         4)  Advice 설정태그들

             a.  <aop:before> : 메소드 실행 전 실행될 Advice 객체의 메소드

             b.  <aop:after-returning> : 메소드 정상 실행 후 실행될 Advice

             c.  <aop:after-throwing> : 메소드에서 예외 발생시 실행될 Advice

             d.  <aop:after> : 메소드 정상 또는 예외 발생 상관없이 실행될 Advice - finally

             e.  <aop:around> : 모든 시점에서 적용시킬 수 있는 Advice 구현

     

         ※ AOP의 용어

            ㆍ Advice : LogAspect 클래스. 즉, Spring이 자동으로 호출하는 메소드를 포함하고 있는 객체

             PointCut : 언제 어떤 클래스의 어떤 메소드를 자동으로 Spring이 호출할 때 어떤 Advice의 메소드를 호출해야 되는가.

             Aspect : Spring이 Advice의 어떤 메소드를 언제(메소드 실행직전, 메소드 실행직후, Exception 발생시, 메소드 대신) 실행하나

     

     <bean id="writelog" class="c"/>
     <aop:config>
      <aop:pointcut id="publicmethod" expression="excution(public*org.kosta.spring..*(..))"/>
      <aop:aspect id="logingaspect" ref="writelog">
       <aop:around pointcut-ref="publicmethod" method="logging"/>
      </aop:aspect>
     </aop:config> 
     <bean id="targetclass" class="org.kosta.spring.TargetClass"></bean>

     

     

    ■  <aop:aspect>

       -  한개의 Aspect(공통 관심기능)을 설정

       -  ref 속성을 통해 공통기능을 가지고 있는 bean을 연결 한다.

       -  id는 이 태그의 식별자를 설정

       -  자식 태그로 <aop:pointcut> advice 관련 태그가 올 수 있다.

       -  어떤 Advice의 어떤 메소드를 호출

       -  TagetClass.method1()

           => 개발자가 호출한 메소드(Target 메소드)

                메소드 실행직전 <aop:before>

                메소드 실행직후 <aop:after>

                Exception 발생시 <aop:-throwing>

                예외와 상관없이 실행 <aop:after>

     

     

    ■  <aop:pointcut>

       -  Pointcut(공통기능이 적용될 곳)을 지정하는 태그

       -  <aop:config> 전역적으로 사용

       -  <aop:aspect> 내부에서 사용

       -  속성

           1)  id : 식별자로 advice 태그에서 사영됨

           2)  expression : pointcut 지정

                excution(접근제어자   리턴타입   패키지.클래스.메서드이름(인자타입) )

                excution(public void org.spring.kosta.TargetClass.methd1(String, String) )

                   => org.spring.kosta 패키지 TargetClass의 method1(String, String) 호출시 Advice의 메소드 호출

     

     

    ■  AspectJ 표현식

       -  AspectJ에서 지원하는 패턴 표현식

       -  명시자

           1) execution : 실행시킬 메소드 패턴을 직접 입력하는 경우

           2) within : 메소드가 아닌 특정 타입에 속하는 메소드들을 설정할 경우

           3) bean : 2.5버전에 추가됨. 설정파일에 지정된 빈의 이름(name 속성)을 이용해 pointcut 설정

     

       -  표현

           명시자(수식어패턴? 리턴타입패턴 패키지패턴? 클래스이름패턴.메소드이름패턴(파라미터패턴))  - ?는 생략가능

           예) excution(public * abc.def..*Service.set*(..))

     

       -  수식어 패턴에는 public, protected 또는 생략한다.

           1)  *  : 1개이상 모든 값을 표현

                  argument에서 쓰인 경우 : 1개 이상의 argument

                  package에 쓰인 경우  : 1개 이상의 하위 package

      

           2)  .. : 0개 이상

                  argument에서 쓰인 경우 : 0개 이상의 argument

                  package에 쓰인 경우  : 0개 이상의 하위 package

     

           ※ 위 예 설명

               적용 하려는 메소드들의 패턴은 public 제한자를 가지며 리턴 타입에는 모든 타입이 다 올 수 있다. 이름은 abc.def 

               패키지와 그 하위 패키지에 있는 모든 클래스 중 Service로  끝나는 클래스들에서 set으로 시작하는 메소드이며 

               argument는 0개 이상오며 타입은 상관 없다


    '공부방 > JSP' 카테고리의 다른 글

    Forward 와 Include  (0) 2013.03.14
    forward( ) vs. sendRedirect( )  (0) 2013.03.14
    DB접속 후 일반적인 작업 패턴  (0) 2013.01.28
    Oracle DAO  (0) 2013.01.28
    글 리스트 페이징 만들기 [다음10개]  (0) 2013.01.24
Designed by Tistory.