티스토리 뷰

[JAVA]/Spring

[Spring] AOP 용어 정리

춘햄 2021. 6. 17. 15:30

1. Joinpoint:

조인포인트는 클라이언트가 호출하는 모든 비즈니스 메서드로서, 아래 설명할 개념인 포인트컷의 대상, 또는 후보가 되어 조인포인트 중 포인트 컷이 선택된다.

 

2. Pointcut:

클라이언트가 호출하는 모든 비즈니스 메서드가 조인포인트라면, 포인트컷은 필터링된 조인포인트를 의미한다. 

 

바로 예제를 보면,

<bean id = "log" class = "com.choonham.biz.board.common.LogAdvice"></bean>

<aop:config>
  <aop:pointcut expression="execution(* com.choonham.biz.board..*UserServiceImpl.*(..))" id="allPointcut"/>
  <aop:pointcut expression="execution(* com.choonham.biz.board..*UserServiceImpl.get*(..))" id="getPointcut"/>
</aop:config>
	

 

3. Advice:

어드바이스는 횡단 관심에 해당하는 공통 기능의 코드를 의미하며, 위 예제에서는 LogAdvice이다. 

또한 aop:before 나 after를 통해 advice를 실행하는 시점을 지정할 수 있다.

 

4. Weaving:

위빙은 포인트컷으로 지정한 핵심 관심 메서드가 호출될 때, advice에 해당하는 횡단 관심 메서드가 삽입되는 과정을 의미한다. 이 위빙을 통해서 메서드를 직접적으로 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.

5. Aspect: 

aspect는 포인트컷과 어드바이스의 결합으로서, 어떤 포인트컷 메서드에 어떤 어드바이스 메서드를 실행할 지 결정한다.


다음은 지금까지 살펴본 AOP 용어들을 하나의 그림으로 표현한 것이다.


AOP 엘리먼트

지금까지 AOP와 관련된 용어들을 정리했는데, 이제 해당 기능을 직접적으로 구현하기 위한 AOP 엘리먼트(태그)를 살펴보려고 한다. 

스프링은 AOP 설정을 XML 방식과 어노테이션 방식으로 지원하는데, 순차적으로 알아보자.

 

1. XML 방식

 

 1) <aop:config>

 루트 엘리먼트로, 스프링 설정 파일 내에서 여러 번 사용할 수 있다. <aop:config> 엘리먼트 하위에는 <aop:pointcut>, <aop:aspect> 엘리먼트가 위치할 수 있다.

<bean id = "log" class = "com.choonham.biz.board.common.LogAdvice"></bean>

<aop:config>
 ~
</aop:config>

 

 2) <aop:pointcut> 

 앞서 설명한 포인트컷을 지정하기 위해 사용하며, config 내에서 여러 개 정의할 수 있다. 그러나 id 값은 유일성을 만족해야 한다.

포인트컷은 advice메서드가 적용될 비즈니스 메서드를 expression=execution( ) 속성을 이용해 정확하게 필터링할 수 있는데, 이때의 표현식은 다음과 같다.

 - 리턴 타입:

표현식 설명
* 모든 리턴타입 허용
void 리턴타입이 void인 메서드 선택
!void 리턴타입이 void가 아닌 메서드 선택

 

 - 패키지 지정:

표현식 설명
com.choonham.biz 정확하게 com.choonham.biz 패키지만 선택
com.choonham.biz.. com.choonham.biz 패키지로 시작하는 모든 패키지를 선택
com.choonham..impl com.choonham 패키지로 시작하면서 마지막 패키지 이름이 impl로 끝나는 패키지

 

 -클래스 지정:

표현식 설명
BoardServiceImpl 정확하게 BoardServiceImpl 클래스만 선택
*Impl 클래스 이름이 Impl로 끝나는 클래스만 선택
BoardService+ 해당 클래스로부터 파생된 모든 자식 클래스 선택

 

 - 메서드 지정

표현식 설명
*(..) 가장 기본 설정으로 모든 메서드를 선택
get*(..) 메서드 이름이 get으로 시작하는 모든 메서드 선택

 

- 매개변수 지정

표현식 설명
(..) 매개변수 타입에 제한이 없다
(*) 반드시 1개의 매개변수를 가지는 메서드만 선택
(com.choonham.biz.UserVO) 매개변수로 UserVO를 가지는 메서드만 선택, 이떄 클래스의 패키지 경로가 필요
(!com.choonham.biz.UserVO) 매개변수로 UserVO를 가지지 않는 메서드만 선택
(Integer, ..) 한 개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메서드만 선택
(Integer, *) 반드시 두 개의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메서드만 선택 

 

 3) <aop:aspect>

 핵심 관심에 해당하는 포인트컷 메서드와 횡단 관심에 해당하는 어드바이스 메서드를 결합하기 위해 사용하며, 이 aspect를 어떻게 설정하느냐에 따라서 Weaving 결과가 달라지므로 AOP에서 가장 중요한 설정이라고 할 수 있다.

<bean id = "log" class = "com.choonham.biz.board.common.LogAdvice"></bean>

<aop:config>
  <aop:pointcut expression="execution(* com.choonham.biz.board..*UserServiceImpl.*(..))" id="allPointcut"/>
  <aop:pointcut expression="execution(* com.choonham.biz.board..*UserServiceImpl.get*(..))" id="getPointcut"/>
  
  <aop:aspect ref="log">
  	<aop:before  pointcut-ref="allPointcut" method = "printLog"/>
  </aop:aspect>
  
</aop:config>

위 코드는 log라는 id로 등록된 객체에 pringLog라는 메서드를 allPorintcut이라는 이름으로 필터링된 비즈니스 메서드가 호출되기 전에(before) 호출하여 사용한다는 의미이다.

 

 4) <aop:advisor>

 포인트컷과 어드바이스를 결합한다는 개념은 aspect와 동일하지만, 트랜잭션 설정과 같은 몇몇 특수한 경우에는 이 advisor를 사용해야 한다.

 

내부 메서드명을 모르는 외부 라이브러리의 경우 aspect를 사용할 수 없기 때문에 advisor를 사용한다.

 

이 advisor에 대한 설명은 추후에 트랜잭션에 대하여 다룰 때 자세하게 알아볼 것이기 때문에 따로 예제는 생략하겠다.

 

Comments