Fox Transactions¶
NeoDEEX 의 Fox Transactions 은 COM+ 와 유사한 선언적/자동 트랜잭션 처리와 AOP(Aspect Oriented Programming) 기반의 수행 문맥(execution context)을 제공합니다. 전통적인 트랜잭션 처리 코드는 개발자에게 상당한 주의와 비용을 요구하며 코드의 복잡도를 증가시키고 코드의 재사용성과 유지보수성을 낮추게 됩니다. Fox Transactions 는 트랜잭션 처리를 방식을 선언적인 방법을 사용하고 자동으로 트랜잭션을 커밋하거나 롤백함으로써 개발자가 트랜잭션 처리 외에 비즈니스 로직과 데이터액세스 코드에 집중할 수 있도록 해줍니다. 상세한 내용은 Why Fox Transactions? 문서를 참고 하십시요.
Note
Fox Transactions 의 선언적 자동 트랜잭션은 COM+ 와 매우 유사하지만 COM+ 를 전혀 사용하지 않습니다. Fox Transactions 은 .net 의 크로스 플랫폼 능력 덕택에 분산 트랜잭션과 같은 일부 기능을 제외하고 Linux 환경에서도 사용이 가능합니다!
Fox Transactions 가 어떻게 선언적으로 자동 트랜잭션을 사용할 수 있는지 간단한 예제를 통해 배울 수 있습니다.
기본 작동 방식¶
Fox Transactions 의 핵심적인 기능은 트랜잭션 처리를 코드를 사용하지 않고 특성(attribute)을 사용하여 선언적으로 처리하며 트랜잭션 결과를 예외 발생 여부에 따라 커밋하거나 롤백하는 것입니다. 다음 코드는 Fox Transactions 를 사용하는 트랜잭션 코드의 예를 보여 줍니다.
위 코드에서 FoxTransactionsAttribute 특성은 TxComp 클래스의 public 메서드들이 트랜잭션을 사용한다는 것을 명시합니다. 그리고 FoxAutoCompleteAttribute 특성은 InsertData 메서드에서 예외 발생 여부에 따라 트랜잭션을 커밋/롤백을 자동으로 처리함을 선언합니다.
InsertData 메서드 호출이 트랜잭션을 자동으로 시작하고 커밋/롤백하도록 하려면 다음과 같이 CreateExecution<T> 메서드를 호출하여 수행 환경(execution environment)를 생성하고 사용해야 합니다.
Note
Fox Transactions 에 대한 기본적인 사용법에 대해서는 Fox Transactions Basics 문서를 참고하십시요.
Fox Transactions 에서 트랜잭션이 자동으로 시작하고 커밋 혹은 롤백되는 작동 원리는 대상 메서드 호출 전/후에 Fox Transactions 의 핵심 코드들이 수행되기 때문입니다. 이를 위해서는 메서드 호출을 가로채어(interception) 전처리(preprocessing) 및 후처리(postprocessing)를 수행해야 합니다. 다음 그림은 일반적인 메서드 호출 상황과 Fox Transactions 이 호출을 가로채기한 후 전처리와 후처리를 수행하는 상황을 보여줍니다.
Fox Transactions 은 호출을 가로채기 위해 FoxComponentBase 클래스에 CreateExecution<T> 메서드를 제공하며 이 메서드를 통해 생성된 수행 프록시(execution proxy)가 전처리/후처리를 수행하도록 만듭니다. FoxComponentBase 클래스는 Fox Transactions 기능을 사용하기 위한 최상위 추상 베이스 클래스이지만 이 외에도 다양한 베이스 클래스들을 제공합니다.
Fox Transactions 의 전처리 코드는 대상 메서드의 트랜잭션 설정(FoxTransactionAttribute 특성)을 읽어 새로운 트랜잭션을 시작하거나 기존 트랜잭션에 참여하게 됩니다. 트랜잭션 외에도 메서드의 성능 측정을 위한 작업 FoxDbAccess 인스턴스 생성 등 다양한 전처리 작업을 수행한 후 대상 메서드를 정상적으로 호출합니다.
대상 메서드가 수행을 완료하면 Fox Transactions 의 후처리 코드는 대상 메서드가 예외를 발생했는지를 검사하여 트랜잭션을 커밋하거나 롤백합니다. 트랜잭션 종료 외에도 성능 정보 수집, 데이터베이스 연결 닫기 등의 추가적인 후처리 작업을 수행하고 결과를 호출자에게 반환합니다.
Note
Fox Transactions 의 작동 방식에 대한 조금 더 상세한 내용은 작동 원리 문서를 참고 하십시요.
주요 기능들¶
Fox Transactions 은 개발자가 비즈니스 로직 코드와 데이터액세스 코드를 작성할 때 트랜잭션 관리와 데이터베이스 연결 관리 등의 "부수적"인 사항보다 실질적인 로직 작성에 몰두할 수 있도록 다양한 기능을 제공합니다.
선언적 트랜잭션¶
Fox Transactions 을 사용하면 트랜잭션을 시작하고 종료(커밋/롤백)하는데 코드를 사용하지 않습니다. AOP(Aspect Oriented Programming) 프로그래밍과 유사한 방식으로 FoxTransactionAttribute 특성 특성을 사용하여 메서드가 트랜잭션을 사용할 것인지 여부를 명시합니다. FoxTransactionOption 열거 타입은 메서드가 트랜잭션을 시작할 것인지 기존 트랜잭션에 참여할 것인지를 나타냅니다. 이 특성과 열거 타입에 대한 구체적인 사용 방법은 선언적 트랜잭션 문서를 참고하십시요.
자동 트랜잭션¶
Fox Transactions 는 개발자가 트랜잭션의 커밋/롤백을 위해 try~catch 문장을 사용하여 명시적으로 커밋/롤백 메서드를 호출할 필요가 없습니다. FoxAutoCompleteAttribute 특성을 사용하면 트랜잭션에 참여한 메서드가 종료될 때 예외 발생 여부에 따라 트랜잭션을 커밋하거나 롤백합니다. 만약 코드에 의해 트랜잭션의 커밋/롤백을 제어해야 한다면 FoxAutoCompleteAttribute 특성에 false 값을 사용하고 SetComplete 혹은 SetAbort 메서드를 호출하여 트랜잭션 성공/실패 여부를 지정할 수 있습니다. 상세한 내용은 자동/수동 트랜잭션 문서를 참고 하십시요.
트랜잭션 컨트롤러¶
Fox Transactions 에서는 트랜잭션을 시작/커밋/롤백 하는 핵심적인 작업을 트랜잭션 컨트롤러가 수행합니다. FoxTransactionControllerAttribute 특성을 통해 사용하고자 하는 트랜잭션 컨트롤러를 지정할 수 있으며 디폴트로 FastTransaction 컨트롤러가 사용됩니다. FastTransaction 컨트롤러는 System.Transactions 에서 제공하는 트랜잭션 API 를 내부적으로 사용하는 컨트롤러로서 대부분의 상황에서 사용할 수 있습니다. 하지만 이 트랜잭션 컨트롤러는 분산 트랜잭션에 대한 의존성이 높기 때문에 분산 트랜잭션을 사용할 수 없는 Linux 플랫폼이나 클라우드 환경에서 사용하기 어렵습니다.
한편 LocalTransaction 컨트롤러는 분산 트랜잭션을 사용하지 않기 때문에 Linux 환경이나 클라우드 환경에서도 사용 가능합니다. `LocalTransaction 컨트롤러는 트랜잭션 내에서 하나의 데이터베이스 연결만을 허용하기 때문에 FoxDacBase 에서 파생된 클래스에서 제공하는 DbAccess 속성을 사용하여 데이터베이스 액세스를 수행해한다는 제약사항을 갖습니다.
상세한 내용은 트랜잭션 컨트롤러 문서를 참고 하십시요.
수행 문맥과 수행 확장¶
Fox Transactions 의 작동 방식을 나타낸 위 그림에서 전처리와 후처리가 이루어지는 환경을 수행 문맥(Execution Context)이라 부릅니다. Fox Transactions 의 트랜잭션 처리는 수행 문맥을 생성해야만 작동합니다.
수행 문맥에서는 트랜잭션 처리와 비슷하게 메서드 수행 전에 수행되는 전처리 과정이나 메서드 수행 후에 수행되는 후처리 과정을 사용자 정의할 수도 있습니다. IFoxExecutionExtension 인터페이스를 구현하는 특성(Attribute) 클래스를 정의하면 이 특성이 명시된 메서드의 호출전과 호출후에 수행되는 코드를 작성할 수 있습니다. 수행 확장을 통해 간단한 AOP(Aspect Oriented Programming) 환경을 구성할 수도 있습니다. 상세한 내용은 수행 확장 문서를 참고 하십시요.
Summary¶
Fox Transactions 의 선언적 자동 트랜잭션 처리 기능은 개발자가 트랜잭션 처리보다 어플리케이션의 로직에 집중할 수 있도록 도와주며, 트랜잭션 처리에 경험과 지식이 부족한 개발자도 손쉽고 빠르게 트랜잭션 처리 어플리케이션을 작성할 수 있도록 해줍니다.
