본문 바로가기
IT/SPRING

AOP 용어

by dya0 2019. 7. 4.

AOP(Aspect Oriented Programming)의 정의

- 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용을 눂여주는 프로그래밍 기법이다.
- AOP 핵심 기능과 공통 기능의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용할 수 있게 만들어 준다.
- 애플리케이션을 개발하기 위하여 관심을 가지고 구현 해야 하는 각각의 기능들을 관심 사항(Concern)이라 한다.

AOP 용어

1) 공통 기능의 코드 :  횡단(공통) 관심 사항(cross-cutting concern)  예) 로깅, 트랜잭션 처리 
2) 핵심 기능의 코드 : 핵심 관심 사항 (core concern)

**************AOP의 주요 용어************************
1. 타겟(Target)  핵심 기능이 구현된 객체로 공통기능의 적용대상이 되는 객체를 의미한다.

2. 조인 포인트(JoinPoint) Target이 가진 메서드를 의미하여 조인 포인트 중에서 포인트 컷이 선택한다.

3. 포인트 컷(PointCut)
Target이 가진 메서드 메서드가 조인포인트라면 포인트 컷은 필터링된 조인 포인트를 의미한다.
예를 들어, 트랜잭션을 처리하는 공통 기능을 만들었다고 하면 이 횡단 관심 기능은 등록, 수정,
삭제 기능의 비즈니스 메서드에 대해서는 다연히 동작해야 하지만, 검색 기능의 메소드에 대해서는 
트랜잭션과 무관하므로 동작할 필요가 없다.
이렇게 수많은 비즈니스 메소드 중에서 우리가 원하는 특정 메서드에서만 횡단 관심에 해당하는 
공통 기능을 수행시키기 위해서 포인트 컷이 필요하다.
포인트 컷을 이용하면 메서드가 포함된 클래스와 패키지는 물론이고 메서드 시그니처까지 
정확하게 지정할 수 있다. 

 1)포인트 컷 표현식 사용 방법
 표현식을 통해서 포인트 컷을 필터링 할 수 있다. 
 사용방법은 아래와 같다
    expression="execution(* com.json.jsonroot.,*impl.get*(..))"/>
 
  *  com.json.jsonroot.. *Impl . get*(..)
  리턴타입 패키지 경로  클래스 명  메서드 명 및 매개변수
 
  => com.json.jsonroot패키지로 시작하는 클래스 중에서 Impl로 끝나는 
  클래스의 get으로 시작하는 모든 메서드만 pointcut으로 설정한다.
 2) 표현식
  1) 리턴 타입의 경우
  *    : 모든 리턴 타입
  void  : 리턴 타입이 void 인 메서드 선택
  !void  : 리턴 타입이 void가 아닌 메서드 선택
 
  2) 패키지 경로
  com.json.jsonrootcom.json.jsonroot 패키지만 선택
  com.json.jsonroot..com.json.jsonroot 패키지로 시작하는 모든 패키지 선택
 
  3) 클래스 지정
  ServiceImpl : ServiceImpl 클래스 선택
  *Impl  : 클래스 이름이 Impl로 끝나는 클래스만 선택
 
  4) . : 클래스와 메서드 구분한다.
 
  5) 메서드 지정
  * : 모든 메서드 선택
  get* : 메서드 이름이 get으로 시작하는 모든 메서드 선택
 
  6) 매개변수 지정
  (..)  : 매개변수의 개수와 타입에 제약이 없음을 의미
  (*) : 반드시 1개의 매개변수를 가지는 메서드만 선택
  (Integer, ..) : 한 개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메서드만 선택
  (Integer, *) : 두 개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메서드만 선택
 
 
 4. 어드바이스 (Advice)
 횡단 관심에 해당하는 공통 기능의 코드를 의미한다. 
 독립된 클래스의 메서드로 작성된다.
 어드바이스로 구현된 메서드가 언제 동작할지 스프링 설정 파일을 통해서 지정할 수 있다.
 
 동작 시점 : 
  1) Around  : 대상 객체(target)의 메소드 실행 전, 후 발생 시점에 공통 기능을 실행하는 데 사용된다. 
  2) Before  : 대상 객체의 메소드 호출 전에 공통 기능을 실행한다.
  3) After  : 대상 객체의 메소드를 실행하는 도중에 익셉션이 발생했는지의 여부에 상관없이 메서드 실행 후 공통 기능을 실행한다.
  4) After Returning  : 대상 객체의 메서드 호출이 정상적으로 종료될 후에 실행한다.
  5) After Throwing  : 대상 객체의 메서드를 수행하다가 예외가 발생할 때 동작한다. 
 
 5. 위빙(Weaving)
  위빙은 포인트 컷으로 지정한 핵심 관심 메서드가 호출될 때 
  어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정을 의미한다.
 
  이 위빙을 통해서 비즈니스 메서드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.
 
  방식 : 컴파일 타임 위빙, 로딩 타임 위빙, 런타임 위빙
  1) 컴파일 시점에 코드에 공통 기능을 추가하는 방법이다.
  2) 클래스 로딩 시점에 바이트 코드에 공통 기능을 추가하는 방법이다.
  3) 런타입에 공통 기능을 추가하는 방법이다. (스프링이 제공하는 AOP방식)
 
 6. 애스팩트(Aspect) 또는 어드바이저(Advisor)
  여러 객체에 공통으로 적용되는 기능을 분리하여 작성한 클래스이다. 
  AOP의 핵심은 Aspect이다. 이것은 포인트 컷과 어드바이스의 결합으로 어떤 포인트 컷 메서드에 대해서
  어떤 어드바이스를 실행할지 결정한다. 이 에스캑트 설정에 따라 AOP의 동작 방식이 결정된다.
 
 7. servlet-context.xml 설명 
 

