이전 포스트(닷넷 트랜잭션 정리)에서 닷넷 프레임워크 2.0부터 제공해주는 TransactionScope 클래스를 사용하여 Oracle DB에서 트랜잭션을 처리하기 위해서는 Ora MTS가 필요한 것을 알았다. Windows Vista에서 Ora MTS를 사용하여 트랜잭션을 처리하기 위해서는 패치가 필요하다. 다음 표는 운영체제별로 Oracle 10g로 트랜잭션을 처리하기 위해서 필요한 프로그램을 정리해보았다.
                                                                                                                                       (32bit 기준)
 Windows Xp(Server 2000)  Windows Vista(Server 2008)
 Oracle 10g  10.1.0.2  10.2.0.3
 ODAC(Ora MTS)  10.1.0.4.0  10.2.0.2.21
 Patch Set  X  10.2.0.4

Oracle 10g 다운로드 : http://www.oracle.com/technology/software/products/database/index.html
ODAC 다운로드 : http://www.oracle.com/technology/software/tech/windows/odpnet/index.html
Patch Set 다운로드 : https://metalink.oracle.com/CSP/ui/index.html

xp의 경우에는 설치할 때의 그닥 문제가 없다. ODAC만 설치해줘도 TransactionScope를 사용해서 트랜잭션 처리가 가능하다. 하지만 Vista의 경우에는 ODAC 다운로드 링크에서 설치 문서대로 설치를 해줘야 한다.(설치 순서도 지켜 설치하고 ODAC와 Patch Set은 Database가 설치된 Oracle Home디렉토리로 경로를 맞춰서 설치해준다.)

1. Install Oracle Database Client (10.2.0.3.0) for Microsoft Windows Vista and Windows Server 2008.
2. Download ODAC1020221.exe or ODTwithODAC1020221.exe and unzip its contents by running the executable.
3. Run the Oracle Universal Installer (OUI) by launching setup.exe from the "install" directory that was unzipped in Step 2.
4. On the OUI screen named "Specify Home Details" choose the same Oracle Home as in the Step 1 and proceed.
5. Install Oracle Database 10g Release 2 (10.2.0.4.0) Patch Set. This patch can be downloaded from Oracle Metalink.

여기서 ODAC1020221를 설치하려고 하면 javaw.exe 에러가 발생하여 설치 프로그램이 자동으로 종료가 되어버린다. 여러곳에 검색을 해서 해결방법을 찾으려 했지만 모두 실패했다. 네이버에서 MS Office 2007때문에 설치안된다는 것을 처음에 보았는데 말이 안된다는 생각에 해보지 않았다. 다른 Vista가 설치된 PC에 설치해보려고 해도 역시나 같은 에러가 발생하였다. 마지막으로 Office를 지우고 설치를 해보았다. 설치가 되었다 -_-;;
그래서 이제는 되는구나 싶어서 프로그램을 실행시켰더니 Branch 길이가 다르다는 메세지가 떳다. 다른 사람의 말에 귀도 잘기울려야 하고 설치 가이드도 무시하지 말고 꼼꼼하게 잘봐야한다는 생각을 했다 ㅡ.ㅡ;;;
Oracle Metalink는 오라클 온라인 고객지원 사이트라고 생각하면 된다. 이것은 Oracle과 유지보수 계약을 맺으면 CSI라는 넘버를 부여하고 그 아이디를 이용해서 사용자 등록을 한 이후에 관리자가 승인(회사라면 회사내의 특정한 분이 관리자로 임명되어있다.)처리를 해주면 등록한 이메일 주소로 패스워드를 받아서 로그인을 할 수 있다. 여기서 Patch Set를 받아 드디어 설치를 했고 Vista에서도 TransactionScope를 이용해서 트랜잭션을 처리할 수 있었다. 하지만 이 설치과정이 배포할 경우 모든 클라이언트에 해야한다는 면에서 너무나 부담스럽게 느껴졌다.(패치의 용량이 거의 1G다. ㅡ.ㅡ;) 특히나 원래 DB를 MSSQL를 사용하고 있다가 Oracle에 연결하여 어떤 정보를 가져와야 한다거나 하면 모든 PC에 ODAC와 패치를 설치해줘야 한다니 누가 한단 말인가? +_+;
닷넷을 사용하면 웬만하면 MSSQL를 사용하는 것이 좋다는 생각이 들고 당연히 오라클과 같은 다른 DB에 접속을 하여 처리해야 하는 경우에는 웹서비스를 이용해서 서버에만 ODAC와 패치를 설치해주는 것이 어떨까 하는 생각을 해봤다.
Posted by resisa
,

