AOP(Aspect-Oriented Programming)를 이용한 방법:
Spring AOP를 사용해서 어노테이션을 처리하는 로직을 분리합니다. 이 방법은 비즈니스 로직과 어노테이션 처리 로직을 분리하여 유지보수가 쉽고, 코드가 깔끔해집니다.
@Aspect
public class MyCustomAspect {
@Around("@annotation(MyCustomAnnotation)")
public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
// 어노테이션 처리 로직
return joinPoint.proceed();
}
}
특히 Spring 프레임워크에서 많이 사용되며, @Transactional
, @Cacheable
등이 이러한 방식으로 구현되어 있습니다.
사용 예시:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation {
String value() default "";
}
@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;
}
}
@Service
public class MyService {
@MyCustomAnnotation(value = "Doing something")
public void doSomething() {
System.out.println("Inside the method.");
}
}
**MyService
**의 doSomething
메서드가 실행될 때, **MyCustomAspect
**의 handle
메서드도 함께 동작하기 때문에, 최종적으로 콘솔에 출력되는 문구는 다음 순서로 나타납니다.
@Around
어노테이션에 의해 메서드 실행 전에 출력됩니다.doSomething
메서드의 로직이 실행되면서 출력됩니다.