AOP - Pointcut

귀찮Lee·2022년 6월 21일
0

Spring

목록 보기
11/30

◎ Pointcut

  • 포인트 컷(Pointcut)

    • 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 (조인 포인트를 결정)
    • 스프링 AOP는 프록시 방식을 사용하므로 메소드 실행 지점만 포인트 컷으로 선별 가능
  • 포인트컷 표현식(AspectJ pointcut expression)

    • AspectJ가 제공하는 포인트컷 표현식
    • 구성
    // {} 안에 구성들이 바뀌는 부분
    @{Advice}("{pointcut-designator}({parameter})")
    // 예시
    @Around("execution(public * start.aop.controller..*(..))")

◎ 포인트컷 지시자(Pointcut Designator, PCD)

  • 포인트컷 지시자

    종류설명
    execution메서드 실행 조인트 포인트를 매칭
    스프링 AOP에서 가장 많이 사용하며, 기능도 복잡
    within특정 타입 내의 조인 포인트를 매칭
    args인자가 주어진 타입의 인스턴스인 조인 포인트
    this스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트
    targetTarget 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트
    @target실행 객체의 클래스에 주어진 타입의 애너테이션이 있는 조인 포인트
    @within주어진 애너테이션이 있는 타입 내 조인 포인트
    @annotation메서드가 주어니 애너테이션을 가지고 있는 조인 포인트를 매칭
    @args전달된 실제 인수의 런타임 타입이 주어진 타입의 애너테이션을 갖는 조인 포인트
    bean스프링 전용 포인트컷 지시자이고 빈의 이름으로 포인트컷을 지정한다.
    • execution을 가장 많이 사용하고, 나머지는 자주 사용하지 않음
  • execution

    • 파라미터 값 표현형태가 특정 형식을 갖춤 (조건에 해당하는 메서드에서만 aop 실행)
    // {} 값이 변경 가능한 값임
    // ? 는 보통 생략해서 사용
    @{kind-of-Advice}("execution({modifiers-pattern}? {return-type-pattern} {declaring-type-pattern}? {method-name-pattern}({param-pattern}) {throws-pattern}?)")
    // 예시
    @Around("execution(public * start.aop.controller..*(..))")
    • modifiers-pattern : 접근 제어자 지정 (public, private, *)
    • return-type-pattern : 리턴 타입 지정 (void, String, *)
    • declaring-type-pattern (패키지 위치 필요)
      • start.aop.controller.* - controller 패키지의 모든 클래스에 적용
      • start.aop.controller.. - controller 패키지 및 하위 패키지의 모든 클래스에 적용
    • method-name-pattern : 메서드 이름 지정
      • addFolders : addFolders() 메서드에만 적용
      • add* : add 로 시작하는 모든 메서드에 적용
    • param-pattern : 특정 파라미터 지정
      • ({특정 클래스 주소}) : 그 클래스/인터페이스가 파라미터인 메서드에 적용
      • () : 인수 없음
      • (*) : 인수 1개 (타입 상관없음
      • (..) : 인수, 타입 상관없음
  • 기타 (Spring AOP 에서만 실행가능)

    • within(start.aop.controller) : 패키지 내의 모든 조인 포인트
    • this(start.aop.service.AccountService) : AccountService 프록시가 인터페이스를 구현하는 모든 조인 포인트
    • target(start.aop.service.AccountService) : AccountService 대상 객체가 인터페이스를 구현하는 모든 조인 포인트
    • args(java.io.Serializable) : 런타임에 전달된 인수가 해당 매개변수인 경우
    • @target(org.springframework.transaction.annotation.Transactional) : 대상 객체에 @Transactional 애너테이션이 있는 모든 조인 포인트
    • @annotation(org.springframework.transaction.annotation.Transactional) : : 대상 매서드에 @Transactional 애너테이션이 있는 모든 조인 포인트
    • @args(com.xyz.security.Classified) : 인수의 런타임 유형이 @Classified 애너테이션을 갖는 조인 포인트

◎ 포인트컷 부가기능

  • 표현식 결합 및 재사용

    @Component
    @Aspect
    public class Aspect {
        @Pointcut("execution(* start.aop.service.controller.*.*(..))")
        private void forAllController() {}
    
        @Pointcut("execution(String start.aop.service.controller.*.*())")
        private void forAllViewController() {}
        
        // 메서드 이름을 가져와서 해당 조건으로 사용 가능
        @Around("forAllContorller() && !forAllViewController")
        public void saveRestApiLog() {
            ...
        }
        
        // 메서드를 그대로 가져오는 것도 가능
        @Around("forAllContorller()")
        public void saveAllApiLog() {
            ...
        }	
    }
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글