[Project] Custom Annotaiton을 이용하여 Spring AOP 프로젝트에 적용하기 !

현주·2023년 6월 21일
3

📌 Spring AOP(Aspect Oriented Programming)에 대한 자세한 개념들은 아래 포스팅을 참고해주세요.
<Spring AOP(Aspect Oriented Programming)란?>

📌 먼저, 이 프로젝트에서는 Spring AOP를 활용하여 알림 기능을 분리하였고,
Custom Annotation을 만들어 적용하였습니다.

✏️ Custom Annotation을 이용하여 Spring AOP 적용하기

1. Custom Annotation 만들기

  • @interface
    ➜ Annotation 정의 시 이름 앞에 붙여 작성해야함

  • @Retention
    ➜ 해당 Annotation이 적용되고 유지되는 범위 설정 ( 이 애너테이션이 언제까지 살아 남아 있을지 )
    ( RententionPolicy enum으로 범위 설정 가능 )

    • @Retention(RetentionPolicy.SOURCE)
      ➜ 컴파일 전 소스 코드(.java)까지 남아있음
    • @Retention(RetentionPolicy.CLASS)
      ➜ 컴파일 후 클래스 파일(.class)까지 남아있음 ( default )
    • @Retention(RetentionPolicy.RUNTIME)
      ➜ 런타임까지 남아있음 ( 사실상 안사라짐 )
      ➜ JVM 환경에서 실제로 사용하기 위해서는 RUNTIME을 적용해주어야 함

      참고 1, 참고 2
  • @Target
    ➜ 해당 Annotation을 사용 가능한 대상을 지정
    ( ElementType enum으로 범위 설정 필수 )
    • @Target(ElementType.TYPE)
      ➜ 클래스, 인터페이스, enum
    • @Target(ElementType.FIELD)
      ➜ 필드
    • @Target(ElementType.METHOD)
      ➜ 메서드 ( 이 프로젝트에서 사용 )
    • @Target(ElementType.PARAMETER)
      ➜ 파라미터
    • @Target(ElementType.CONSTRUCTOR)
      ➜ 생성자
    • @Target(ElementType.LOCAL_VARIABLE)
      ➜ 지역 변수
    • @Target(ElementType.ANNOTATION_TYPE)
      ➜ 애너테이션
    • @Target(ElementType.PACKAGE)
      ➜ 패키지
    • @Target(ElementType.TYPE_USE)
      ➜ 타입
    • @Target(ElementType.TYPE_PARAMETER)
      ➜ 타입 파라미터
    • @Target(ElementType.MODULE)
      ➜ 모듈

2. Aspect 정의해주기
( 부가 기능 (Advice) + 적용할 위치 (Pointcut) )
➜ 이 프로젝트의 경우 알림 기능을 Spring AOP를 사용하여 적용할 예정이라 NotifyAspect

📌 NotifyAspect에 대한 자세한 내용은 아래 포스팅을 참고해주세요.


3. 메서드에 Annotation 붙이기

위처럼 알림 기능이 필요한 메서드에 우리가 만들었던 Annotation을 붙여주었다.


4. 콘솔 창에서 결과 확인
이 프로젝트에서는 로그 기능 또한 Aspect를 분리하여 적용시켰기 때문에 기능들을 작동시키면 아래와 같이 로그가 자동으로 뜨는데,

위에서 Annotation을 붙였던 메서드를 실행시켜보면,

Aspect에서 정의했던 Advice에서 notifyService.send로 보낸 정보들이 잘 나타나는 것으로 보아

알림 기능이 잘 작동하는 것을 알 수 있다 !


💡 Custom Annotation을 사용한 이유

만약 AOP만 사용하여 횡단 관심사를 분리하였다면,

횡단 관심사가 주입될 핵심 관심사에 대해 매번 포인트컷을 변경해주어 번거로운데

위와 같이 Custom Annotation을 만들어 처리한다면

포인트컷 변경이 필요 없이 해당 Target의 메서드 레벨에 애너테이션만 붙여주면 되기 때문에

유지 보수성 및 확장성을 높여줄 수 있는 방법인 것 같다 !

참고


여기까지 Custom Annotation을 이용하여 프로젝트에 Spring AOP를 적용하는 방법이었고,

📌 다음 포스팅은 Spring AOP로 로그 기능과 이번 포스팅에서 짧게 다룬 알림 기능 구현하기에 대한 내용입니다.

👉 [Project] Spring AOP로 로그 / 알림 Aspect 구현하기 !

0개의 댓글