1
2
3
4
5
6
7
     <beans:bean id="log" class ="com.json.jsonroot.common.LogAdvice"></beans:bean>
     
         <aop:config>
             <aop:aspect ref="log" expression="execution(* com.json.jsonroot..*Impl.get*(..))"/>
                 <aop:before pointcut-ref="getPointcut" method="beforeLog"/>
             </aop:aspect>    
         </aop:config>
 
lcs

 1) AOP를 xml으로 설정하기
  1) AOP 설정의 root 엘리먼트 : 
  2)  엘리먼트 : 포인트 컷을 지정하기 위해 사용하며 여러 개 정의할 수 있다.
  id 속성 : 포인트 컷을 구분한다.
  expression 속성 : execution 명시자를 이용하여 Advice 메서드가 적용도리 비즈니스 메서드를 필터링한다. 
 
  com.json.jsonroot..*Impl.get*(..))"/>
  => com.json.jsonroot 패키지로 시작하는 클래스 중에서 Impl로 끝나는 클래스의 get으로 시작하는 모든 메서드만 pointcut으로 설정한다.
 
  3)  엘리먼트 : 핵심 관심에 해당하는 포인트 컷 메서드와 횡단 관심에 대항하는 Advice메서드를 결합하기 위해 사용한다.
 
  ref 속성  : Advice 객체를 설정 (Advice 객체의 아이디를 설정)
   엘리먼트  : Advice의 동작 시점 
  pointcut-ref 속성  :  엘리먼트의 id 설정
  method 속성  : Advice 객체의 실행할 메서드 설정
 
1
2
3
             <aop:aspect ref="log">
                 <aop:before pointcut-ref="getPointcut" method="beforeLog"/>
             </aop:aspect>
cs
  ==> getPointcut으로 설정한 메서드가 실행 전에 log라는 객체의 beforeLog 메서드가 실행된다. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

'IT > SPRING' 카테고리의 다른 글

Q  (0) 2019.07.16
[Spring]AOP  (0) 2019.07.04
[Spring] 스프링 계층 구조  (0) 2019.06.26
[Spring] 값 보내기  (0) 2019.06.26
[SPRING]Spring MVC web.xml에 filter 기능 추가  (0) 2019.06.21