AOP JoinPoint 종류

백엔드&인프라 추종자·2025년 2월 27일

스프링 공부

목록 보기
21/35

JoinPoint는 AOP에서 실행되는 메소드의 정보를 담고 있는 객체로, 두 가지 주요 타입이 있습니다:

  • JoinPoint
  • ProceedingJoinPoint

이들 각각의 특징과 사용 방법에 대해 예제와 함께 설명드리겠습니다.


1️⃣ JoinPoint

JoinPoint는 AOP에서 메소드 실행 정보를 제공하는 객체입니다. 특히 @Before, @After, @AfterReturning, @AfterThrowing 등의 어노테이션에서 사용됩니다. ProceedingJoinPoint와 달리 메소드 실행을 제어하지 않으며, 메소드 실행 전후의 정보를 확인하는 데 주로 사용됩니다.

사용 예시 (@Before)

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logMethodInfo(JoinPoint joinPoint) {
        // 클래스명 + 메소드명
        String className = joinPoint.getSignature().getDeclaringTypeName();  // 클래스명
        String methodName = joinPoint.getSignature().getName();  // 메소드명
        
        // 매개변수들
        Object[] args = joinPoint.getArgs();  // 매개변수들
        StringBuilder params = new StringBuilder();
        for (Object arg : args) {
            params.append(arg).append(" ");
        }

        // 출력
        System.out.println("패키지명 + 클래스명: " + className);
        System.out.println("메소드명: " + methodName);
        System.out.println("매개변수들: " + params.toString());
    }
}

설명:

  • joinPoint.getSignature().getDeclaringTypeName(): 클래스의 전체 이름 (패키지명 포함)
  • joinPoint.getSignature().getName(): 메소드명
  • joinPoint.getArgs(): 메소드 매개변수들을 배열로 가져옵니다.

출력 예시:

패키지명 + 클래스명: com.example.service.UserService
메소드명: getUserById
매개변수들: 1234 JohnDoe

JoinPoint는 메소드 실행 전의 정보를 기록하는 데 유용합니다.


2️⃣ ProceedingJoinPoint

ProceedingJoinPointJoinPoint확장된 형태로, 메소드 실행을 제어할 수 있는 기능을 제공합니다. @Around 어노테이션에서만 사용할 수 있으며, 메소드 실행을 수행하거나 중단할 수 있습니다.

사용 예시 (@Around)

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object logMethodInfo(ProceedingJoinPoint joinPoint) throws Throwable {
        // 클래스명 + 메소드명
        String className = joinPoint.getSignature().getDeclaringTypeName();  // 클래스명
        String methodName = joinPoint.getSignature().getName();  // 메소드명
        
        // 매개변수들
        Object[] args = joinPoint.getArgs();  // 매개변수들
        StringBuilder params = new StringBuilder();
        for (Object arg : args) {
            params.append(arg).append(" ");
        }

        // 출력
        System.out.println("패키지명 + 클래스명: " + className);
        System.out.println("메소드명: " + methodName);
        System.out.println("매개변수들: " + params.toString());

        // 실제 메소드 실행
        Object result = joinPoint.proceed();  // 메소드 실행

        // 메소드 실행 후 결과
        System.out.println("메소드 실행 후 결과: " + result);
        
        return result;
    }
}

설명:

  • ProceedingJoinPointJoinPoint의 기능을 확장하여, joinPoint.proceed()로 메소드를 실행하거나 중단할 수 있습니다.
  • proceed() 메서드는 실제 메소드를 실행하며, 그 결과를 반환합니다.

출력 예시:

패키지명 + 클래스명: com.example.service.UserService
메소드명: getUserById
매개변수들: 1234 JohnDoe
메소드 실행 후 결과: User{ id=1234, name='JohnDoe' }

ProceedingJoinPoint는 메소드의 실행을 제어할 수 있기 때문에, 메소드 실행 전후에 추가적인 처리를 하거나 메소드 실행을 취소할 수 있습니다.


3️⃣ JoinPointProceedingJoinPoint 비교

특성JoinPointProceedingJoinPoint
사용 가능한 어노테이션@Before, @After, @AfterReturning, @AfterThrowing@Around
메소드 실행 제어메소드 실행 전 정보만 제공메소드 실행을 제어 (proceed() 메서드 사용)
메소드 실행 결과 가져오기불가능joinPoint.proceed()를 통해 결과를 가져올 수 있음
예시@Before에서 사용@Around에서 사용
  • JoinPoint는 주로 메소드 실행 전의 정보를 얻는 데 사용되며, 실행을 제어하지 않습니다.
  • ProceedingJoinPoint메소드 실행을 제어하고, 결과를 반환받을 수 있는 객체로 @Around 어노테이션에서 사용됩니다.

결론

  • JoinPoint: 메소드 실행 정보를 가져오며, 실행을 제어할 수 없습니다. @Before, @After에서 주로 사용됩니다.
  • ProceedingJoinPoint: JoinPoint의 확장판으로 메소드 실행을 제어하고, 메소드 실행 전후로 동작을 삽입할 수 있습니다. @Around에서만 사용 가능합니다.

둘의 차이를 이해하고 필요한 어노테이션과 상황에 맞게 사용하시면 됩니다! 🚀

profile
AI 답변 글을 주로 올립니다.

0개의 댓글