[review] 스프링 AOP 구현

corncheese·2023년 11월 11일
0

스프링 AOP 구현

@Aspect 사용

포인트컷 분리

@Pointcut

  • @Pointcut에 포인트컷 표현식을 사용한다.
  • 메서드 이름과 파라미터를 합쳐서 포인트컷 시그니처(signature)라한다.
  • 메서드 반환 타입은 void여야 하며 코드 내용은 비워둠

포인트컷 참조

포인트 컷을 공용으로 사용하기 위해 별도의 외부 클래스로 만들어도 된다. 참고로 외부에서 호출할 때는 포인트컷의 접근 제어자를 public으로 해야 된다.

어드바이스 순서

어드바이스는 기본적으로 순서를 보장하지 않으며, 순서를 지정하고 싶으면 @Aspect 적용 단위로 'org.springframework.core.annotation.@Order 애노테이션을 적용해야 한다.
단, 어드바이스 단위가 아닌 클래스 단위로 적용할 수 있다. 따라서 하나의 애스펙트에 여러 어드바이스가 있으면 순서를 보장 받을 수 없고 애스펙트를 별도의 클래스로 분리해야 한다.

어드바이스 종류에 따라 구현

어드바이스 종류

1. @Around : 메서드 호출 전후에 수행, 가장 강력한 어드바이스, 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능

  • 메서드의 실행 주변에서 실행된다. 메서드 실행 전후에 작업을 수행한다.
  • 어드바이스의 첫번째 파라미터는 ProceedingJoinPoint를 사용해야 한다.
  • proceed()를 통해 대상을 실행한다.

2. @Before : 조인 포인트 실행 이전에 실행

  • @Around와 다르게 작업 흐름을 변경할 수 없다. @Around는 ProceedingJoinPoint.proceed()를 호출해야 다음 대상이 호출되는데,
    반면에 @Before는 ProceedingJoinPoint.proceed() 자체를 사용하지 않는다.
  • 메서드 종료 시 자동으로 다음 타켓이 호출된다. 물론 예외가 발생하면 다음 코드가 호출되진 않는다.

3. @AfterReturning : 조인 포인트가 정상 완료 후 실행

  • returning 속성에 사용된 이름은 어드바이스 메서드의 매개변수 이름과 일치해야 한다.
  • returning절에 지정된 타입의 값을 반환하는 메서드만 대상으로 실행한다.(부모 타입을 지정하면 모든 자식 타입은 인정된다.)

4. @AfterThrowing : 메서드가 예외를 던지는 경우 실행

  • throwing 속성에 사용된 이름은 어드바이스 메서드의 매개변수와 이름이 일치해야 한다.
  • throwing절에 지정된 타입과 맞는 예외를 대상으로 실행한다.( 부모 타입을 지정하면 모든 자식 타입은 인정된다)

5. @After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally)

  • 메서드실행이 종료되면 실행되며 정상적 및 예외 반환 조건을 모두 처리한다.
    일반적으로 리소스를 해제하는데 사용한다.

모든 어드바이스는 org.aspectj.lang.JoinPint를 첫번째 파라미터에 사용할 수 있다.( 생략 가능)
단 @Around는 ProceedingJoinPoint를 사용해야 한다.

Joinpoint 인터페이스의 주요 기능

  • getArgs() : 메서드 인수를 반환한다.
  • getThis() : 프록시 객체를 반환한다.
  • getTarget() : 대상 객체를 반환한다.
  • getSignature() : 조언되는 메서드에 대한 설명을 반환한다.
  • toString() : 조언되는 방법에 대한 유용한 설명을 인쇄.

ProceedingJoinPoint 인터페이스의 주요 기능

  • proceed() : 다음 어드바이스나 타겟을 호출

0개의 댓글