SEB_BE 39일차 - AOP 2

subimm_·2022년 10월 19일
0

코드스테이츠

목록 보기
39/83

💡 오늘의 학습목표

  • Pointcut 표현식
  • JoinPoint
  • 애너테이션을 이용한 AOP

📔 Pointcut 표현식 & 지시자

  • 관심 조인 포인트를 결정하므로 어드바이스가 실행되는 시기를 제어
    AspectJ 는 포인트컷을 위한 특별한 표현식 제공
    ex)
@Pointcut("excution(* transfer(..))") // 포인트컷 표현식
private void anyOldTransfer() {} // 포인트컷 서명

📖 포인트컷 지시자

  • 포인트컷 표현식은 execution 과 같은 포인트컷 지시자로 시작한다.
    • 포인트컷 지시자
      • execution : 메서드 실행 조인 포인트를 매칭
      • within : 특정 타입 내의 조인 포인트 매칭
      • args : 인자가 주어진 타입의 인스턴스인 조인 포인트
      • this : 스프링 빈 객체(스프링 AOP프록시)를 대상으로 하는 조인 포인트
      • target : Target 객체 (스프링 AOP프록시가 가르키는 실대상)을 대상으로 한 조인포인트
      • @target / @whthin / @annotation / @args / bean

📖 Pointcut 표현식 결합

  • &&, \\, ! 을 사용하여 결합 가능 / 이름으로 표현식을 참조할 수도 있다.
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {} // 메서드 실행 조인포인트가 공용 메서드의 실행을 나타내는 경우 일치

@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {} // 메서드 실행이 거래 모듈에 있는 경우에 일치

@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} // 메서드 실행이 거래 모듈의 공개 메서드를 나타내는 경우 일치

📖 일반적인 pointcut 표현식들

  • execution(public * *(..)) : 모든 공개메서드 실행
  • execution(* set*(..)) : set 다음 이름으로 시작하는 모든 메서드 실행
  • execution(* com.xyz.service.AccountService.*(..)) : AccountService 인터페이스에 의해 정의된 모든 메소드의 실행
  • execution(* com.xyz.service.*.*(..)): service 패키지에 정의된 메서드 실행
  • whthin(com.xyz.service.*) : service 패키지 내의 모든 조인 포인트 (SpringAOP에서만 메서드 실행)

📔 JoinPoint

  • 적용 가능 지점(조인포인트) : 생성자, 필드 값 접근, static메서드 접근, 메서드 실행
  • AOP를 수행하는 메소드는 조인포인트 인스턴스를 인자로 받는다.
  • 조인포인트 인스턴스에서 조인포인트 지점의 정보를 얻어내야한다.
  • 조인포인트는 추상개념, AOP를 적용할 수 있는 지점을 의미
    • JoinPoint 인터페이스의 주요 기능
      • JoinPoint.getArgs() : 조인포인트에 전달된 인자를 배열로 반환
      • JoinPoint.getThis() : AOP프록시 객체를 반환
      • JoinPoint.getTarget() : AOP가 적용된 대상 객체를 반환
        • 클라이언트가 호출한 비즈니스 메소드를 초함하는 비즈니스 객체를 반환
      • JoinPoint.getSignatuer() : 조인되는 메서드에 대한 설명 반환
      • JoinPoint.toString() : 조인되는 방법에 대한 유용한 설명을 인쇄

    • ProceedingJoinPoint 인터페이스의 주요 기능
      • proceed() : 다음 어드바이스나 타겟을 호출

📔 애너테이션을 이용한 AOP

@AspectJ 지원

  • 애너테이션이 있는 일반 Java 클래스로 관점을 선언하는 스타일
  • @AspectJ 지원 활성화
    • Spring 설정에서 사용하려면 자동 프록시 빈에 대한 Spring 지원을 활성화해야 함.
  • Java 설정으로 @AspectJ 지원 활성화 방법
@Configuration
@EnableAspectJAutoProxy //추가
public class AppConfig {
}
  • XML 설정으로 @AspectJ 지원 활성화 방법
<aop:aspectJ-autoproxy/>
  • Aspect 선언
    • 지원이 활성화되면 @AspectJ 관점이 있는(@Aspect 애너테이션이 있는) 클래스로 애플리케이션 컨텍스트에 정의된 모든 빈이 Spring에서 자동으로 감지되고 AOP를 구성하는데 사용
  • 포인트컷 선언
    • 포인트컷은 관심 조인 포인트를 결정하므로 어드바이스가 실행되는 시기를 제어할 수 있다.
    • pointcut 표현식은 @Pointcut 어노테이션을 사용하여 표시
  • 어드바이스 선언
    • 어드바이스는 포인트컷 표현식과 연관되며 포인트컷과 일치하는 메서드 실행 전후 또는 전후에 실행
profile
코린이의 공부 일지

0개의 댓글