Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷! Ver 2.0~

.NET은 순식간(?)에 버전업 되었습니다. 이는 신기술의 탄생도 동반했습니다 .NET 2.0 , .NET 3.0, .NET 3.5 등 새로운 기능 및 확장된 기능에 대해 다룹니다

[ADO.NET 2.0]Provider 독립적인 프로그래밍 모델

작성자 : 박종명
최초 작성일 : 2008-05-26 (월요일)
최종 수정일 : 2008-05-26 (월요일)
조회 수 : 3386

* Provider 독립적인 프로그래밍 모델

 

ADO.NET 2.0 에서는 데이터베이스 종류에 구애받지 않는 프로그래밍 모델을 지원하게 되었다.

데이터베이스와 연동하기 위해서는 반드시 해당 데이터베이스 밴더에 맞는 프로바이더를 사용해야 한다.

예를 들어 MS SQL 의 경우 데이터베이스와의 연결을 위해 SqlConnection 을 사용해야 하며 오라클의 경우
OracleConnection
을 사용해야 한다.

 

다음은 각 데이터베이스 벤더와 각각의 Provider 연결을 보여주는 ADO.NET 모델이다.

 


1. Framework for Data Layer

비즈니스 어플리케이션 환경에서는 대부분 데이터베이스와의 연동작업이 필수적이다.따라서 규모가 있는 대부분의 응용개발 환경에서는 데이터베이스와 응용프로그램과의 연결,연동,관리를 위해 데이터베이스 관련 프레임웍을 별도로 디자인하며 개발 및 사용하고 있다. 일례로 마이크로 소프트 역시 DataAccessBlock , Enterprise Library 등 데이터베이스 연동을 위한 잘 설계된 라이브러리를 제공한다.

데이터베이스는 한 종류만 있는 것이 아니다. 대표적으로 MS SQL Server Oracle 이 있다. 비즈니스 환경이 반드시 한 종류의 데이터베이스만을 사용하는 것은 아니며 앞으로도 한 종류만 사용할 것이라고 보장하지도 않는다.

즉 많은 데이터베이스가 동시에 사용될 수도 있으며 현재 사용중인 DBMS 가 변경될 가능성도 무시하지 못한다.

 

이와 같이 다양한 환경에서 프레임워크 디자인은 현재의 상황만을 고려해서는 안되며 확장용이하고 유연한 구조로 디자인 해야 할 것이다. ADO.NET 2.0 에서는 이와 같은 환경에서 데이터베이스의 종류에 구애 받지 않는 프로그래밍 모델을 지원하게 되었다. 이것을 Provider 독립적인 프로그래밍 모델이라 할 수 있다.

 

 

2. ADO.NET 1.1 에서의 Provider 독립적 프로그래밍 모델 실현

이전 버전인 ADO.NET 1.1 에서의 데이터베이스 연동 관련 클래스들은 다음과 같은 구조로 이루어져 있었다.



대표적인 Connction Command 클래스를 나타내고 있지만 , DataReader,Transaction,DataAdapter,Parameter 등의 클래스 역시 위와 동일한 구조로 되어 있다. , 상위타입으로는 인터페이스가 정의되어 있으며 이 인터페이스를 구현한 클래스가 실제 각 데이터베이스와 연동을 하게될 객체의 클래스가 된다.

 

따라서 이 경우에 데이터베이스 종류에 상관없이 하기 위해서는 다음과 같이 객체의 타입을 데이터베이스에 종속적이지 않는 인터페이스로 생성해야 한다.

 

IDbConnection connection;


 

이렇게 하면 connection 에는 SqlConnection 이든 OracleConnection 이든 다 받을 수 있다. 이쯤 하면 어느정도 실현될 듯한 기미가 보이긴 한다. 그러나 다음과 같이 실제 객체를 생성해서 대입하는 부분을 보면,

 

IDbConnection connection = new SqlConnection();


 

