본문 바로가기
Java/Spring

[Spring] 스프링 AOP Pointcut 표현식

by WaterPunch 2021. 8. 18.

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

( ※ Pointcut : 특정 조건에 의해 필터링된 Joinpoint, 수많은 Joinpoint 중에 특정 메서드에서만 공통기능(횡단관심사)을 수행시키기 위해서 사용한다)

지시자(PCD, AspectJ pointcut designators)의 종류

(PCD : 흔히 우리가 사용하고 있는 execution이라든지 @annotation 지정자를 PointCut Desinator라 하여 통상 "PCD"라 불림

              PCD는 타깃의 여러 Joinpoint  중에 어드바이스를 어디에 적용을 시킬지, AOP에게 알려주는 키워드라고 할 수 있음)

 

1. execution : 가장 정교한 포인트컷을 만들 수 있음 

                  리턴타입 패키지경로 클래스명 메서드명(매개변수)

예시)

<aop:pointcut id="logAspectPointCut" expression="execution(public * co.kr.mono.aop.entity.Person.*(..))>"

 

              co.kr.mono.aop.entity 패키지에 있는 Person 클래스의 모든 메서드(매개변수)

 

2. within : 타입패턴 내에 해당하는 모든 것들을 포인트컷

 

3. bean : bean 이름으로 포인트컷


리턴타입 지정

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

 

패키지 지정

표현식 설명
co.kr.mono.aop.entity 정확하게 co.kr.mono.aop.entity 패키지만 선택
co.kr.mono.aop.entity.. co.kr.mono.aop.entity.. 패키지로 시작하는 모든 패키지 선택
co.kr.mono.aop.entity..impl co.kr.mono.aop.entity.. 패키지로 시작하고 마지막 패키지 이름이 impl로 끝나는 패키지 선택

클래스 지정

표현식 설명
Printer 정확하게 Printer 클래스만 선택
*Printer 이름이 Printer로 끝나는 클래스만 선택 (ColorPrinter, MonoPrinter)
Printer+ 해당 클래스로 파생된 모든 자식 클래스 선택, 인터페이스 구현된 모든 클래스 선택
BasicObject 클래스 이름 뒤에 '+'가 붙으면 해당 클래스로부터 파생된 모든 자식 클래스 선택, 인터페이스 이름 뒤에 해당 인터페이스를 구현한 모든 클래스 선택

메서드 지정

표현식 설명
*(..) 모든 메서드 선택
print*(..) 메서드명이 print로 시작하는 모든 메서드 선택

매개변수지정

표현식 설명
(..) 모든 매개변수
(*) 반드시 1개의 매개변수를 가지는 메서드만 선택
(com.devljh.domain.user.model.User) 매개변수로 User를 가지는 메소드만 선택.
꼭 풀패키지명이 있어야함
(!com.devljh.domain.user.model.User) 매개변수로 User를 가지지않는 메소드만 선택
(Integer, ..) 한 개 이상의 매개변수를 가지되, 첫번째 매개변수의 타입이 Integer인
메서드만 선택
(Integer, *) 반드시 두 개의 매개변수를 가지되, 첫번째 매개변수의 타입이 Integer인
메서드만 선택 

 

JoinPoint 인터페이스

횡단 관심사에 해당하는 advice 메서드를 의미있게 구현하기 위해서는

클라이언트가 호출한 비즈니스 메서드의 정보가 필요하다

   ex) After Throwing 어드바이스 메서드를 구현할 때, 예외발생 메서드 이름이 무엇이며, 해당 메서드가 속한 클래스,

       패키지 정보가 무엇인지 등등을 정확한 예외처리 로직을 구현할 수 있게 된다 

 

스프링에서는 이런 다양한 정보들을 이용할 수 있도록 하기 위해서 JoinPointing 인터페이스를 제공한다


Spring JoinPoint에서 제공하는 메서드들

 

Signature getSignature()

 - 클라이언트가 호출한 메서드의 시그니처 (리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체를 리턴

 

 - getSignature() 메서드가 리턴하는 Signature 객체를 사용하면

   호출되는 메서드에 대한 다양한 정보를 얻을 수 있는데

   Signature 객체가 제공하는 메서드들은 다음과 같음

String getName() 클라이언트가 호출한 메서드 이름 리턴
String toLongString() 클라이언트가 호출한 메서드의 리턴타입, 이름, 매개변수를 패키지 경로까지 포함해서 리턴
String toShortString() 클라이언트가 호출한 메서드의 시그니처를 축약한 문자열로 리턴

 

Object getTarget()

 - 클라이언트가 호출한 비즈니스 메서드를 포함하는 비즈니스 객체를 리턴

   (해당 클래스 객체를 리턴)

 

Object[] getArgs()

 - 클라이언트가 메서드를 호출할 때 넘겨준 인자 목록을 Object 배열로 리턴


 

 

참고출처

https://sjh836.tistory.com/157

 

Spring AOP (개념, 용어, 원리, 포인트컷 표현식, JoinPoint API)

1. AOP란? Aspect Oriented Programming 의 약자로 관점지향 프로그래밍이라고 부른다. IoC가 낮은 결합도와 관련된 것이라면 AOP 는 높은 응집도와 관련되어 있다. 서비스들의 비즈니스 메소드들은 복잡한

sjh836.tistory.com

http://closer27.github.io/backend/2017/08/03/spring-aop/

 

Spring AOP · 어느 개발자의 한적한 공간

Spring AOP 2017.08.03 Day 2 - 스프링 AOP(Aspect Oriented Programming) 개요 낮은 결합도 높은 응집도는 기본, DI는 낮은 결합도를 위한 것이라면 AOP는 높은 응집도를 위한 것 엔터프라이즈 애플리케이션들은 보

closer27.github.io

https://heidish.tistory.com/70

 

[AOP] JoinPoint 와 바인드 변수

횡단 관심에 해당하는 어드바이스 메소드를 의미있게 구현하기 위해서는 클라이언트가 호출한 비즈니스 메소드의 정보가 필요하다. 예를들어 After Throwing 어드바이스 메소드를 구현할 때, 예외

heidish.tistory.com

 

반응형

댓글