티스토리 뷰

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에 파라미터로 전달받을 수 있습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함