결국 특정 데이터베이스에 종속적인 연결객체가 될 수 밖에 없다. (인터페이스로는 객체 생성을 할 수가 없기 때문에…)  이와 같은 경우 만일 데이터베이스가 변경되었다면 어쩔수 없이 코드를 변경해야 한다.

 

물론 1.1 에서도 잘 설계하면 여러 종류의 데이터베이스에 대한 코드 변경없이 일관된 연동을 하도록 만들 수 있다. 실제 많은 개발환경에서 1.1 버전으로 이러한 프레임웍을 만들었으며 나 역시 이전에 이와 유사한 데이터베이스라이브러리를 개발해본 경험이 있다.

전략 패턴등을 적절히 적용하면 원하는 프레임웍을 디자인 할 수 있다.

하지만 결국 상황이 그럴 뿐 내부적으로는 별도의 라이브러리가 별도로 개발되어질 가능성이 크다.

이런 면에서 보면 ADO.NET 2.0 은 확실히 닷넷 내부적으로 프로바이더 독립성을 보장해준다.

 

 

 

3. ADO.NET 2.0

 

3.1 Base 클래스

ADO.NET 2.0 에서의 클래스 구조는 확실히 다르다.



기존 구조에서 중간 부분에 추상 클래스 하나가 더 생겼다. , 기존에는 각 클래스들이 바로 인터페이스를 구현하는 모델이었지만 ADO.NET 2.0 에서는 중간에 실제 객체 생성이 가능한 추상클래스를 두고 이것을 상속하도록 변경되었다. 이 중간의 추상클래스는 Connection 만 있는 것이 아니라 관련 클래스(Command )도 동일하다. 이것을 가리켜 Base 클래스라 하는데 System.Data.Common 네임스페이스에 모두 정의되어 있다.

 

이렇게 Base 클래스는 Provider 에 종속적이지 않은 타입이므로 독립성을 1차적은 요건이 만족하는 셈이 된다.

 

 

3.2 Factory

ADO.NET 2.0 에서는 Factory 클래스를 제공한다. 이것이 바로 Provider 독립성을 보장하는 핵심적인 역할을 하는 객체가 된다. Factory 관련 클래스로는 다음과 같이 두 개의 클래스가 있다.

 

DbProviderFactories

이 클래스는 구성정보파일(machine.config) 으로부터 각 데이터베이스의 Provider 를 읽어 들여 프로바이더 구현에 대한 객체를 생성하는데 사용된다. , 특정 Provider 에 맞는 DbProviderFactory 객체를 생성하는 역할을 한다.

 

Ex> 만일 System.Data.SqlClient 의 값이 전달되면 DbProviderFactories 객체는 SqlClientFactory 객체를 반환할 것이다.

SqlClientFactory factory = DbProviderFactoires.GetFactory(“System.Data.SqlClient”);

 

 

DbProviderFactory  

실제 데이터베이스와의 연동을 위해 SqlConnection , SqlCommand, SqlDataAdapter 등의 객체를 생성할 수 있다.

앞서 DbProviderFactories 에 의해 적절한 Factory 가 생성되었을 테니 이제부터는 실제 데이터베이스와 연동하기 위한 객체들을 생성하면 된다. 이것이 바로 Provider 독립적 모델의 핵심이 된다.

 

다음 그림을 자세히 살펴 보자

 

위 그림 하나면 모든 것을 이해 할 수 있을 것이다. Factory 에 특정 Provider invariant (불변식) 을 전달하여 적절한 Factory 객체가 생성되도록 하며 결국 그 적절한 Factory 역시 적절한 데이터베이스 관련 객체들을 생성할 수 있게 된다. 
 

결론적으로 ADO.NET 2.0 에서 새롭게 제공하는 Factory 클래스들과 Base 클래스를 이용하면 데이터베이스 종류에 구애받지 않는 프로그래밍을 할 수 있게 되는 것이다.

 

다음 글에는 이와 관련한 예제 프로그램을 작성해 보도록 하겠습니다.

이름
비밀번호
홈페이지
SD <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요