[SPRING-2] Spring AOP

18223 ワード

今までSpringを勉強していた時にAOPについて聞いたことがありますが、実際に使ったことはないようです.
そして、この技術がどこで使われているのかも知らずに勉強したようです.
そこで今回はなぜAOPを書くのかを重点的に学びました

AOPとは?


AOPは側面向けプログラミングの略で、観点向けプログラミングです.
注目点を分離することによってモジュール化の程度を向上させることを目的とするプログラミングモード.

上の写真から分かるように、フライドチキン屋とクーボンが提供するサービスはそれぞれ違います.
フライドチキン店で注文を受けた後、フライドチキンの材料を作って料理をし、料理した食べ物を包装して配送します.
クーパンの場合、注文を受けて、要求された貨物を整理し、整理された貨物を包装して配送します.
コア機能の観点から見ると、フライドチキン店とクーボンの業務は異なる.フライドチキン店は飲食関連機能を提供し、クーボンは物流配送サービスを提供している.
しかし,付加機能の観点から,受注と送信はコアビジネスロジックというより付加機能である.本当に重要な機能は2番と3番で、それぞれあなたの要求をどのように処理するかを説明します.

これは重要なビジネスロジックではありませんが、AOPは実行する必要がある重複タスクを整理するための技術です.

AOPは観点向けプログラミングと呼ばれているが,オブジェクト向けプログラミングに取って代わるものではない.
開発者が実際のビジネスロジックに集中できるように、追加ロジックを分離してさらに抽象化し、OOPをよりOOPにすることができます.
複数の重複機能が存在する場合でも、OOPはオブジェクトを同じ責任と論理を実行するように構成します.この場合、様々な重複コードが避けられず、修正と拡張の過程で複雑な構造と重複コードに遭遇する.
しかし、AOPの共同応用に伴い、OOPを通じて本当に重要なビジネスドメインを具体化し、AOPを通じてトランザクション、記録、監視などの追加機能を実現することができます.

AOPで使用される用語

  • Target

  • ターゲットとは、追加機能を提供するターゲットです.注文や配送などの付加機能を受けたチキン屋を目指す.
  • Advice

  • Advice自体が付加機能です.受注などの追加機能を含むインプリメンテーション自体は、これらの機能をいつ使用するかを定義します.定義されたインプリメンテーションを指し、注文がいつ受信されるかを示します.
  • JoinPoint
  • JoinPointとは、Adviceが適用される場所です.これは、どの方法でAddiceを実行するかを意味します.
  • PointCut
  • Point Cutは、コンサルティングを適用するためにJoinPointをフィルタリングする機能を提供します.最終的には、[ポイントカット](Point Cut)は、追加の機能が適用されるオブジェクトを選択する方法と言えます.受注機能は、フライドチキン店またはクーボンの任意の特定の方法で実行されるように設定できます.
  • Aspect

  • 「評価」(Asspect)は、コア機能に付加され、意味を持つ付加機能を含むモジュールです.
    これは、AddiceやPointCutなどの追加機能を処理するためのモジュールのセットです.
  • Proxy

  • Proxyはターゲットを上書きするオブジェクトです.アプリケーションがターゲットを呼び出すと、実行前と実行後に必要な機能を実行するためにProxyが呼び出されます.

    コードで理解しよう!


    AOPを実際のコードに適用するとともに,AOPについて簡単な学習を行った.
    @Component
    public class ChickenHouse {
    
        public void open(){
            System.out.println("환영합니다! 치킨집입니당!");
        }
    
        public void makeChicken() {
            System.out.println("재료를 가공하고 튀김기를 통해 조리하기");
        }
    
        public void packChicken() {
            System.out.println("조리된 음식을 박스에 포장하기");
        }
    
        public void nonException() {
            System.out.println("제대로 실행되었습니다!");
        }
    
        public void exception() {
            throw new RuntimeException("예외 발생!");
        }
    }
    ChickenHouseは簡単な方法を含むクラスです.このクラスでAOPをテストした.
    package com.example.springaop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    @Aspect 
    @Component 
    public class ChickenHouseAspect {
    	...
    }
    
    ChickenHouseAsspectクラスが構成され、このクラスに追加機能が含まれています.
    表示機能として説明クラスを表示できます.
    @Pointcut("execution(* com.example.springaop.ChickenHouse.*(..))")    
    public void commonPointcut() {
    }
    Pointcut Arnolationでは、Adivceの論理後の動作を指定できます.
    @Before("execution(* com.example.springaop.ChickenHouse.makeChicken(..))")
    public void before(JoinPoint joinPoint) {
         System.out.println(joinPoint.getSignature().getName() +
                    " : 실행전 먼저, 주문을 요청 받습니다!");
    }
    Before Notationでは、切り込み点として指定された論理を実行する前に付加的な機能を実行する機能が提供される.
    @After("execution(* com.example.springaop.ChickenHouse.packChicken(..))")
    public void after(JoinPoint joinPoint) {
         System.out.println(joinPoint.getSignature().getName() + " : 실행후, 배달을 시작합니다.");
    }
    After Arotationは、Pointcutとして指定されたロジックを実行した後に付加機能を実行することをサポートします.
    @Pointcut("execution(* com.example.springaop.ChickenHouse.returnNumber())")
    public void returnNumber() {
    }
    
    @AfterReturning(pointcut = "returnNumber()", returning = "value")
    public void afterReturning(JoinPoint joinPoint, int value) {
          System.out.println(joinPoint.getSignature().getName() + " : 반환된 값은 : " + value);
    }
    AfterReturn Artimationは、指定された論理が正常に動作した後に返される値を受信し、後続の処理を行う機能を提供します.
    @AfterThrowing(value = "execution(* com.example.springaop.ChickenHouse.exception(..))", throwing = "e")
    public void afterThrowing(JoinPoint joinPoint, Exception e) throws RuntimeException {
         System.out.println(joinPoint.getSignature().getName() + " : exception이 터졌습니다!!");
        System.out.println("exception : " + e.toString());
    }
    「AfterThrowing Arotation」は、指定された論理に異常が発生した場合に異常を受信し、後続の論理を処理する機能を提供します.
    @Around("execution(* com.example.springaop.ChickenHouse.open())")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
         System.out.println("-----------------실행전---------------");
         joinPoint.proceed();
         System.out.println("-----------------실행후---------------");
    }
    Around Arnolationでは、指定した論理実行前および実行後に実行する追加機能を設定できます.

    今回の学習では,AOPを単純に使用する理由と,AOPをどのように使用するかを理解した.