AOP(Aspect-Oriented Programming)를 이용한 방법:

Spring AOP를 사용해서 어노테이션을 처리하는 로직을 분리합니다. 이 방법은 비즈니스 로직과 어노테이션 처리 로직을 분리하여 유지보수가 쉽고, 코드가 깔끔해집니다.

  1. Custom Aspect class
@Aspect
public class MyCustomAspect {
    @Around("@annotation(MyCustomAnnotation)")
    public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
        // 어노테이션 처리 로직
        return joinPoint.proceed();
    }
}

특히 Spring 프레임워크에서 많이 사용되며, @Transactional, @Cacheable 등이 이러한 방식으로 구현되어 있습니다.

사용 예시:

  1. MyCustomAnnotation 어노테이션
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation {
    String value() default "";
}
  1. AOP를 이용해 이 어노테이션을 처리할 ‘MyCustomAspect’ 작성
@Aspect
@Component
public class MyCustomAspect {
    @Around("@annotation(myCustomAnnotation)")
    public Object handle(ProceedingJoinPoint joinPoint, MyCustomAnnotation myCustomAnnotation) throws Throwable {
        System.out.println("Before method execution: " + myCustomAnnotation.value());
        
        Object result = joinPoint.proceed();
        
        System.out.println("After method execution: " + myCustomAnnotation.value());
        
        return result;
    }
}
  1. 마지막으로 ‘MyCustomAnnotation을 실제로 사용할 서비스 클래스
@Service
public class MyService {
    @MyCustomAnnotation(value = "Doing something")
    public void doSomething() {
        System.out.println("Inside the method.");
    }
}
  1. 실제 출력 예시

**MyService**의 doSomething 메서드가 실행될 때, **MyCustomAspect**의 handle 메서드도 함께 동작하기 때문에, 최종적으로 콘솔에 출력되는 문구는 다음 순서로 나타납니다.

  1. "Before method execution: Doing something": AOP의 @Around 어노테이션에 의해 메서드 실행 전에 출력됩니다.
  2. "Inside the method.": 실제 doSomething 메서드의 로직이 실행되면서 출력됩니다.
  3. "After method execution: Doing something": 메서드 실행 후에 출력됩니다.