learn/spring

어노테이션 (Annotation) - AOP(Aspect-Oriented Programming) 관련

사겅이 2023. 9. 26. 06:40

출처 : https://prasadct.com/java/understanding-spring-aop/

 

 AOP는 애플리케이션의 횡단 관심사(종단 관심사가 아닌 부분)를 모듈화하고 관리하여 주로 다수의 클래스나 모듈에 걸쳐 반복되는 기능을 분리하고 재사용 가능한 모듈로 만드는 데 사용

 

@Aspect

Aspect 클래스를 정의할 때 사용되며, 횡단 관심사를 구현한 클래스

import org.aspectj.lang.annotation.Aspect;

@Aspect
public class MyAspect {
    // Aspect 클래스 정의
}

 

@Before

메서드 실행 전에 어드바이스를 실행

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class MyAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeAdvice() {
        // 메서드 실행 전에 실행될 코드
    }
}

 

@After

메서드 실행 후에 어드바이스를 실행

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.After;

@Aspect
public class MyAspect {
    @After("execution(* com.example.service.*.*(..))")
    public void afterAdvice() {
        // 메서드 실행 후에 실행될 코드
    }
}

 

@Around

메서드 실행 전후에 어드바이스를 실행하며, 메서드 실행을 제어할 수 있음

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;

@Aspect
public class MyAspect {
    @Around("execution(* com.example.service.*.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        // 메서드 실행 전에 실행될 코드
        Object result = joinPoint.proceed(); // 메서드 실행
        // 메서드 실행 후에 실행될 코드
        return result;
    }
}

 

@AfterReturning

메서드가 정상적으로 반환될 때에만 실행

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;

@Aspect
public class MyAspect {
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
    public void afterReturningAdvice(Object result) {
        // 메서드가 정상적으로 반환될 때 실행될 코드
    }
}

 

@AfterThrowing

메서드에서 예외가 발생할 때에만 실행

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;

@Aspect
public class MyAspect {
    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
    public void afterThrowingAdvice(Exception ex) {
        // 메서드에서 예외가 발생할 때 실행될 코드
    }
}