Defcos W6D1


バックエンド設計コースにおける重要な概念や課題開発ログをまとめた空間である.

AoP(Aspect Orient Programming)


これは観点を導くプログラミングであり,層間の共通の興味点の分離ではなく各層の共通の興味点の分離を許容することによってモジュール性を増加させることを目的とする.特に、特定の階層ではなく特定の階層でのみ実行される注目点(トランザクション管理、セキュリティの記録や追跡など)を抽象化して分離すると、開発者はコアビジネスロジックに集中できます.
//1. 타겟(실제 비지니스 로직을 담당하는 메소드)
public class A {  
	public void m(){
    	System.out.println("actual business logic");
    }  
}  

//2. 어드바이서(단일 메소드 인터페이스 구현체)
public class BeforeAdvisor implements MethodBeforeAdvice{  
    @Override  
    public void before(Method method, Object[] args, Object target)throws Throwable {  
        System.out.println("additional concern before actual logic");  
    }  
}  

//3. 프록시 팩토리
public class ProxyFactory {  
  private Object target; //타겟인 클래스 A에 의존하는 팩토리  
  private List interceptorNames;  
}  

public class Test {  
  public static void main(String[] args) {  
      ApplicationContext appConext r= new ApplicationContext(AppConfig.class);  
      
      A a = appContext.getBean("proxyFactory", A.class);  
      //타겟 메소드 호출 전/후로 프록시가 어드바이서 명령 수행 
      a.m();  
  }  
}  

>> result
additional concern before actual logic
actual business logic

+ Proxy


ユーザが直接動作を指示することが困難な場合、通常、動作を実行する指示の代わりにオブジェクトが使用される.SpringのAOPではクライアントとターゲットマシンの間に透明に存在し,ターゲットメソッドの前後に付加的な機能を提供するためにエージェント構造を用いた.

@AspectJ


Springが提供する認証ベースのサービスは、横断的な注目点を持つモジュールに認証を追加し、AOP環境を自動的に構築することができます.

Target
コア機能を備えたモジュールとして、
Join Point
デバイスが適用可能な場所
ターゲットオブジェクトが実装するインタフェースのすべての方法
Aspect
仕様=説明+点切り
Spring「チェック」を空にする
Pointcut
これは、ターゲットに適用されるメソッドをフィルタする正規表現です.式を重点的に切削して実行を開始し,主に比較方法の署名方法を利用する.
execution([접근제어자] 반환타입 패키지명.클래스명(매개변수타입))

App클래스의 public 메소드 String을 반환하는 것에만 주입
>> execution(public String com.spring.App.*(..))

App클래스의 모든 메소드 중 첫번째 매개변수가 long인 것에만 중비
>> execution(* com.spring.App.*(long, ..))
ヘルプ
ターゲットノードの付加機能(@Before,@After,@Around,@AfterReturning,@AfterThrowing)

Spring AOPの使用例

@Aspect
@Component
public class LoggingAspect {
	private static final Logger log = LoggerFactory.getLogger(LoggingAspect.class);
    
    @Pointcut(execution(public String com.spring.App.*(..))")
    public void servicePointcut() {
    
    };
    
   	@Around("servicePointcut()")
    public Object log(ProceedingJoinPoint joinPoint) {
    	log.info("Before Method");
        var result = joinPoint.proceed();
        log.info("After Method");
    }
}

@Transactional


トランザクション管理をサポートすることで、原子的なトランザクションタスクが失敗した場合にロールバックすることができ、開発者はロールバックプロセスを考慮せずにビジネスロジックのみを作成し、SpringのAOPを通じて私が作成したビジネスロジックをエージェントのように使用し、トランザクション管理をサポートする機能を提供した.
@ComponentScan
@Configuration
public class Config {
	@Bean
    public DataSource dataSource() {
    	return new DataSource();
    }
    
    @Bean
    public PlatformTransactionManager platformTransactionManager(DataSource dataSource) {
    	return DatasourceTransactionManager(dataSource);
    }
    
    @Bean
    public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager) {
    	return new TransactionTemplate(platformTransactionManager);
    }
}
....

@Component
public class TransactionTest {
	@Autowired
    private TransactionTemplate transactionTemplate;
    
    public void method() {
    	//템플릿 콜백을 사용한 트랙잭션 콜백 관리
        //단일 메소드 인터페이스를 익명 클래스로 전달
        transactionTemplate.execute(
        	@Override
            protected void doInTransactionWithoutResult(Transaction status) {
            	//하나의 트랙잭션으로 정의할 sql문 
            }
        );
    }
}

Transaction Propagation


@Transactionalのメソッドは、トランザクション内で実行されるロールで、呼び出しられたトランザクションタグを内部に持つメソッドがある場合、開発者はspringが処理できるポリシーを指定し、トランザクションの伝播設定と呼ばれます.伝播の設定オプションは、次のようになります.
REQUIRED (default)
親トランザクションが存在する場合は親トランザクションとして連結し、親トランザクションが存在しない場合は新しいトランザクションを作成してトランザクションにロールバックします.
REQUIRES_NEW
新しいトランザクションが無条件に作成され、各トランザクションが存在しても相互に影響しません.
MANDATORY
親トランザクションを追加します.親トランザクションがない場合は、例外の発生を選択できます.
NESTED
親トランザクションが新しく作成されたトランザクションの場合、内部トランザクションでロールバックされると親トランザクションには影響しませんが、親トランザクションでロールバックされると、自分のトランザクションでロールバックされます.
NEVER
トランザクションが作成されず、親トランザクションがある場合は例外が発生します.
SUPPORTS
親トランザクションが存在する場合は、トランザクションがマージされます.存在しない場合は、他のトランザクションは作成されません.
NOT SUPPORTS
親トランザクションが存在する場合は、トランザクションは保持されます.存在しない場合は、他のトランザクションは作成されません.

Transaction Isolation


各トランザクション間のコンシステンシ・データの許容度をトランザクションの孤立度として定義し、他のトランザクションが自分のトランザクションで発生したデータの変化をどの程度クエリーできるかを決定します.

Dirty reads
トランザクションでは、未完了のトランザクションに対する変更が表示されます.
Non-repeatable reads
トランザクションが同じクエリーを2回実行し、別のトランザクションが変更または削除された場合.
Phantom reads
トランザクションが同じクエリの2回の間に存在しないレコードを追加した場合.
AoP
トランザクションの伝播
トランザクション独立性レベル