본문 바로가기

language/Spring

[Java/Spring] AOP Pointcut 표현식

반응형
XML 스키마 혹은 @Aspect 어노테이션을 이용해서 Aspect를 설정할 때 AspectJ 문법을 이용해서 Pointcut을 설정합니다.

- 다양한 Pointcut 명시자를 제공하지만 스프링에서는 메서드 호출과 관련된 명시자만 지원하고 있습니다.

 

Pointcut 표현식 종류

  • execution 명시자
  • within 명시자
  • bean 명시자
  • Pointcut의 조합

 

execution 명시자
execution 명시자는 Advice를 적용할 메서드를 명시할 때 사용합니다.
  • 기본 형식
execution(리턴타입패턴 패키지경로패턴.클래스이름패턴.메서드이름패턴(파라미터패턴))
  • 각 패턴은 "*"을 이용하여 모든 값을 표현할 수 있습니다.
  • "."을 이용해서 0개 이상이라는 의미를 표현할 수 있습니다.
  • 클래스이름 뒤에 +를 사용하여 해당 클래스로부터 파생된 모든 자식클래스를 선택합니다.
  • 인터페이스 이름 뒤에 +를 사용하면 해당 인터페이스를 구현한 모든 클래스를 선택합니다.
  • 예시

위 xml 설정에서 pointcut의 expression만 봐보면

이런식으로 볼 수 있고 밑 execution의 get*(..) 은 get으로 시작하는 모든 메소드와 메소드에 전해지는 파라미터가 0개 이상인 것으로 생각하면 됩니다.

 

within 명시자
within 명시자는 메서드가 아닌 특정타입에 속하는 메서드를 Pointcut으로 설정할 때 사용합니다.
  • 예시와 해설
within(zinc.spring.board.service.WriterArticleService)
<!-- WriteArticleService 인터페이스의 모든 메서드 호출) -->

within(zinc.spring.board.service.*)
<!-- zinc.spring.board.service 패키지에 있는 모든 메서드 호출 -->

within(zinc.spring.board..*)
<!-- zinc.spring.board 패키지 및 그 하위 패키지에 있는 모든 메서드 호출 -->

 

bean 명시자
스프링 빈이름을 이용하여 Pointcut을 정의
  • 예시와 해설
bean(writeArticleService)
<!-- 이름이 writeArticleService인 빈의 메서드 호출 -->

bean(*ArticleService)
<!-- 이름이 ArticleService로 끝나는 빈의 메서드 호출 -->

 

Pointcut의 조합
  • 각각의 표현식은 "&&" 나 "||" 연산자를 이용하여 연결할 수 있고 "and", "or"을 사용해도 된다.
반응형