NeoDEEX 4.0.1.000 버전이 정식 릴리스 되었습니다.

버전 정보

어셈블리 버전: 4.0.0.0 (변경 없음)

파일버전: 4.0.1.000

설치패키지 버전: 4.0.1000

 

설치 방법

Standard/Enterprise Edition

다음과 같은 순서로 설치

1. 기존 버전이 이미 설치되어 있다면 먼저 Uninstall 합니다.
기존 버전 설치 여부는 제어판의 프로그램 추가/삭제에서 NeoDEEX 4.0이 존재하는지 확인하면 됩니다.

2. 배포된 Setup.exe 혹은 .msi 파일을 직접 수행하여 설치 합니다.

Free Edition

NuGet 패키지 관리자를 구동하여 NeoDEEX Free Edition을 검색하여 설치하거나 NuGet 패키지 콘솔을 이용하여 다음과 같이 명령을 수행합니다.

PM> Install NeoDEEX4.Free

NuGet 패키지가 자동으로 이전 버전을 Uninstall 하고 신규 버전을 Install 하게 됩니다.

주의) 4.0.0.011 버전을 사용하는 경우 FoxConfiguration.config 파일의 내용을 백업 받은 후 4.0.1.000 버전을 설치해야 합니다.

주요 변경 사항

Breaking Changes

FoxComponentBase 클래스에 AutoComplete(true) 추가

트랜잭션 자동 커밋/롤백을 제어하는 AutoComplete 특성이 FoxComponentBase에 추가되었습니다. 과거 버전에서는 COM+와의 호환성을 위해 개발자가 명시적으로 사용자의 클래스에 AutoComplete를 명시했어야 했습니다. 하지만, 이러한 방식은 COM+와의 호환성 외에는 아무런 도움이 되지 않았습니다. 특히, NeoDEEX를 처음 접하는 개발자가 데이터 액세스가 성공적으로 수행되었음에도 불구하고 ContextUtil.SetComplete() 호출을 하지 않아 트랜잭션이 롤백 되는 실수를 막을 수 있습니다.

이 변경 사항은 대부분의 프로젝트에 영향을 주지 않습니다. 다만, AutoComplete를 명시적으로 사용하지 않은 클래스/메서드에서 ContextUtil.SetComplete 혹은 ContextUtil.SetAbort 메서드를 호출하면 런타임 오류가 발생될 수 있습니다. 이러한 경우, 클래스/메서드에 명시적으로 AutoComplete(false)를 주면 됩니다.

FoxUserInfoContext 클래스의 메서드 이름 변경

FoxUserInfoContext 클래스의 두 메서드가 잘못된 스팰링을 수정하여 VersionIndepandantSerialize 및 VersionIndependentDeserialize 라는 이름으로 변경되었습니다.

이 메서드를 호출하는 어플리케이션은 컴파일 오류가 발생하게 됩니다. 소스 코드를 수정하고 다시 컴파일 해야 합니다.

New Features

FoxDbLogger/FoxDbLoggerProvider 추가

데이터베이스에 로그를 기록할 수 있는 FoxDbLogger 클래스와 그 프로바이더인 FoxDbLoggerProvider 클래스가 추가 되었습니다. FoxDbLogger는 저장 프로시저, Fox Query, SQL 문장을 이용하여 로그 메시지를 데이터베이스에 기록할 수 있습니다.

저장 프로시저, Fox Query, SQL 문장에 대한 선택은 구성 설정에서 CommandType 속성을 사용하여 구분할 수 있으며 저장 프로시저 이름, Fox Query 아이디, SQL 문장 자체는 CommandText 속성을 이용하여 지정할 수 있습니다. 로그를 기록하는데 사용하는 데이터베이스는 Fox Data Access 에서 사용하는 연결 문자열 이름을 ConnectionStringName 속성에 지정하면 됩니다.

개발자는 로그를 기록할 테이블을 생성하고 이 테이블에 로그 항목을 기록할 저장 프로시저, 혹은 SQL 문장을 작성하면 됩니다. FoxDbLogger는 로그가 기록될 테이블 스키마를 제한 하지 않습니다. 다만, 저장 프로시저 혹은 SQL 문장에 사용할 매개변수들만 맞추어 주면 됩니다. FoxDbLogger가 로그를 기록할 때 저장 프로시저, Fox Query, SQL 문장에게 전달하는 매개변수는 다음과 같습니다.

매개변수 이름

타입

비고

p_timestamp

DateTime 혹은 TimeStamp(오라클)

로그 발생 시간

p_source

NVarChar 혹은 NVarchar2(오라클)

로그 소스 이름

p_level

NVarChar 혹은 NVarchar2(오라클)

로그 레벨

p_message

NText 혹은 NClob(오라클)

로그 메시지

 

