본문 바로가기
👨‍💻 2. 웹개발_Back end/2-6 Spring

[Spring] 2장 AOP 용어 및 기본 설정 - AOP 엘리먼트 (포인트컷, 어드바이스, 애스팩트, 어드바이저)와 포인트컷 표현식

by 달님🌙 2021. 10. 27.
반응형

 

실습 코드 참조

 

moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (github.com)

 

GitHub - moonhy7/SpringFramework: Spring Framework 실습 코드 정리

Spring Framework 실습 코드 정리. Contribute to moonhy7/SpringFramework development by creating an account on GitHub.

github.com

 

 

2.1절 AOP 용어 정리

 

1. 조인포인트(Joinpoint)

 

- 조인포인트 : 클라이언트가 호출하는 모든 비즈니스 메소드

- Impl 클래스의 모든 메소드를 조인포인트라고 함

- 포인트컷 대상, 포인트컷 후보라고도 함

- expression에서 지정한 클래스의 모든 메소드들이 대상이 됨

 

2. 포인트컷(Pointcut) ( _027_BoardWeb_AOP_Pointcut )

 

1) 포인트컷 개념

- 포인트컷 : 실제 aop가 적용될 클래스 메소드들. 조인포인트에서 필터링해서 원하는 메소드에만 적용함

 

2) 포인트컷 예시

 transaction을 처리하는 공통 기능을 만들었을 때 등록, 수정, 삭제 기능에는 트랜잭션이 동작해야하지만 조회 기능에는 트랜잭션이 동작할 필요없음 (commit, rollback)

- 포인트컷이 필요한 이유 : 특정 메소드에서만 횡단 관심에 해당하는 공통 기능을 수행시키기 위해서 필요

- 포인트컷을 이용하면 메소드가 포함된 클래스와 패키지는 물론, 메소드 시그니처까지 정확하게 지정 가능

 

3) 스프링 설정 파일

- 포인트컷은 <aop:pointcut> 엘리먼트로 선언하며, id 속성으로 포인트컷을 식별하기 위한 유일한 문자열을 선언

<!-- AOP 설정 -->
<aop:config>
    <aop:pointcut expression="execution(* com.springbook.biz..*Impl.*(..))" id="allPointcut"/>
    <aop:pointcut expression="execution(* com.springbook.biz..*Impl.get*(..))" id="getPointcut"/>
    
    <aop:aspect ref="log">
    	<aop:before pointcut-ref="getPointcut" method="printLog"/>
    </aop:aspect>
</aop:config>

 

4) expression 속성 구조

① allPointcut : 리턴타입과 매개변수를 무시하고 com.multicampus.biz 패키지로 시작하는 클래스 중에서 이름이 Impl로 끝나는 클래스의 모든 메소드를 포인트컷으로 설정함

② getPointcut : allPointcut과같지만 get으로 시작하는 메소드만 포인트컷으로 설정

 

5) getPoint 테스트

- <aop:before> 엘리먼트에서 allPointcut을 참조했던 부분을 getPointcut으로 수정

<!-- AOP 설정 -->
<aop:config>
    <aop:pointcut expression="execution(* com.springbook.biz..*Impl.*(..))" id="allPointcut"/>
    <aop:pointcut expression="execution(* com.springbook.biz..*Impl.get*(..))" id="getPointcut"/>
    
    <aop:aspect ref="log">
    		<aop:before pointcut-ref="getPointcut" method="printLog"/>
    </aop:aspect>
</aop:config>

 

6) getPoint 테스트 실행 결과

- get으로 시작하는 메소드 호출에 대해서만 반응하는 것을 확인

 

3. 어드바이스(Advice) ( _028_BoardWeb_AOP_Advice )

 

1) 어드바이스 개념

- 어드바이스 : 횡단관심에 해당되는 공통 기능의 코드를 의미함

- 어드바이스로 구현된 메소드가 언제 동작할지 스프링 설정 파일을 통해서 지정 가능

 

2) 어드바이스 예시

- LogAdive 클래스의 printLog 메소드가 어드바이스에 해당됨

- transaction(commit, rollback) : 비즈니스 로직 실행 전에 동작해봤자 의미가 없음

- 어드바이스의 동작시점을 이용해서 원하는 시점에 어드바이스가 실행되도록 설정

- 스프링에서 어드바이스의 동작 시점은 before, after, after-returning, after-throwing, around 다섯 가지로 지정

 

3) 어드바이스 테스트

- LogAdvice의 printLog() 메소드가 비즈니스 메소드 실행 후에 동작하도록 설정 (after 사용)

<aop:aspect ref="log">
	<aop:after pointcut-ref="getPointcut" method="printLog"/>
</aop:aspect>

 

4) 어드바이스 실행 결과

- getBoard() 메소드가 실행된 이후에 printLog() 메소드가 실행된 것을 확인

 

 

4. 위빙(Weaving)

 

- 위빙 : 포인트컷으로 지정한 핵심 관심 메소드가 호출될 때 어드바이스에 해당하는 관심 메소드가 삽입되는 과정

- 위빙을 통해 비즈니스 메소드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경 가능

- 위빙을 처리하는 방식 : 컴파일타임 위빙, 로딩타임 위빙, 런타임 위빙

- 스프링에서는 런타임 위빙 방식만 지원

 

5. 애스팩트(Aspect) 또는 어드바이저(Advisor)

 

1) 애스팩트(Aspect) 

