Why Fox Transactions?¶
Fox Transactions 는 선언적 트랜잭션 기능과 자동 트랜잭션 기능을 통해 개발자들이 트랜잭션 처리 보다는 비즈니스 로직에 집중할 수 있는 개발 환경을 제공합니다. 이 문서에서는 기존 전통적인 트랜잭션 코드들의 문제점을 소개하고 Fox Transactions 의 해결 방법은 무엇인가를 설명합니다.
기존 트랜잭션 코드의 문제점¶
트랜잭션 처리는 개발자에게 상당한 주의와 비용을 요구합니다. 데이터베이스 접근 도중 오류가 발행하면 트랜잭션 롤백을 해야 하며 성공적인 처리가 끝나면 커밋을 수행해야 합니다. 다음은 FoxDbAccess 를 사용한 트랜잭션 코드의 예를 보여줍니다.
레거시 ADO.NET 트랜잭션 코드에 비해 NeoDEEX 의 FoxDbAccess 클래스가 편리한 트랜잭션 코드를 작성할 수 있도록 해주지만 여전히 개발자는 트랜잭션의 시작과 종료에 대해 세심하게 관리해야 합니다. 예를 들어 오류 발생 여부 혹은 로직의 성공 여부에 따라서 트랜잭션을 커밋하거나 롤백하는 코드를 작성해야 합니다(CommitTrans/RollbackTrans 메서드 호출). 개발자를 더욱 힘들게 하는 부분은 하나의 트랜잭션 내에서 데이터베이스 호출이 여러 차례 발생하는 상황입니다.
코드의 유지 보수와 재사용성을 위해 데이터액세스 코드를 리펙터링하여 여러 메서드로 분리하면 트랜잭션 처리를 더욱 어렵게 만듭니다. 개발자는 트랜잭션을 수행하기 위해 FoxDbAccess 객체(혹은 Connection 객체)를 여러 메서드 호출 사이에서 관리하고 유지해야 합니다. 더욱이 재사용성이 고려된 각 데이터액세스 메서드는 트랜잭션 시작 여부에 따라서 트랜잭션을 커밋할지 아니면 호출자가 트랜잭션을 제어하도록 할 것인지를 결정해야 합니다.
위와 같은 코드는 비즈니스 로직을 구현하는데 핵심적인 데이터액세스 그 자체보다 트랜잭션 처리에 더 많은 노력을 요구할 수 있습니다. 그리고 하나의 앱에서 위와 같은 트랜잭션 처리를 요구하는 데이터액세스 메서드는 수십 수백개가 될 수도 있습니다!
Fox Transactions 의 해결 방안¶
Fox Transactions 는 복잡한 트랜잭션 처리를 단순화 시켜줍니다. 트랜잭션은 메서드 시작과 동시에 자동으로 시작되며 메서드 내에서 접근하는 데이터베이스 연결은 트랜잭션에 자동으로 참여(enlist)하게 됩니다. 개발자는 트랜잭션에 참여한 연결을 유지할 필요가 없으며 데이터베이스 접근이 완료되면 연결을 닫을 수 있습니다. 메서드가 종료되지 않는한 연결이 닫히더라도 트랜잭션은 여전히 유효한 채로 남아 있습니다. 트랜잭션의 커밋/롤백 여부는 메서드 종료시 예외 발생 여부로 결정됩니다. 메서드가 예외 발생에 의해 종료되는 경우 트랜잭션은 롤백되며 그렇지 않은 경우 트랜잭션은 커밋됩니다.
다음 코드는 Fox Transactions 을 사용하여 트랜잭션을 처리하는 코드 입니다. TxComp 클래스를 FoxComponentBase 에서 파생하고 FoxTransactionAttribute 특성을 추가하여 클래스의 메서드(들)이 트랜잭션을 사용하는 것으로 지정(Required)합니다(선언적 트랜잭션).
Note
FoxComponentBase 클래스는 Fox Transactions 을 사용하기 위한 최상위 베이스 클래스이며 이 클래스에서 FoxBizBase, FoxDacBase 클래스등이 파생되었습니다. FoxComponentBase 클래스에서 직접 파생하여 사용하는 경우는 별로 없으며 FoxBizBase 나 FoxDacBase 에서 파생된 클래스를 작성하는 것이 일반적입니다.
InsertData 메서드는 BeginTrans, CommitTrans, RollbackTrans 메서드 호출 등 트랜잭션 관련 코드가 없으며 오류를 확인하기 위한 try~catch 문장도 없음에 주목하십시요. InsertData 메서드가 호출되면 자동으로 트랜잭션이 시작되며, 오류 없이 메서드가 종료되면 트랜잭션이 커밋되고 예외가 발생하면 트랜잭션이 롤백됩니다(자동 트랜잭션).
앞서 살펴보았던 여러 메서드에 분산된 데이터액세스 코드 역시 FoxTransactionAttribute 특성을 사용하여 선언적으로 간단히 해결할 수 있습니다. FoFoxTransactionOption.Required 옵션은 트랜잭션이 이미 시작한 채로 DoDataAccess1 메서드가 호출되면 기존 트랜잭션에 참여하지만 트랜잭션이 시작되지 않고 메서드가 호출되면 새로운 트랜잭션을 자동으로 시작합니다.
이처럼 Fox Transactions 를 사용하면 개발자는 트랜잭션 처리보다는 핵심적인 비즈니스 로직과 데이터액세스 코드에 집중할 수 있습니다. 트랜잭션의 시작과 커밋/롤백은 Fox Transactions 기능에 의해 선언적으로, 그리고 자동으로 처리될 것입니다.
Summary¶
전통적인 트랜잭션 처리 코드는 개발자에게 상당한 주의와 비용을 요구합니다. 특히, 하나의 트랜잭션 내에서 여러 데이터베이스 액세스를 요구하는 경우 코드의 복잡도는 더욱 증가하며 이러한 복잡도는 코드의 재사용성과 유지보수성을 낮추게 됩니다.
Fox Transactions 는 트랜잭션 처리를 방식을 선언적인 방법을 사용하고 자동으로 트랜잭션을 커밋하거나 롤백함으로써 개발자가 트랜잭션 처리 외에 비즈니스 로직과 데이터액세스 코드에 집중할 수 있도록 해줍니다.