728x90
AspectJ Pointcut Expression Language는 AspectJ에서 사용되는 강력한 도구로, 특정 시점이나 조건을 기준으로 프로그램의 실행 흐름에 끼어들기 위한 규칙을 정의하는 데 사용됩니다. 이 표현식 언어는 AOP(Aspect-Oriented Programming)의 핵심 요소 중 하나로, 개발자가 코드의 특정 부분(예: 메서드 호출, 객체 초기화 등)을 선택적으로 가로채고 로직을 삽입할 수 있도록 합니다.
주요 개념
- Join Point (조인 포인트)
- 프로그램 실행 중의 특정 지점, 예를 들어 메서드 호출, 객체 생성, 예외 처리 등.
- AspectJ는 다양한 종류의 조인 포인트를 지원합니다.
- Pointcut (포인트컷)
- 조인 포인트를 선택하는 규칙을 정의하는 표현식.
- 포인트컷은 프로그램의 어떤 부분에서 Advice(추가 동작)를 적용할지 결정합니다.
- Advice (어드바이스)
- 포인트컷에 의해 선택된 조인 포인트에서 실행될 동작(코드).
728x90
주요 표현식
AspectJ의 포인트컷 표현식은 직관적이면서도 정교하게 실행 흐름을 선택할 수 있도록 설계되어 있습니다.
- Execution
- 특정 메서드 실행 지점을 선택.
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
- 예제*:
execution(public * com.example..*(..))
com.example
패키지의 모든 클래스에서 public 메서드를 선택.
- 특정 메서드 실행 지점을 선택.
- Call
- 메서드 호출 지점을 선택.
call(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
- 예제*:
call(* com.example.Service.*(..))
com.example.Service
클래스의 모든 메서드 호출을 선택.
- 메서드 호출 지점을 선택.
- Within
- 특정 클래스 또는 패키지 내의 모든 조인 포인트를 선택.
within(type-pattern)
- 예제*:
within(com.example..*)
com.example
패키지 및 하위 패키지에 속한 모든 클래스에서 동작.
- 특정 클래스 또는 패키지 내의 모든 조인 포인트를 선택.
- This / Target
this
: 특정 객체 인스턴스에서 실행되는 조인 포인트.target
: 실행되는 조인 포인트의 대상 객체.this(type-pattern) target(type-pattern)
- 예제*:
this(com.example.MyService) target(com.example.MyService)
- Args
- 조인 포인트의 메서드에 전달된 인수의 타입을 기반으로 선택.
args(argument-pattern)
- 예제*:
args(String, ..)
- 첫 번째 인자가
String
이고 나머지 인자의 타입은 상관없는 모든 메서드.
- 조인 포인트의 메서드에 전달된 인수의 타입을 기반으로 선택.
- Annotation
- 특정 어노테이션이 적용된 메서드, 클래스 등을 선택.
@annotation(annotation-type)
- 예제*:
@annotation(javax.transaction.Transactional)
@Transactional
어노테이션이 붙은 메서드를 선택.
- 특정 어노테이션이 적용된 메서드, 클래스 등을 선택.
728x90
결합 표현식
다양한 Pointcut을 조합하여 복잡한 조건을 정의할 수 있습니다.
- AND (
&&
): 모든 조건을 만족. - OR (
||
): 하나라도 만족. - NOT (
!
): 부정.
예제:
execution(* com.example..*(..)) && @annotation(org.springframework.transaction.annotation.Transactional)
com.example
패키지 내의 메서드 중@Transactional
어노테이션이 있는 메서드.
사용 예
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Method called: " + joinPoint.getSignature());
}
}
com.example.service
패키지의 모든 메서드가 실행되기 전에 로그를 출력.
장점
- 코드 중복 감소: 핵심 로직과 부가 기능(로깅, 트랜잭션 등)을 분리 가능.
- 가독성 향상: 프로그램의 구조가 더 명확해짐.
- 유연성: 다양한 조건 조합으로 실행 흐름을 정교하게 제어.
요약
AspectJ Pointcut Expression Language는 프로그램의 특정 동작을 정밀하게 제어할 수 있는 강력한 도구로, 유지보수성과 재사용성을 극대화할 수 있습니다. AOP를 활용한 모듈화된 코드 작성에 핵심적인 역할을 합니다.
728x90
'SpringBoot 를 배워보자' 카테고리의 다른 글
Spring Boot 프로젝트에 Swagger UI 적용하여 API 문서 자동 생성하기: 상세 가이드 (0) | 2024.12.02 |
---|---|
MyBatis를 활용한 유연하고 효율적인 동적 SQL(Json&Pageing) 전략 (0) | 2024.11.30 |
스프링 부트 AOP(Aspect Oriented Programming) 심층 분석: 예제와 함께하는 상세 가이드 (0) | 2024.11.17 |
Log4j2: 강력하고 유연한 자바 로깅 프레임워크 심층 분석 (0) | 2024.11.17 |
Log4j 설정을 재시작 없이 변경하며 SQL 쿼리 소스 생성 여부를 조절하는 방법: 심층 분석 및 실제 적용 가이드 (0) | 2024.11.17 |