본문 바로가기
Java

[Spring Boot] AOP 사용법 정리: AOP에 대해 알아보자

by parkjp 2024. 7. 9.

Spring AOP란?

 

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.

쉽게 말해 관점을 기준으로 각각 모듈화를 하고자 함을 말한다.

 

예를 들어 로그나 트랜잭션, 보안 관련 모듈을 AOP를 이용하여 동작하게 할 수 있다.

 

개념이야 검색하면 많이 나오니 실질적으로 어떤 것들이 있고 어떻게 쓰는 것인지 알아보겠다.

 

반응형

AOP 사용법

 

우선 AspectJ 라이브러리를 추가해야한다.

Spring Boot를 쓴다면 Spring Boot Starter AOP를 추가해도 된다.

 

    implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.22'
    implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.22'
    
    # spring boot starter
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-aop', version: '3.3.0'

 

 

추가하였다면 메인이나 Configuration클래스에 @EnableAspectJAutoProxy를 추가한다.

해당 어노테이션은 @Aspect가 적용된 클래스를 스캔하고 필요한 프록시를 자동으로 생성하여 AOP가 동작하게끔 설정한다.

 

 

간단하게 예시 Aspect 클래스를 만들어보았다.

@Aspect
@Component
public class ExampleAspect {


    @Pointcut("execution(* com.example.service.ExampleService.*(..))")
    public void examplePointCut() {
    }

    @Before(value = "examplePointCut()")
    public void aopBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }

    @After(value = "examplePointCut()")
    public void aopAfter(JoinPoint joinPoint) {
        System.out.println("After method: " + joinPoint.getSignature().getName());
    }
    
    @Around(value = "examplePointCut()")
    public Object aopAround(ProceedingJoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
        Object result;
        try {
            result = joinPoint.proceed();  // 메서드 진행, result는 메서드 진행 후 반환 값
            System.out.println("After method: " + joinPoint.getSignature().getName());
        } catch (Throwable e) {
            System.out.println("Exception in method: " + joinPoint.getSignature().getName() + " with message: " + e.getMessage());
            throw e;
        }
        return result;
    }
    
    @AfterReturning(pointcut = "examplePointCut()", returning = "result")
    public void aopAfterReturning(Object result) {
        System.out.println("Method returned value: " + result);
    }

    @AfterThrowing(pointcut = "examplePointCut()", throwing = "error")
    public void aopAfterThrowing(Throwable error) {
        System.out.println("Exception thrown: " + error.getMessage());
    }
}

 

 

위 예시를 기준으로 각각의 기능을 적어 보면

 

@PointCut - ExampleService의 모든 메서드를 포인트 컷으로 하였다. PointCut을 기준으로 동작하도록 하거나 PointCut을 제외하고 동작하도록 할 수 있다. 필터링이라 보면 된다.

포인트 컷은 특정 메서드도 가능하지만 어노테이션을 직접 생성하여 해당 어노테이션이 붙은 포인트에 aop가 실행되게끔 할 수도 있다.

 

그렇다면 ExampleService의 모든 메서드를 기준으로 동작하는데 아래와 같다.

 

@Before - ExampleService 메서드의 동작 이전

@After - ExampleService 메서드의 동작 이

@Around - ExampleService 메서드의 동작 이전과 이후

@AfterReturning - ExampleService 메서드가 에러 없이 동작한 이후

@AfterThrowing - ExampleService 메서드가 동작 중 에러가 난 경우

 

 

 

 

반응형