본문 바로가기

공부방/JSP

[Spring] AOP (Aspect Oriented Proramming)

■  핵심 관심 사항(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