Spring AOP 개념 정리2

오성민·2022년 12월 9일
0

spring

목록 보기
9/17
post-thumbnail

프로젝트를 진행할 때에 계속해서 반복된 동작을 수행하기 위해서 중복된 코드가 굉장히 많이 생겼었다.

예를 들면 해당 메소드가 동작하는데 얼마나 걸렸는지 시간을 측정한다던지, db와 통신하는 메소드가 정상적으로 수행된다면 log를 남긴다던지 등에 내용이 계속해서 반복이 됐다.

이런 반복적인 코드를 줄이고자 사용하는 AOP 사용법에 대해서 알아보자

이번에는 AOP Pointcut 표현식에 대해서 글을 작성해보려고 한다.

Pointcut

Pointcut 이란, 수 많은 Joinpoint에서, 특정한 조건에 의해서 필터링이 된 Joinpoint이다.
여기에서 특정한 조건이라하면 특정 지정자를 선언하여 패키지, 메소드, 리턴타입, 파라미터 등등을 지정한다.
이런 특정 지정자를 PCD라고 한다.

PCD의 종류

1. execution : 가장 정교한 Pointcut을 만들 수 있음

작성법
[접근제한자 패턴] 리턴타입 [패키지경로] 클래스명 메서드명 (매개변수)

위와 같은 방법으로 사용한다.
나는 controller에 method가 사용될 때 해당 요청이 얼만큼에 시간이 걸리는지 측정을 하기 위해서 아래와 같이 적용하였다.

이렇게 pointcut(어디에 적용을 할지)를 작성을 하고 해당 pointcut을 사용해서 동작을 할 메소드는 따로 구성했다.

그리고 패턴을 작성할 때 사용가능한 규칙이 있는데

  • *: 와일드카드
  • .. : 0개 이상의 의미
    이런 의미도 있으니 참고해서 사용을 하면 될 듯 하다.

2. @annotation

execution은 AOP를 적용할 곳의 경로를 지정해주는 느낌으로 사용을 하는 것이라면 해당 annotation은 이름에서도 알 수 있듯이 특정한 annotation이 사용이 된 곳에만 AOP를 적용한다.

사용법으로는

@annotation(annotation 위치)

로 사용을 해주면 된다.
이렇게 사용을 해서 custom annotation도 처리해줄 수 있다.

3. args()

인수의 개수와 타입이 일치하는 모든 메소드를 타겟으로 지정한다.

4. @args()

args()와 비슷하지만 인수의 개수와 일반 클래스 타입이 아닌 annotation 타입이 일치하는 모든 메소드를 타겟으로 지정한다.

5. within()

execution 에서 타입패턴 내에 해당하는 모든 것들을 포인트컷
(클래스와 인터페이스 등을 포인트컷)

6. @within()

within과 @args를 합친 형태라고 생각

7. bean()

bean이름을 사용해서 pointcut을 한다.
bean(examp*) 라고 사용을 하면 examp라고 시작하는 모든 bean을 pointcut한다.

위와 같은 여러 가지 PCD가 존재한다.

아직 다 사용은 못 해봤지만 공부해서 적절한 곳에 적절한 PCD를 사용해봐야겠다.

profile
풀스택을 지향하는 개발자

0개의 댓글