기본 표현식 패턴

(접근제한자-패턴? 리턴타입-패턴 클래스이름패턴?메서드이름패턴(파라미터패턴))

execution() - 메서드 실행

// 모든 public 메서드
@Pointcut("execution(public * *(..))")

// com.example.service 패키지의 모든 메서드
@Pointcut("execution(* com.example.service.*.*(..))")

// com.example 패키지와 하위 패키지의 모든 메서드
@Pointcut("execution(* com.example..*.*(..))")

// UserService 클래스의 모든 메서드
@Pointcut("execution(* com.example.service.UserService.*(..))")

// find로 시작하는 모든 메서드
@Pointcut("execution(* *.find*(..))")

// String을 리턴하는 모든 메서드
@Pointcut("execution(String *.*(..))")

// 파라미터가 없는 메서드
@Pointcut("execution(* *.*())")

// String 타입 파라미터 하나만 받는 메서드
@Pointcut("execution(* *.*(String))")

// 첫 번째 파라미터가 String인 메서드
@Pointcut("execution(* *.*(String, ..))")

// 마지막 파라미터가 String인 메서드  
@Pointcut("execution(* *.*(*, String))")

// Long 타입을 리턴하고 파라미터가 하나인 메서드
@Pointcut("execution(Long *.*(*))")

@within() - 타입 기반 매칭

특정 타입(클래스/인터페이스) 내부의 모든 조인포인트 매칭

// UserService 클래스 내의 모든 메서드
@Pointcut("within(com.example.service.UserService)")

// com.example.service 패키지 내의 모든 클래스의 모든 메서드
@Pointcut("within(com.example.service.*)")

// com.example 패키지와 하위 패키지의 모든 클래스
@Pointcut("within(com.example..*)")

// Service로 끝나는 모든 클래스
@Pointcut("within(*Service)")

// 인터페이스 구현체들
@Pointcut("within(com.example.repository.UserRepository+)")

클래스에 특정 어노테이션이 붙어 있는 경우 모든 메서드 매칭

// @Service 어노테이션이 붙은 클래스의 모든 메서드
@Pointcut("@within(org.springframework.stereotype.Service)")

// @Repository 어노테이션이 붙은 클래스의 모든 메서드
@Pointcut("@within(org.springframework.stereotype.Repository)")

// @Transactional 어노테이션이 붙은 클래스의 모든 메서드
@Pointcut("@within(org.springframework.transaction.annotation.Transactional)")

// 커스텀 어노테이션
@Pointcut("@within(com.example.annotation.Auditable)")

@annotation() - 메서드 어노테이션

특정 어노테이션이 붙은 메서드만 매칭

// @Transactional이 붙은 메서드만
@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")

// @PostMapping이 붙은 메서드만
@Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")

// 여러 어노테이션 조합
@Pointcut("@annotation(GetMapping) || @annotation(PostMapping)")

// 커스텀 어노테이션
@Pointcut("@annotation(LogExecutionTime)")

target() - 실제 대상 객체 타입

실제 대상 객체가 특정 타입인 경우 매칭

// 실제 객체가 UserService 타입인 경우
@Pointcut("target(com.example.service.UserService)")