INotifyPropertyChanged 인터페이스는 WPF를 하면서 처음 알게되었는데 MSDN에서 이 인터페이스에 대해서 검색을 해보면 .NET 프레임워크 2.0에서 새로 추가된 인터페이스인 것을 알 수 있다. 이 인터페이스는 그 이름대로 프로퍼티가 변경되었음을 알려주는 역할을 한다. 예제를 보기에 앞서 데이터 바인딩에 대한 간단히 알아보면 데이터 소스와 데이터가 바인딩 되는 대상이 있다. 예를 들어서 DB에 직원 정보로 가져온 데이터를 List<Employee>에 넣어 DataGridView 컨트롤에 바인딩 한다고 생각을 해보자. 여기서의 데이터 소스는 List<Employee>이고 데이터 대상은 DataGridView 컨트롤이다.

다음은 INotifyPropertyChanged 인터페이스를 상속받아서 PropertyChanged를 구현한 예이다.
public class DemoCustomer : INotifyPropertyChanged

{

    public DemoCustomer() { }

 

    private string customerName = String.Empty;

 

    public string CustomerName

    {

        get { return customerName; }

        set

        {

            customerName = value;

            OnPropertyChanged("CustomerName");

        }

    }

 

    public event PropertyChangedEventHandler PropertyChanged;

 

    protected virtual void OnPropertyChanged(String info)

    {

        if (PropertyChanged != null)

            PropertyChanged(this, new PropertyChangedEventArgs(info));

    }

}

=> 구현하는 방법은 좀 더 다양한 방법이 있지만 이 방법이 가장 심플해보이는 방법이다. 여기서 급 이번 포스트를 마무리해야 할 일이 생긴다. MSDN에 있는 예제를 실행해서 WPF가 아닌 닷넷2.0기반에서 소스를 변경하여 데이터 대상를 변경하려고 하면 PropertyChanged가 계속 null로 찍혀서 값은 변경이 되었지만 화면에는 변경이 되지 않는다.(바로 이 인터페이스의 가장 큰 역할은 소스를 변경해주면 대상에서도 자동으로 변경을 주는 것이다.) 이유를 찾기 위해서 여러가지 방법을 동원해서 알아보았지만 2.0에서는 이 인터페이스를 사용하지 말아야겠다는 결론만을 얻었다.

다음은 이 인터페이스를 구현해서 사용한 방법을 통해서 알게된 사실이다.
1. List<>를 DataGridView.DataSource 프로퍼티에 바인딩 하였을 경우에 포커스가 있는 로우의 경우에는 PropertyChaged가 null이 아니였다. 하지만 해당 로우에 포커스가 없으면 PropertyChaged가 null이고 화면에서는 변경된 사항을 알수가 없다.
2. 소스를 통해서 대상을 변경을 할 수 없다면 이 인터페이스를 사용하는 의미는 그렇게 없다고 생각이 되며 소스가 변경이 될때마다 데이터 대상에 null를 넣어주고 다시 변경된 데이터 소스를 바인딩해주는 방법을 사용하는 편이 낫다는 생각이 들었다.(List<>의 바인딩 속도는 건수가 많더라도 엄청나게 빠르다)

이번 포스트는 여러가지 테스트와 열심히 검색해봤지만 그닥 성과가 없어 상당히 아쉽다. 왜 2.0에서 INotifyPropertyChanged를 사용할 수 있게 해놓고 이런 제약조건(?)를 두어서 사용하기 힘들게 해놨는지 이해가 되지 않는다.

P.S : 제가 잘못 이해하여 오해(?)하고 있는 부분이 있다면 댓글을 통해서 알려주셨으면 합니다~

// 2009년 8월 6일
msdn 매거진에 아래와 같은 내용이 있습니다.

http://msdn.microsoft.com/ko-kr/magazine/cc794276.aspx
INotifyPropertyChanged 인터페이스를 사용할 경우 알아야 할 점이 있습니다. 이 인터페이스에 필요한 것은 PropertyChanged라는 이벤트뿐인데, 클래스가 이 이벤트를 발생시킨다는 보장이 없습니다. 많은 경우 클래스는 일부 public 속성에 대해 이벤트를 발생시키지만 아닌 경우도 있습니다. 소스 코드에 액세스할 수 없는 경우에는 PropertyChanged 이벤트를 발생시키는 속성과 그렇지 않은 속성을 미리 확인할 수 있는 마땅한 방법이 없습니다.
Posted by resisa
,