다음은 FoxDbLogger를 사용하기 위한 예제 구성을 보여 줍니다. 이 예제 구성에서 DbLoggerTest1 로거는 FoxInsertLogMessage라는 저장 프로시저를 호출하며, DbLoggerTest2 로거는 MyQuery.foxml 파일에서 InserLog 라는 아이디를 가진 쿼리를 수행하고, DbLoggerTest3 로거는 직접 주어진 SQL 문장을 수행합니다.

   1: <logging filter="Information">
   2:   <providers>
   3:     <provider name="TestDbLoggerProvider" type="TheOne.Diagnostics.Loggers.FoxDbLoggerProvider">
   4:       <property name="ConnectionStringName" value="Default"/>
   5:       <property name="CommandType" value="StoredProcedure"/>
   6:       <property name="CommandText" value="FoxInsertLogMessage"/>
   7:     </provider>
   8:   </providers>
   9:   <loggers>
  10:     <logger name="DbLoggerTest1" filter="Verbose" provider="TestDbLoggerProvider" />
  11:     <logger name="DbLoggerTest2" filter="Error" provider="TestDbLoggerProvider">
  12:       <property name="CommandType" value="FoxQuery" />
  13:       <property name="CommandText" value="FoxDbLoggerSqlServer.FoxInsertLogMessage" />
  14:     </logger>
  15:     <logger name="DbLoggerTest3" filter="Error" provider="TestDbLoggerProvider">
  16:       <property name="ConnectionStringName" value="Odp" />
  17:       <property name="CommandType" value="Text" />
  18:       <property name="CommandText" value="INSERT INTO FoxLog(Id, LogTimestamp, LogSource, LogLevel, LogMessage) VALUES(MySeq.NEXTVAL, @p_timestamp, @p_source, @p_level, @p_message)" />
  19:     </logger>
  20:   </loggers>
  21: </logging>

FoxDbLogger는 기본적으로 동기적인 방식으로 로그를 데이터베이스에 기록합니다. 하지만 데이터베이스 작업은 상대적으로 긴 작업을 수행하기 때문에 어플리케이션의 응답 속도를 제한할 수도 있습니다. 이러한 문제를 막기 위해 FoxDbLogger는 비동기적으로 로그 기록작업을 수행할 수 있습니다. <property name="OperationMode" value="TPL"> 을 구성에 명시하여 동기적인 로그 기록 대신 System.Threading.Tasks 네임스페이스의 Task 들을 이용하여 비동기적으로 로그를 DB에 기록하면 됩니다. 또한 <property name="MaxConcurrency" value="2">와 같은 설정을 통해 동시에 2개의 스레드 만이 로그 기록 작업에 사용되도록 구성이 가능합니다. 동시성을 제한함으로써 실제 어플리케이션 작업에 방해가 되지 않도록 제한 할 수 있습니다(기본값 1).

FoxComponentBase 클래스에 HandleChildException 속성 추가

FoxComponentBase 클래스는 처리되지 않은 예외가 발생하면 OnError 메서드를 호출하여 한 곳에서 예외 처리(로깅 등)를 수행할 수 있도록 해줍니다. 이 기능은 각 메서드에 try~catch 문장을 사용하여 예외 처리를 수행하지 않아도 되며 예외를 rethrow 하는 것을 막을 수 있습니다.

OnError 메서드는 FoxComponentBase 클래스(및 파생 클래스)뿐만 아니라 이 클래스의 메서드들이 호출하는 다른 코드에서 발생한 예외들에 대해서도 호출됩니다. 하지만 자주 이 기능은 중복 예외 처리 문제를 야기 합니다. 예외가 다른 컴포넌트에서 발생하고 이 예외가 예외 전파에 의해 전달되는 경우에도 OnError 메서드가 호출되기 때문입니다. 예를 들어 컴포넌트 A가 컴포넌트 B를 호출하는 경우, 컴포넌트 B(혹은 이 컴포넌트가 호출하는 다른 코드)에서 예외가 발생하면 컴포넌트 B의 OnError 메서드가 호출되며 이 예외가 처리되지 않고 전파되면 다시 컴포넌트 A의 OnError 메서드 역시 호출됩니다. OnError 메서드에서 예외를 로깅한다고 가정하면 하나의 예외에 대해 2개의 로그가 남게 됩니다. 이러한 현상이 문제는 아니지만 로그를 분석하기 어렵게 만들고 예외의 원인을 찾기 어렵게 만들 수 있습니다.

4.0.1.000 버전에 추가된 HandleChildException 속성은 OnError 메서드가 호출되는 방식을 제어할 수 있습니다. 기본값인 true가 지정되면 일반적인 예외 발생 및 전파에 따라 OnError 메서드가 호출되게 됩니다. 한편, false가 지정되면 다른 컴포넌트에서 전파된 예외에 대해서는 OnError 메서드가 호출되지 않습니다. 앞서의 예에서 컴포넌트 A의 HandleChildException 속성이 false 라면 컴포넌트 A의 OnError 메서드는 호출되지 않습니다.

OnError 메서드의 호출 여부는 예외 전파와 무관합니다. 예외는 일반적인 예외 전파에 의해 호출자(caller)에게 전파 됩니다.

HandleChildException 속성의 값은 매 예외 검사 때 마다 참조하므로 어느 시점에서 변경이 가능합니다. 하지만 생성자에서 이 속성 값을 지정하는 것이 가장 좋습니다.

Bug Fixed

All Edition

BUG-724: FoxUserInfoContext의 값으로 =(equal), ;(semi-colon) 문자가 포함되어 있으면 예외가 발생함.

BUG-842: Connection String Entryptor에서 구성 XML 생성 버튼이 예외를 유발함.

Enterprise Edition

BUG-845: FoxTaskProxy의 OnComplete 핸들러에서 다시 FoxTaskProxy 비동기 호출을 수행하면 UserInfoContext가 사라지는 현상.


경고 : 이 글을 무단으로 복제/스크랩하여 타 게시판, 블로그에 게시하는 것은 허용하지 않습니다.