Execution Extension¶
Fox Transactions 는 선언적/자동 트랜잭션 처리를 위해 메서드 호출에 전처리/후처리를 사용하며 사용자 정의 전처리/후처리도 가능합니다. 사용자 정의 전처리/후처리를 위해 IFoxExecutionExtension 인터페이스가 제공되며 이 인터페이스를 구현하는 특성(Attribute) 클래스를 수행 확장(Execution Extension)이라고 부릅니다.
이 문서와 관련된 예제 코드는 다음을 참조 하십시요.
개요¶
Fox Transactions 의 수행 확장은 간단한 AOP(Aspect Oriented Programming) 환경을 제공하여 비즈니스 로직 클래스와 DAC 클래스에 다양한 기능을 추가할 수 있습니다. 예를 들어 MyLoggingAttribute 특성을 작성하여 메서드에 호출 전/후에 로그를 기록하거나 MyCacheAttribute 특성을 작성하여 데이터베이스 액세스에 대한 캐시를 구현할 수도 있습니다. 다른 AOP 프레임워크들 만큼 강력하지 않지만 트랜잭션을 처리하는 핵심 비즈니스 로직과 데이터 액세스 코드들이 간단한 AOP 환경을 사용할 수 있습니다.
위 예제의 MyLoggingAttribute 특성처럼 수행 확장은 클래스 수준 특성 혹은 메서드 수준 특성을 사용하여 모두 선언할 수 있습니다. 클래스 수준과 메서드 수준에서 수행 확장을 모두 수행할 것인지 메서드 수준의 특성이 클래스 수준의 특성을 오버라이드 할 것인지를 스스로 결정할 수 있습니다.
IFoxExecutionExtension 인터페이스¶
수행 확장을 작성하기 위해서는 Attribute 클래스에서 파생된 특성 클래스에 IFoxExecutionExtension 인터페이스를 구현해야 합니다.
-
Initialize메서드수행 확장이 특성(atttribute)이기 때문에 생성자에 기반한 초기화를 기대할 수 없습니다. 따라서 Fox Transactions 엔진에 의해 특성이 읽혀질 때 수행 확장의
Initialize메서드가 호출됩니다. 클래스 수준 및 메서드 수준에 대해서 모두 호출되며 클래스 수준에 대해Initialize메서드가 호출될 때에는method매개변수 값은null입니다.다음 코드는
MyLoggerAttribute가 구현하는Initialize메서드의 예로서 수행 확장 특성이 적용된 타입이름을 로그 기록에 사용할 로거 이름으로 초기화하는 예제 입니다.Info
Initialize메서드의 반환값은 0 을 반환해야 합니다. 현재 구현 상Initialize의 반환값은 무시되지만 추후 이 값에 따라 수행 확장이 작동 방식이 달라질 수 있기 때문에 0 을 반환해야 합니다. -
PreProcess메서드초기화가 완료된 후 트랜잭션 메서드가 호출되기 전에
PreProcess메서드가 호출됩니다. 트랜잭션 처리 전에 수행 확장의PreProcess메서드가 먼저 호출되기 때문에 트랜잭션 처리에 영향을 주는 작업도 수행할 수 있습니다. 매개변수로 전달되는FoxExecutionContext객체를 통해 호출되는 메서드에 대한 정보, 트랜잭션 사용 여부, 매개변수 값 등의 정보를 알아낼 수 있습니다.다음 코드는
MyLoggingAttribute가 구현하는PreProcess메서드의 예로서 호출된 메서드 이름과 매개변수 이름/값을 로그에 기록하는 예제 입니다. -
PostProcess메서드트랜잭션 메서드가 호출된 후에
PostProcess메서드가 호출됩니다. 트랜잭션 처리 후에 수행 확장의PostProcess메서드가 호출되기 때문에 메서드의 트랜잭션 성공/실패를 바꿀 수는 없습니다. 매개변수로 전달되는FoxExecutionContext객체를 통해 호출된 메서드에 대한 정보, 트랜잭션 사용 여부, 매개변수 값, 반환값, 예외 정보 등의 정보를 알아낼 수 있습니다.다음 코드는
MyLoggingAttribute가 구현하는PostProcess메서드의 예로서 예외가 발생하지 않은 경우 결과 값을, 예외가 발생한 경우 예외 타입을 로그에 기록하는 예제 입니다. -
ShouldOverride속성수행 확장이 클래스 수준과 메서드 수준 모두에서 선언된 경우 메서드 수준의 특성이 클래스 수준의 특성을 오버라이드 할 것인지 여부를 결정하는 속성입니다.
ShouldOverride속성이true을 반환하면 메서드 수준의 특성이 클래스 수준의 특성을 오버라이드 하며false를 반환하면 클래스 수준과 메서드 수준의 특성이 모두 적용되어PreProcess와PostProcess메서드가 각각 호출됩니다.Initialize메서드는 클래스 수준과 메서드 수준 모두에서 호출되며ShouldOverride속성의 값과 관계없이 클래스 수준과 메서드 수준의 특성이 모두 초기화됩니다.다음 코드는
MyLoggingAttribute가 구현하는ShouldOverride속성의 예로서true를 반환하여 메서드 수준의 특성이 클래스 수준의 특성을 오버라이드 하도록 하는 예제 입니다.BizClass클래스의InsertOne메서드는 클래스 수준의MyLoggingAttribute특성만 적용되어 디폴트 로거에 로그가 기록되지만InsertMany메서드는 메서드 수준의MyLoggingAttribute특성이 클래스 수준의 특성을 오버라이드 하기 때문에other_logger_name로거에 로그가 기록됩니다.
Summary¶
Fox Transactions 의 수행 확장은 비즈니스 로직 클래스와 DAC 클래스에 다양한 기능을 추가할 수 있는 간단한 AOP 환경을 제공합니다. IFoxExecutionExtension 인터페이스를 구현하는 특성 클래스를 작성하여 수행 확장을 정의할 수 있으며 클래스 수준과 메서드 수준 모두에서 선언할 수 있습니다. Initialize, PreProcess, PostProcess 메서드와 ShouldOverride 속성을 구현하여 수행 확장의 동작을 정의할 수 있습니다.