티스토리 뷰
AOP란? (Aspect Oriented Programming)
AOP는 주요 비즈니스 로직 외에 로깅, 보안, 트랜잭션 처리 처럼 여러 곳에 공통적으로 사용되는 기능을 비즈니스 로직과 분리해 코드를 중복 없이 관리하는 프로그래밍 기법을 말한다.
주요 개념
aspect: 공통 기능을 추출한 모듈을 말한다.(클래스)pointcut: 어떤 join point에 advice를 적용할지를 결정하는 조건 또는 필터 역할을 한다.join point: 공통 기능(advice)이 실행되는 지점을 말한다. Spring AOP에서는 항상 메서드 실행 시점만 JoinPoint로 간주한다.advice: 공통 기능을 말한다.
AOP 예제 코드
@Aspect
@Component
public class AOPExample {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
//파라미터 JoinPoint는 실행 지점의 정보를 담고 있는 객체이다.
System.out.println(joinPoint.getSignature().getName()); //메서드 이름
System.out.println(joinPoint.getTarget()); //대상 객체
System.out.println(joinPoint.getArgs()); //인자 목록
};
}
advice 실행 시점 어노테이션
@Before– 메서드 실행 전@After– 메서드 실행 후@AfterReturning– 메서드가 정상 종료된 후@AfterThrowing– 예외 발생 시@Around– 메서드 실행 전후 전체 감싸기 (가장 강력)
advice 파라미터 종류
advice를 실행할 시점은 @Before, @After, @AfterReturning, @Around 등 다양한 어노테이션으로 지정할 수 있습니다.
이 중 @Around는 대상 메서드의 실행을 직접 해야하기 때문에 ProceedingJoinPoint 를 파라미터로 전달받습니다.
또한, args(...), @annotation(...) 같은 PointCut 표현식을 사용하는 경우, 해당 조건에 맞는 값을 Advice의 파라미터로 전달받을 수 있습니다.
1. 단순 실행 (JoinPoint 전달)
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
// joinPoint: 실행 지점 정보
}
2. 특정 인자를 받는 메서드만 지정 (args)
@Before("execution(* com.example.service.*.*(..)) && args(name,..)")
public void logBefore(String name) {
// name: 실제 인자 값 바인딩
}
3. 특정 어노테이션이 붙은 메서드만 지정 (@annotation)
파라미터로 들어오는 어노테이션 타입과 일치한 어노테이션을 인자로 받는다.
@Before("@annotation(myAnno)")
public void logWithAnnotation(MyCustomAnnotation myAnno){
...
}
4. @Around 사용
@Around가 적용된 Advice는 대상 메서드를 직접 실행해야 하므로 ProceedingJoinPoint를 파라미터로 받는다.
@Around("execution(* com.example.service.*.*(..))")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed(); //실제 메서드 실행
}
결론
Spring AOP는 메서드 실행 시점에 다양한 공통 기능(Advice)을 삽입하여, 비즈니스 로직과 반복적인 부가 기능을 깔끔하게 분리할 수 있게 해줍니다.
pointcut은 어떤 join point에 advice를 적용할지를 결정하고,- advice의 실행 시점은
@Before,@After,@Around등의 어노테이션으로 제어되며, args(...),@annotation(...)등의 표현식을 통해 인자나 어노테이션 값을 advice에 파라미터로 전달받을 수 있습니다.
'라이브러리&프레임워크 > Spring' 카테고리의 다른 글
| Spring Boot Metric 수집 및 시각화 방법 (Prometheus + Grafana) (0) | 2025.07.20 |
|---|---|
| 동시성 문제와 해결 전략 (비관적 락 vs 낙관적 락) (0) | 2025.05.10 |
| CustomException 설계와 Spring 예외 처리 전략 (0) | 2025.04.25 |
| XML 설정 시 반드시 알아야 할 XSD와 namespace 개념 정리 (0) | 2025.04.24 |
| Spring 데이터 영속성 예제 (0) | 2025.04.07 |