이번 프로젝트를 하면서 트랜잭션에 대해서 다시 한번 생각해보게 되었고 아래의 사이트들을 통해서 좋은 정보를 얻었다.

트랜잭션에 대한 정리를 잘 해놓은 MS의 장현춘 부장님의 블로그 링크이다.
http://kingcrap.com/entry/닷넷-트랜잭션-정리

System.Transactions(TransactionScope)에 대해서 정리를 해놓은 드원테크놀로지의 유경상 수석님의 블로그링크이다.
http://www.simpleisbest.net/articles/996.aspx

위을 내용을 아주 간단히 요약을 해보겠다~
먼저 트랜잭션 처리는 1. 로컬 트랜잭션(수동) 2. 분산 트랜잭션(자동)으로 나뉜다. 두 가지의 방법은 서로 장단점있는데 속도의 측면에서는 로컬 트랜잭션이 편리성 측면에서는 분산 트랜잭션이 좋다. 하지만 TransactionScope를 사용하면 Promotion이라는 기능이 있고(TransactionScope는 트랜잭션이 발생할 때 로컬 또는 분산 트랜잭션인지를 자동으로 처리해주는데 로컬 트랜잭션으로 실행하다가 다른 DB에 접속을 하는 순간에 자동으로 분산 트랜잭션으로 전환이 되는데 이러한 것을 Promotion이라고 한다.) 이러한 Promotion은 MSSQL 2005, 2008에서만 지원을 한다고 한다.
이번에 내가 한 프로젝트에서 DB가 Oracle여서 TransactinoScope를 사용하려고 했더니 oramts.dll이 필요하다며 예외가 발생했다. Ora MTS를 설치하면 TransactionScope를 사용할 수 있었다.

Ora MTS에 대해서는 아래의 링크를 보자.
http://www.simpleisbest.net/archive/2005/08/23/208.aspx

다음은 Ora MTS를 다운받는 링크이다.
http://www.oracle.com/technology/software/tech/windows/ora_mts/htdocs/utilsoft.html

테스트 환경은 윈도우 서버 2003에서 Oracle 9i 클라이언트와 Ora MTS 9.2.0.7.0 버전을 사용해서 해본 결과 TransactionScope를 사용할 수 있었다. 위의 첫번 째 링크(장현춘님)에 가보면 비스타에서도 Ora MTS 10.2.0.4.0버전을 사용해서 분산 트랜잭션으로 MSSQL과 Oracle을 묶어 프로젝트에서 사용하고 있다는 말이 제일 마지막에 나온다. 하지만 비스타에서 Ora MTS(버전:10.2.0.1, 10.2.0.2) 설치 오류가 나서 테스트를 해볼 수가 없었고 Ora MTS 10.2.0.4.0버전을 구할 수도 없었다. 아마 무엇인가 문제가 있어서 배포를 잠시 중단한게 아닌가 싶다.

<<수정일자 : 12월20일>>
Ora MTS 10.2.0.4.0버전이 아니라 Oracle Database 10g Release 2 (10.2.0.4.0) Patch Set의 버전이다. Ora MTS는 10.2.0.2.0를 설치하면 된다. 또한 Ora MTS가 오류가 나는 것의 원인은 Office 2007 때문이였다. 설치를 하다가 javaw.exe프로세스가 종료되었다는 메시지와 함께 설치가 종료되는데 Office를 지우고 설치를 하면 설치가 된다. 이것이 설치되었다고 해서 비스타에서TransactionScope를 사용해서 분산 트랜잭션을 사용할 수 있는 것이 아니다. Oracle Database 10g Release 2 (10.2.0.4.0) Patch Set까지 설치해야한다. Oracle Meta Link에서 이것을 다운을 받을 수 있는데 Meta Link는 오라클과 계약을 맺어 인증번호가 있어야 사용할 수 있다. 패치까지 받고 테스트는 안해봤지만 아마도 될 것이다. 사용자등록을 했는데 관리자가 있어 패스워드를 받아야한다. 참 하나 해보기 힘들다. 차후에 패치를 받고 테스트를 마친후에 정리를 해야할꺼 같다.
Posted by resisa
,