- 애스팩트는 포인트컷과 어드바이스의 결합

- 어떤 포인트컷 메소드에 대해 어떤 어드바이스 메소드를 실행할지 결정

- 애스팩트 설정에 따라 AOP의 동작 방식이 결정되므로 AOP 용어 중 가장 중요한 개념임

 

2) 애스팩트 설정 예시

① getPointcut으로 설정한 메소드가 호출될 때

② log라는 어드바이스 객체의

③ printLog() 메소드가 실행됨

④ printLog() 메소드 동작 시점이 before임

 

3) 애스팩트 vs 어드바이저

- 트랜잭션 설정에서는 <aop:aspect> 대신 <aop:advisor>를 사용

- 여기서는 애스팩트와 어드바이저가 같은 의미라고 알면 됨 (자세한 건 트랜잭션 설정에서 다룰 예정)

 

6. AOP 용어 종합

 

① 시스템을 사용하면서 비즈니스 컴포넌트의 여러 조인포인트를 호출하게 됨

② 특정 포인트컷으로 지정한 메소드가 호출되는 순간에

③ 어드바이스 객체의 어드바이스 메소드가 실행됨

④ 어드바이스 메소드 동작 시점을 before, after, after-returning, after-throwing, around 5가지로 지정

- 포인트컷으로 지정한 메소드가 호출될 때 어드바이스 메소드를 삽입하도록 하는 설정을 애스팩트라고 함

⑤ 이 애스팩트 설정에 따라 위빙이 처리됨

 

2.2절 AOP 엘리먼트

 

1. <aop:config> 엘리먼트

 

- <aop:config> : 루트 엘리먼트이며 설정 파일 내에서 여러 번 사용 가능

- 하위 엘리먼트로는 <aop:pointcut>와 <aop:aspect>가 있다.

포함 관계

 

2. <aop:pointcut> 엘리먼트

 

- <aop:pointcut> : 포인트컷을 지정하기 위해 사용

- <aop:config>나 <aop:aspect>의 자식 엘리먼트로 사용할 수 있음

- <aop:aspect> 하위에 설정된 포인트컷은 해당 <aop:aspect>에서만 사용이 가능함

- <aop:pointcut>은 여러 개 정의 가능, 유일한 아이디를 할당하여 애스팩트를 설정할 때 포인트컷을 참조하는 용도

- allPointcut : com.springbook.biz 패키지로 시작하는 클래스 중 Impl로 끝나는 클래스의 모든 메소드를 포인트컷으로 설정

- 애스팩트 설정에서 <aop:before> 엘리먼트의 pointcut-ref 속성으로 포인트컷을 참조하고 있음

 

3. <aop:aspect> 엘리먼트

 

- 애스팩트는 <aop:aspect> 엘리먼트로 설정

- 핵심 관심에 해당하는 포인트컷 메소드와 횡단 관심에 해당하는 어드바이스 메소드를 결합하기 위해 사용

- 애스팩트 설정에 따라 위빙 결과가 달라지므로 가장 중요한 설정임

① getPointcut으로 설정한 메소드가 호출될 때

② log라는 어드바이스 객체의

③ printLog() 메소드가 실행됨

④ printLog() 메소드 동작 시점이 before임

 

4. <aop:advisor> 엘리먼트

 

1) 어드바이저 개념

- <aop:advisor> 엘리먼트 : 포인트컷과 어드바이스를 결합한다는 점에서 애스팩트와 같은 기느

- 하지만 트랜잭션 설정과 같은 몇몇 특수한 경우에는 애스팩트가 아닌 어드바이저를 사용해야함

 

2) 애스팩트 예시

- AOP 설정에서 애스팩트를 사용하려면 어드바이스의 아이디와 메소드 이름을 알아야함

 

3) 어드바이저 예시

- 어드바이스 객체의 아이디를 모르거나 메소드 이름을 확인할 수 없을 때 애스팩트를 사용할 수 없음

- 스프링 컨테이너는 <tx:advice> 엘리먼트를 해석하여 트랜잭션 관리 기능의 어드바이스 객체를 생성함

- <tx:advice>를 어떻게 설정했느냐로 어드바이스의 기능과 동작 방식이 달라짐

<tx:advice id="txAdvice" transaction-manager="txManager">
  <tx:attributes>
    <tx:method name="get*" read-only="true"/>
    <tx:method name="*"/>
  </tx:attributes>
</tx:advice>

<aop:config>
  <aop:pointcut expression="execution(* com.springbook.biz..*(..))" id="txPointcut"/>
  <aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/> //메소드 이름을 모를 때
</aop:config>

 

- 이렇게 생성된 어드바이스의 아이디는 확인이 가능하지만 메소드 이름은 확인할 방법이 없음

- 이럴 때 <aop:aspect> 대신 <aop:advisor> 엘리먼트 사용

 

 

2.3절 포인트컷 표현식

 

1. 포인트컷 특징

 

- 포인트컷을 이용하면 어드바이스 메소드가 적용될 비즈니스 메소드를 정확하게 필터링할 수 있다.

- 포인트컷 표현식은 execution 명시자를 이용하며 execution 명시자 안에 포인트컷 표현식을 기술함

 

2. 포인트컷 전체 구조

 

3. 표현식

 

1) 리턴타입 지정

 

2) 패키지 지정

 

3) 클래스 지정

 

4) 메소드 지정

 

5) 매개변수 지정

 

 

반응형

댓글