AOP(Aspect Oriented Programming)

JooH·2024년 2월 15일
0

NHN_BackendAcademy

목록 보기
13/23

AOP : 관점지향 프로그래밍

  • 프로그램 구조를 다른 방식으로 생각하게 해서 OOP를 보완한다
  • OOP에서 모듈화의 핵심단위 : 클래스
  • AOP에서 모듈화의 핵심단위 : 관점(Aspect)
  • 관점은 다양한 타입과 객체에 걸친 트랜잭션 관리같은 관심(Concern)을 모듈화 할 수 있게 함
    crosscurring concerns : 횡단 관심사
    core concerns : 주요 관심사

AOP - 횡단 관심사와 주요 관심사를 분리해서 관점별로도 기능을 모듈화 할 수 있음

AOP의 주요 용어

Aspect

  • 여러 클래스에 걸친 횡단 관심사의 모듈(클래스)
  • 하나 이상의 Pointcut과 Advice의 조합으로 만들어지는 AOP의 기본 모듈
  • Spring framework에서는 @Aspect를 사용하거나 XML에서 설정 가능

Join Point

  • 프로그램 실행중 어떤 포인트를 의미(메소드 실행, Exception 처리 등)
  • Point Cut의 후보
  • Spring AOP에서는 메소드 실행만 그 대상이 된다.

Advice

  • 타겟에 제공할 부가기능을 담은 모듈
  • 특정 Join Point에서 Aspect가 취하는 행동
  • around, before, after

Point Cut

  • Advice를 적용할 Joint Point를 선별하는 작업 / 그 기능을 적용할 모듈
  • Advice는 Pointcut 표현식과 연결되고 Pointcut이 매치한 Join Point에서 실행된다

Target Object

  • 부가기능을 부여할 대상
  • 하나 이상의 Aspect로 Advised된 객체
  • advicesd object 라고도 한다

AOP Proxy

  • 클라이언트와 타겟 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트
  • aspect 계약(어드바이스 메서드 실행 등)을 위해 AOP에 의해 생성된 객체

Advisor(Spring AOP만 사용되는 용어)

  • Pointcut과 Advice를 하나씩 갖고 있는 객체

Weaving

  • 다른 어클리케이션타입이나 어드바이즈된 객체를 생성하는 객체와 관점을 연결하는 행위

Spring AOP vs @AspectJ

@AspectJ는 잘 쓰지는 않는다. 하지만 지원한다(정확히는 @AspectJ 스타일을 지원한다)
@AspectJ 지원 활성화 (@EnableAspectJAutoProxy)
태그 없으면 <aop:aspectj-autoproxy>로 xml에 직접 지정

AspectJ 사용 사진

포인트 컷 : 타겟의 여러 조인 포인트 중 어드바이스(@Advice(before,after))를 적용할 대상을 지원하는 키워드
포인트컷 선언은 표현식과 시그니쳐로 나누어짐

@Pointcut("execution(* transfer(..))") // the pointcut expression
private void anyOldTransfer() {} // the pointcut signature

포인트 컷 표현식

포인트컷 지정자 (Pointcut Designator)

execution (거의 대부분 이걸 사용)

  • 메소드 실행 조인 포인트와 매칭
  • 스프링 AOP의 주요 포인트컷 지정자

within

  • 주어진 타입(클래스)로 조인 포인트 범위를 제한

excution vs within

  • execution은 메서드를 지칭하지만, within은 클래스를 지칭한다(클래스 내부 메소드 포함(private 제외))
    비교
@Pointcut("execution(boolean com.test.edu.springframework.testing.service.Tester.sayHello())")
public void testerPointCut(){}

@Pointcut("within(com.test.edu.springframework.testing.service.Tester)")
public void testerPointCut(){}

this

  • 주어진 타입을 구현한 스프링 AOP Proxy 객체에 매칭
  • 보통 Proxy 객체를 Advice 파라미터에 바인딩하는 용도로 쓰인다.(within, execution자리에 들어간다)

target

  • 주어진 타입을 구현한 타겟 객체에 매칭
  • 보통 타겟 객체를 Advice 파라미터에 바인딩하는 용도로 쓰인다.(within, execution자리에 들어간다)

args (파라미터로 이런걸 받는 애들을 매칭할래)

  • 주어진 타입의 인수들을 이용해 매칭
  • 보통 메소드 인자를 Advice 파라미터에 바인딩하는 용도로 쓰인다.

@taget
주어진 타입의 애너테이션을 가진 클래스의 인스턴스를 매칭

@args
실제 인수의 런타임 타입이 주어진 타입의 애너테이션을 가질 경우 매칭

@within
주어진 타입의 애너테이션을 타입들로 제한하여 매칭

@annotation
주어진 애너테이션을 가지고 있을 경우 매칭

포인트컷은 조합식을 통해 조합할 수 있다.

// anyPublicOperation 포인트컷은 모든 public 메소드 실행에 매칭 됩니다.
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {} 

// inTrading 포인트컷은 com.xyz.myapp.trading 패키지 내의 메소드 실행에 매칭
@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {} 

// tradingOperation 포인트컷은 com.xyz.myapp.trading 패키지 내의 퍼블릭 메소드 실행에 매칭
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} 

Advice

  • Advice는 포인트컷과 관련해 메소드 실행 전, 후, 전/후 를 결정하기 위해 사용한다

0개의 댓글