AOP

Better late than never·2022년 9월 16일
0

Spring AOP 용어 설명

Advice

언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. 예를 들어, '메서드를 호출하기 전'(언제)에 '트랜잭션을 시작한다.'(공통기능)기능을 적용한다는 것을 정의하고 있다.

Target 클래스에 조인 포인트에 삽입되어져 동작(적용할 기능)할 수 있는 코드를 '어드바이스'라 한다.

관점으로서 분리되고 실행시 모듈에 위빙된 구체적인 처리를 AOP에서는 Advice라고 한다. Advice를 어디에서 위빙하는지는 뒤에 나오는 PointCut이라는 단위로 정의한다.

또한 Advice가 위빙되는 인스턴스를 '대상객체'라고 한다.

advice는 Pointcut에서 지정한 Jointpoint에서 실행되어야하는 코드이다.(특정 Joinpoint의 Aspect에 의한 동작, 대상 객체의 Joinpoint에 Weaving되어 동작할 수 있는 코드)

cp.) 스프링의 Advice 타입

  • Around Advice: 대상 객체의 메소드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행, Joinpoint 앞과 뒤에서 실행되는 Adcvice
  • Before Advice: 대상 객체의 메서드 호출 전에 공통 기능을 실행, Joinpoint 앞에서 실행되는 Advice
  • After Returning Advice: 대상 객체의 메서드가 입셉션 없이 실행된 이후에 공통 기능을 실행, Jointpoint 메서드 호출이 정상적으로 종료된 뒤에 실행되는 Advice
  • After Throwing Advice: 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행, 예외가 던져질 때 실행되는 Advice
  • Introduction: 클래스에 인터페이스와 구현을 추가하는 특수한 Advice
  • After Advice : 엑셉션 발생 여부에 상관없이 대상 객체의 메소드 실행 후 공통 기능을 실행

이 중 널리 사용되는 것은 Around Advice이며, 그 이유는 대상 객체의 매서드를 실행하기 전/후, 익셉션 발생등 다양한 시점 원하는 기능을 삽입할 수 있기 때문

JoinPoint

Advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 Joinpoint에 해당한다.

클래스의 인스턴스 생성 시점', '메소드 호출 시점', '예외 발생 시점'과 같이 어플리케이션을 실행할 때 특정 작업이 시작되는 시점을 '조인포인트'라고 한다

실행시의 처리 플로우에서 Advice를 위빙하는 포인트를 JointPoint라고 한다. 구체적으로는 메서드 호출이나 예외발생이라는 포인트를 Joinpoint라고 한다.

인스턴의 생성시점, 메소드를 호출하는 시점, Exception이 발생하는 시점과 같이 어플리케이션이 실행될 때 특정작업이 실행되는 시점을 의미한다

Pointcut

Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Jointpoint를 나타낸다. 스프링에서는 정규 표현식이나 AspectJ 문법을 이용하여 Pointcut을 정의할 수 있다.

여러 개의 조인포인트를 하나로 결합한 것을 포인트 컷이라 한다.

하나 또는 복수의 Jointpoint를 하나로 묶은 것을 Pointcut 이라고 한다. Advice의 위빙 정의는 Pointcut을 대상으로 설정한다. 하나의 Pointcut에는 복수 Advice를 연결할 수 있다. 반대로 하나의 Advice를 복수 Pointcut에 연결하는 것도 가능하다.

Pointcut(교차점)은 JoinPoint(결합점)들을 선택하고 결합점의 환경정보를 수집하는 프로그램의 구조물이다. Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합 규칙을 정의하는 것이다

Joinpoint가 pointcut에 일치할 때 마다 해당 Pointcout에 관련한 Advice가 실행

Weaving

Advice를 핵심 로직 코드에 적용하는 것을 weaving 이라고 한다.(분리한 관점을 여러 차례 모률에 삽입하는 것을 AOP에서는 위빙 (Weaving: 엮기)이라고 부른다.) 즉 공통 코드를 핵심 로직 코드에 삽입하는 것이 weaving이다.

어드바이스를 핵심 로직 코드에 삽입하는 것을  위빙이라고 한다.

Aspect를 target 객체에 제공하여 새로운 프록시 객체를 생성하는 과정

Aspect를 대상 객체에 연결시켜 관점지향 객체로 만드는 과정, Advice를 비즈니스 로직 코드에 삽입하는 것

Aspect

여러 객체에 공통으로 적용되는 공통 관심 사항을 Aspect라고 한다. 트랜잭션이나 보안 등이 Aspect의 좋은 예이다.

애플리케이션 내 여러 군데에 흩어져 있는 코드/기능 이며, 실제 비즈니스 로직과는 다름(트랙잭션 관리 등) 각 Aspect는 고유한 Cross-Cutting 기능에 초점을 맞추고 있다. 쉽게 말하면 여러 객체에 공통으로 적용되는 공통 관점 사항을 에스펙트라 한다.

Aspect는 AOP의 중심단위, Advice와 Pointcut을 합친 것이다.(Advisor)

  • Cross-Cutting-Concern : 횡단 관심사항. 로깅, 트랜잭션, 보안과 같이 다수의 비즈니스 로직에서 반복적으로 발생하는 부분을 의미, 이러한 반복적으로 발생하는 코드/기능을 한데로 모아 공통적인 기능을 만들게 됨

Target

핵심 로직을 구현하는 클래스를 말한다.

충고를 받는 클래스를 대상(target)이라고 한다. 대상은 여러분이 작성한 클래스는 물론, 별도의 기능을 추가하고자 하는 써드파티 클래스가 될 수 있다.

advisor

어드바이스와 포인트컷을 하나로 묶어 취급한 것을 '어드바이저'라 부른다.

advisor와 Pointcut을 하나로 묶어 다루는 것을 Advisor라고 한다. Advisor는 스프링 AOP에만 있는 것인데, 관점 지향에서 관점을 나타내는 개념이라고 할 수 있다.

proxy

대상 객체에 Advice가 적용된 후 생성된 객체

참고

프록시는 기존 코드를 수정하지 않고 코드 중복을 피할 수 있는 방법

  • 핵심 기능의 실행은 다른 객체에 위임하고 부가적인 기능을 제공하는 객체 = 프록시(proxy)
  • 실제 핵심 기능을 실행하는 객체 = 대상 객체
  • 프록시는 핵심 기능을 구현하지 않음
  • 대신 여러 객체에 공통으로 적용할 수 있는 기능을 구현

언제,어디서,누가,무엇을,어떻게, 왜 할 때 AOP 걸어라.....

내가 원하는 메소드 실행할 때(언제)

객체(어디서)

로그를 찍는 기능(누가)

로그를(무엇을)

앞뒤로(어떻게)

AOP 핵심

  1. 대상: Target

  2. 적용할 기능: advice

  3. 대상의 어디에서 적용할지 구체적인 명시:pointcut

aspect와 advice의 관계(추상 명사와 구체 명사의 관계)

advice라는 코드를 내가 만들고 로그를 찍는 기능 자체를 aspect라고 한다.

0개의 댓글