Spring AOP / Custom Annotation 이용하기

장석빈·2024년 3월 13일

Spring AOP

목록 보기
2/2
post-thumbnail

Custom Annotation으로 PointCut 적용하기

💡 Custom Annotation 만들기

프레임워크를 사용하다 보면 이용할 수 있는 수 많은 Annotation들이 많다.
하지만 개발자는 제공 되고있는 Annotation이 아닌 필요한 Annotation을 커스텀하여 선언하고 사용할 수 있다.

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Myannotation {
}

위와 같이 @interface의 형태로 클래스를 생성하면 해당 클래스를 Annotation으로 사용할 수 있다.

Annotation을 선언하는 방법은 다양하게 있지만, 이 글에서는 Annotation을 클래스 레벨과 메서드 레벨에 적용하여 사용할 예정이기 때문에 ElementType에 METHOD와 TYPE으로 설정하여 메서드, 클래스에 적용될 수 있도록 선언하였다.

👉 Aspect에 PointCut 적용하기

생성한 Aspect에 Annotation으로 PointCut을 적용하려면 아래와 같이 작성한다.

@Around("@annotation(com.~~~.annotation.MyAnnotation)")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
// 내부 로직
}

이렇게 PointCut을 적용하면 메서드 레벨에서 Annotation으로 AOP를 적용시킬 수 있다.

🤔 의문점 발생과 해결

의문점

Aspect를 어노테이션으로 보기좋게 만들어서 적용하는 것 까지 완료했다. 하지만, AOP의 근간이 되는 목적이 무엇인가? 관심사를 분리하여 코드의 재사용성을 높이고 보기싫게 늘어진 반복적인 코드를 없애려는 것이 AOP의 목적이지 않은가. 그런데 어노테이션을 지정하여 모든 메서드마다 어노테이션을 달아주면 로직이 조금 깔끔해졌다 뿐이지 추후 대대적인 수정이 필요하다던가 해당 어노테이션을 사용하지 않게 된다면 불편한 일이 발생할 것이다.

그래서 메서드 레벨에서만 어노테이션을 사용 하지 않고 클래스 레벨에서도 어노테이션을 사용할 수 있다면, 보기에도 편하고 추후 관리에도 이점을 가져올 수 있을 것이라고 생각했다.

결과

해서, 위에서 작성한 어노테이션을 클래스 레벨에 달아주고 작동을 시켰다. 결과는 작동이 안되었다.

해결 방법

아래와 같이 로직을 변경하였다.

@Around("@within(com.sparta.myselectshop.annotation.MyAnnotation)")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
// 내부 로직
}

포인트 컷을 @annotation에서 @within으로 변경해주었다.
둘의 역할은 각각 아래와 같다.

@within은 AspectJ의 Pointcut Designator 중 하나로, 특정 어노테이션이 클래스 레벨에 적용된 경우를 탐지하는데 사용된다. 즉, @within은 어노테이션이 붙은 클래스 내의 모든 메서드를 대상으로 작동한다.
이와 반대로 @annotation은 메서드 레벨의 어노테이션만을 대상으로 작동한다.

따라서, @annotation만 사용하거나, @within만 사용하면 원하는 레벨에서 자유롭게 Aspect의 작동이 어려워 || 연산자로 두 조건에서 모두 작동이 되게 만들면 쉽게 사용이 가능하다.

@Around("@within(com.sparta.myselectshop.annotation.MyAnnotation) || @annotation(com.sparta.myselectshop.annotation.MyAnnotation)")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
}
profile
꾸준히 파고 보면 뭐든 되지 않을까요?

1개의 댓글

comment-user-thumbnail
2024년 3월 13일

Interesting... 흥미롭군요?

답글 달기