복붙노트

[SPRING] Spring AOP : JoinPoint와 PointCut의 차이점은 무엇입니까?

SPRING

Spring AOP : JoinPoint와 PointCut의 차이점은 무엇입니까?

나는 Aspect Oriented Programming 개념과 Spring AOP를 배웠다. 나는 Pointcut과 Joinpoint의 차이점을 이해하지 못하고있다. 둘 다 나와 같은 것처럼 보인다. Pointcut은 조언을 적용하는 곳이며 Joinpoint는 Google의 조언을 적용 할 수있는 곳이기도합니다. 그러면 차이점은 무엇입니까?

pointcut의 예는 다음과 같습니다.

@Pointcut("execution(* * getName()")

Joinpoint의 예는 무엇일까?

해결법

  1. ==============================

    1.조인 포인트 : 조인 포인트는 애스펙트가 플러그인 될 수있는 프로그램 실행의 후보 포인트입니다.이 포인트는 호출되는 메소드, 예외가 던져지는 것 또는 수정되는 필드 일 수 있습니다. 이것은 aspect의 코드가 새로운 행동을 추가하기 위해 애플리케이션의 정상 흐름에 삽입 될 수있는 지점입니다.

    조인 포인트 : 조인 포인트는 애스펙트가 플러그인 될 수있는 프로그램 실행의 후보 포인트입니다.이 포인트는 호출되는 메소드, 예외가 던져지는 것 또는 수정되는 필드 일 수 있습니다. 이것은 aspect의 코드가 새로운 행동을 추가하기 위해 애플리케이션의 정상 흐름에 삽입 될 수있는 지점입니다.

    조언 : 포인트로 지정된 조인 포인트에서 수행 할 작업을 나타내는 시스템 전반에 대한 API 호출을 포함하는 객체입니다.

    Pointcut : pointcut은 joinpoints에서 관련 Advice가 적용되어야 하는지를 정의합니다. 조언은 AOP 프레임 워크가 지원하는 모든 joinpoint에서 적용될 수 있습니다. 물론 모든 가능한 joinpoint에서 모든 aspect를 적용하고 싶지는 않습니다. Pointcuts를 사용하면 조언을 적용 할 위치를 지정할 수 있습니다. 명시 적 클래스 및 메소드 이름을 사용하거나 일치하는 클래스 및 메소드 이름 패턴을 정의하는 정규 표현식을 사용하여 이러한 pointcut을 지정하는 경우가 많습니다. 일부 AOP 프레임 워크에서는 메서드 매개 변수의 값과 같이 런타임 결정을 기반으로 조언을 적용할지 여부를 결정하는 동적 인 pointcut을 만들 수 있습니다.

    다음 이미지는 Advice, PointCut, Joinpoint를 이해하는 데 도움이 될 수 있습니다.

    출처

    식당 유추를 사용한 설명 : @Victor의 출처

    외식을 할 때 메뉴를보고 선택할 수있는 몇 가지 옵션이 있습니다. 메뉴에있는 항목 중 하나 이상을 주문할 수 있습니다. 그러나 실제로 주문하기 전까지는 "식사 할 수있는 기회"에 불과합니다. 주문을하고 웨이터가 테이블에 가져다 놓으면 식사입니다.

    Joinpoints는 메뉴의 옵션이고 Pointcuts는 선택한 항목입니다.

    Joinpoint는 aspect 내에서 ... 기회를 적용 할 수있는 코드 내의 기회입니다. 일단 그 기회를 잡고 하나 이상의 Joinpoint를 선택하고 aspect를 적용하면 Pointcut을 얻게됩니다.

  2. ==============================

    2.조인 포인트와 포인트 컷의 차이를 이해하려면 pointcuts를 생각해보십시오. 위빙 규칙을 지정하고 이러한 규칙을 만족하는 상황으로 포인트를 조인합니다.

    조인 포인트와 포인트 컷의 차이를 이해하려면 pointcuts를 생각해보십시오. 위빙 규칙을 지정하고 이러한 규칙을 만족하는 상황으로 포인트를 조인합니다.

    아래 예에서,

      @Pointcut("execution(* * getName()")  
    

    Pointcut은 모든 패키지의 모든 클래스에있는 getName () 메소드에 advice가 적용되어야한다는 규칙을 정의하고, joinpoint는 클래스에있는 모든 getName () 메소드의리스트가 될 것이므로 advice가이 메소드에 적용될 수있다.

    (Spring의 경우 Rule은 Managed Bean에만 적용되며 advice는 public 메소드에만 적용 가능).

  3. ==============================

    3.JoinPoints : 기본적으로 실제 비즈니스 로직에 있어야하지만, 실제 비즈니스 로직의 일부는 아니지만 필요한 기타 기능을 삽입하고자합니다. JoinPints의 몇 가지 예는 다음과 같습니다. 메서드 호출, 정상적으로 반환되는 메서드, 예외를 throw하는 메서드, 개체 인스턴스화, 개체 참조 등

    JoinPoints : 기본적으로 실제 비즈니스 로직에 있어야하지만, 실제 비즈니스 로직의 일부는 아니지만 필요한 기타 기능을 삽입하고자합니다. JoinPints의 몇 가지 예는 다음과 같습니다. 메서드 호출, 정상적으로 반환되는 메서드, 예외를 throw하는 메서드, 개체 인스턴스화, 개체 참조 등

    Pointcuts : Pointcuts는 joinpoint를 식별하는 데 사용되는 정규식과 비슷합니다. Pontcuts는 "pointcut expression language"를 사용하여 표현됩니다. Pointcuts는 교차 절단 문제를 적용해야하는 실행 흐름 지점입니다. Joinpoint와 Pointcut은 차이가 있습니다. Joinpoints는 좀 더 일반적이며 pointcuts가 'cross-cutting concern을 도입하고자하는'joinpoints를 식별하는 동안 cross-cutting concern을 도입 할 수있는 모든 제어 흐름을 나타냅니다.

  4. ==============================

    4.AOP 개념에 익숙하지 않은 사람을위한 Layman 설명. 이것은 철저하지는 않지만 개념을 파악하는 데 도움이됩니다. 기본적인 전문 용어에 이미 익숙하다면 지금은 읽을 수 없습니다.

    AOP 개념에 익숙하지 않은 사람을위한 Layman 설명. 이것은 철저하지는 않지만 개념을 파악하는 데 도움이됩니다. 기본적인 전문 용어에 이미 익숙하다면 지금은 읽을 수 없습니다.

    정상적인 클래스 인 Employee가 있고이 메소드가 호출 될 때마다 무언가를하고 싶다고 가정 해보십시오.

    class Employee{
        public String getName(int id){....}
        private int getID(String name){...}
    }
    

    이러한 메소드를 JoinPoint라고합니다. 우리는 프레임 워크가로드 한 모든 클래스 메소드 중에서 메소드를 찾을 수 있도록 이러한 메소드를 식별 할 수있는 방법이 필요합니다. 그래서 우리는이 메소드의 서명과 일치하는 정규 표현식을 작성합니다. 아래에서 볼 수 있듯이 더 많은 내용이 있지만, 느슨하게이 정규식은 Pointcut을 정의합니다. 예 :

    * * mypackage.Employee.get*(*)
    

    첫 번째 *는 수정 자 public / private / protected / default입니다. 두 번째 *는 메서드의 반환 형식입니다.

    하지만 두 가지 더 말하면됩니다.

    이 두 가지 조합을 조언이라고합니다.

    상상할 수 있듯이 # 2 할 수있는 함수를 작성해야합니다. 그래서 이것이 어떻게 기본처럼 보일지 모릅니다.

    참고 : 명확하게하기 위해 * * mypackage.Employee.get * (*) 대신 REGEX 단어를 사용하십시오. 실제로 완전한 표현이 정의에 들어갑니다.

    @Before("execution(REGEX)")
    public void doBeforeLogging() {....}   <-- executed before the matching-method is called
    
    @After("execution(REGEX)")
    public void doAfterLogging() {....}  <-- executed after the matching-method is called
    

    이러한 것들을 꽤 많이 사용하기 시작하면 많은 @ After / @ Before / @ Around advices를 지정할 수 있습니다. 반복되는 정규 표현식은 궁극적으로 일을 혼란스럽고 유지하기 어렵게 만듭니다. 그래서 우리는 Aspect 클래스의 다른 곳에있는 표현식에 이름을 부여하고 사용합니다.

    @Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
    public void allGetterLogging(){} <-- This is usually empty
    
    @Before("allGetterLogging")
    public void doBeforeLogging() {....}
    
    @After("allGetterLogging")
    public void doAfterLogging() {....}
    

    BTW, 당신은 또한 Aspect라고 불리는 클래스에서이 전체 로직을 감싸고 싶을 것이고 클래스를 작성할 것입니다.

    @Aspect
    public class MyAwesomeAspect{....}
    

    이 모든 것들을 작동 시키려면 @AOP 키워드를 읽고, 이해하고, 조치를 취할 수 있도록 클래스를 구문 분석하도록 Spring에 지시해야합니다. 한 가지 방법은 spring config xml 파일에서 다음을 지정하는 것입니다.

  5. ==============================

    5.AspectJ와 같은 AOP 언어를 SQL과 같은 데이터 쿼리 언어와 비교하면 여러 행이있는 데이터베이스 테이블로 조인 포인트 (aspect code를 직조 할 수있는 코드의 모든 위치)를 생각할 수 있습니다. pointcut은 사용자 정의 된 행 / joinpoint의 하위 집합을 선택할 수있는 SELECT stamement와 같습니다. 선택한 장소에 직조하는 실제 코드를 조언이라고합니다.

    AspectJ와 같은 AOP 언어를 SQL과 같은 데이터 쿼리 언어와 비교하면 여러 행이있는 데이터베이스 테이블로 조인 포인트 (aspect code를 직조 할 수있는 코드의 모든 위치)를 생각할 수 있습니다. pointcut은 사용자 정의 된 행 / joinpoint의 하위 집합을 선택할 수있는 SELECT stamement와 같습니다. 선택한 장소에 직조하는 실제 코드를 조언이라고합니다.

  6. ==============================

    6.둘 다 aspect 지향 프로그래밍의 "where"와 관련이있다.

    둘 다 aspect 지향 프로그래밍의 "where"와 관련이있다.

    조인 포인트는 AOP로 코드를 실행할 수있는 개별적인 장소입니다. 예 : "메소드가 예외를 throw 할 때".

    pointcut은 join point의 모임입니다. 예 : "Foo 클래스의 메소드가 예외를 throw 할 때".

  7. ==============================

    7.문서에 따라 :

    문서에 따라 :

    Joint Points는 프로그램 실행시 이벤트로 간주 할 수 있습니다. Spring AOP를 사용한다면, 이것은 심지어 메소드의 호출로 제한된다. AspectJ는 더 많은 유연성을 제공한다.

    그러나 식당에 갈 때 메뉴에있는 모든 음식을 먹지 않는 것처럼 모든 이벤트를 처리하지는 않습니다 (나는 당신을 모른다. 그렇지만 나는 그렇지 않다.). 그래서 당신은 처리 할 사건들과 그들과 함께 할 일들을 선택합니다. 여기에 Pointcuts가 있습니다. 문서에 따라,

    그런 다음 Pointcut과 관련된 작업을 수행하면 조언이 제공됩니다. 문서에 따라,

    package com.amanu.example;
    
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    
    /**
     * @author Amanuel Nega on 10/25/16.
     */
    class ExampleBussinessClass {
    
        public Object doYourBusiness() {
            return new Object();
        }
    
    }
    
    @Aspect
    class SomeAspect {
    
        @Pointcut("execution(* com.amanu.example.ExampleBussinessClass.doYourBusiness())")
        public void somePointCut() {
        }//Empty body suffices
    
        @After("somePointCut()")
        public void afterSomePointCut() {
            //Do what you want to do before the joint point is executed
        }
    
        @Before("execution(* *(*))")
        public void beforeSomePointCut() {
            //Do what you want to do before the joint point is executed
        }
    
    }
    

    당신이 나를 믿지 않으면 문서를 볼 수 있습니다. 이게 도움이 되길 바란다

  8. ==============================

    8.JoinPoint : Joinpoint는 Exception 잡기, 다른 메소드 호출과 같이 실행 흐름이 변경된 프로그램 실행의 포인트입니다.

    JoinPoint : Joinpoint는 Exception 잡기, 다른 메소드 호출과 같이 실행 흐름이 변경된 프로그램 실행의 포인트입니다.

    PointCut : PointCut은 기본적으로 당신이 조언 (또는 aspect 호출)을 할 수있는 Joinpoint입니다.

    기본적으로 PointCuts는 JoinPoint의 하위 집합입니다.

  9. ==============================

    9.나는 mgroves와 동의한다. point cut은 다중 joint point의 콜렉션으로 간주 될 수있다. 공동 포인트는 조언이 구현 될 수있는 특정 위치를 지정합니다. 여기에는 포인트 컷이 모든 연결 지점의 목록을 반영합니다.

    나는 mgroves와 동의한다. point cut은 다중 joint point의 콜렉션으로 간주 될 수있다. 공동 포인트는 조언이 구현 될 수있는 특정 위치를 지정합니다. 여기에는 포인트 컷이 모든 연결 지점의 목록을 반영합니다.

  10. ==============================

    10.포인트 컷은 Aspect 클래스 구현에서 정의된다. 포인트 컷은 기본적으로 어드바이스 내의 pointcut 표현식을 가리 킵니다.

    포인트 컷은 Aspect 클래스 구현에서 정의된다. 포인트 컷은 기본적으로 어드바이스 내의 pointcut 표현식을 가리 킵니다.

    예를 들어,

    @Before("execution(* app.purchase2.service.impl.*(..))")
    public void includeAddOns(RolesAllowed roles) {
    ..
    }
    

    위의 의미는 "includeAddOns"메소드가 (@Before advice로 인해) 어떤 메소드 ( "app.purchase2.service.impl"패키지의 클래스에있는)를 호출하기 전에 호출됩니다.

    전체 주석을 포인트 컷이라고 부릅니다.    @Before ( "실행 (* app.purchase2.service.impl. * (..))")

    Joint point는 "app.purchase 2.service.impl"패키지의 메소드를 aspect 클래스 "include AddOns ()"의 메소드에 결합시킨 실제 메소드 호출이다.

    org.aspectj.lang.JoinPoint 클래스를 사용하여 조인 포인트의 속성에 액세스 할 수 있습니다.

  11. ==============================

    11.봄의 AOP는 {Advisor, Advice, Pointcut, Joinpoint}입니다.

    봄의 AOP는 {Advisor, Advice, Pointcut, Joinpoint}입니다.

    aop의 주요 목적이 애플리케이션 코드에서 cross-cutting concern 로직 (Aspect)을 분리하고,이를 Spring에서 구현하기 위해 (Advice / Advisor)

    Pointcut은 "모든 메소드가 insert로 시작합니다"와 같이 정확하게이 advice를 적용하고자하는 곳을 필터링하는데 사용됩니다. 그래서 다른 메소드가 제외 될 것입니다. 그래서 우리는 Pointcut 인터페이스 {ClassFilter and MethodMatcher}

    그래서 Advice는 cross-cutting 로직 구현이고 Advisor는 조언과 PointCut뿐입니다. advice 스프링 만 사용하면 Advisor에게 매핑되어 pointcut TRUE를 만듭니다. 이는 아무 것도 차단하지 않는다는 것을 의미합니다. 그래서 조언 만 사용하면 대상 클래스의 모든 메서드에 적용됩니다. 필터를 적용하지 않았기 때문입니다.

    하지만 Joinpoint는 프로그램의 한 위치입니다. Class 객체에 액세스 할 때 반성과 같은 생각을 할 수 있습니다. 그런 다음 Method 객체를 가져올 수 있습니다. 그런 다음이 클래스의 모든 메소드를 호출 할 수 있습니다. 그렇게하면 컴파일러가 작동합니다. 이것으로 Joinpoint를 상상할 수 있습니다.

    Joinpoint는 필드, 생성자 또는 메소드와 함께 할 수 있지만 Spring에서는 메소드와 만 joinpoint가 있으므로 Spring에서 (Join, Before, After, Throws, Around) Joinpoint 유형을 가지고 있으며 모두 클래스의 위치를 ​​참조합니다.

    앞에서 언급했듯이 (필터가없는) 포인트 컷 (pointcut)이없는 조언을하면 모든 메소드에 적용될 것입니다. 또는 특정 메소드에 적용될 조언자 (pointcut) 인 조언자를 가질 수는 있지만 조언 없이는 가질 수 없습니다 pointcut과 같은 joinpoint, 당신은 그것을 지정해야만합니다. 그래서 스프링의 advice 타입은 joinpoint와 정확히 같은 타입입니다. 그래서 조언을 선택할 때 당신은 어떤 joinpoint를 암시 적으로 선택할 것입니다.

    끝내려면 advice는 목표 클래스에 대한 aspect의 구현 로직이다.이 advice는 호출 전에, 호출 후에, 호출을 던지거나 호출 한 후에 joinpoint를 가져야한다. 그런 다음 pointcut을 사용하여 정확히 어디에 적용 할 것인지를 필터링 할 수있다. 메소드를 필터링하거나 포인트 컷 (필터 없음)을 사용하지 않으므로 클래스의 모든 메소드에 적용됩니다.

  12. ==============================

    12.JoinPoint : Advice가 실행될 어플리케이션에서 포인트 (메소드)를 지정합니다.

    JoinPoint : Advice가 실행될 어플리케이션에서 포인트 (메소드)를 지정합니다.

    Pointcut : JoinPoint의 조합이며 JoinPoint Advice가 실행될 위치를 지정합니다.

  13. ==============================

    13.join point는 실제로 우리가 조언을하는 곳입니다.

    join point는 실제로 우리가 조언을하는 곳입니다.

    그러나 포인트 컷은 조인 포인트의 모음입니다. 즉, 우리가 십자가 절단 논리를 사용하는 방법을 가리키는 것은 포인트 컷 (point cut)이라고 불립니다.

  14. from https://stackoverflow.com/questions/15447397/spring-aop-whats-the-difference-between-joinpoint-and-pointcut by cc-by-sa and MIT license