라이브러리
프로그래밍언어, 각종코드, 관련동향, 논문 등의 저장소
ADO의 진화

ADO의 진화

 

ADO가 개발하는데 있어 얼마나 중요한지에 대해서는 이 글을 읽는 개발자 분들이 어느 누구보다 잘 알거라 생각한다. "VB 2005의 변화와 향상성"이란 주제로 기고하면서 ADO를 짚고 넘어가고자 하는 이유는 그 중요성으로 인하여 ADO를 조금이라도 소개하고 싶었던 충동이 강하게 작용하였기 때문이다.

이에 오늘은 너무 거창하지만 "ADO의 진화"라는 타이틀을 두어 ADO에서 ADO.NET으로의 발전에 대해 좀 더 다양하게 살펴보고자 한다. 지난 시간에 살펴 본 DataSet(DataTable)의 향상에 이어 Provider의 변화와 연결풀링 그리고, 배치업데이트에 대해 살펴보는 시간을 갖도록 하겠다.


Provider의 변화

ADO.NET 이전 버전에서는 Provider가 각각의 인터페이스 - 예를 들어 SqlClient, OracleClient - 에 기반하여 작성되었다. 이러한 특징으로 인해 각각의 Provider에 맞게 특정 속성과 메소드를 구현하는 방식을 취하였다. 물론 이것이 전혀 잘못된 방식을 아니지만 각각의 Provider에 맞게 계속적인 코딩을 해야 하는 문제를 내포하고 있었던 것 또한 사실이다. 이를 보완하기 위해 버전 2.0 에서는 새로운 공급자 모델을 제공하게 되는데 바로 System.Data.Common 에 있는 기본 클래스를 기반으로 작성될 수 있도록 한 부분이다. 하지만, 아쉽게도 비록 기본 클래스를 기반으로 작성은 가능하나 DB 서버에 특화된 SQL 구문 등은 지원하지 못한다는 단점 또한 내포하고 있다.

또한, 버전 2.0 에서는 Provider 객체를 생성하기 위하여 Provider Factory 클래스를 사용할 수 있게 되어 이전보다 나은 유연성을 제공하게 된다. ProviderFactory의 GetFactory 메소드를 사용하는 샘플코드를 확인해 보도록 하자.

사용자 삽입 이미지
<그림1> GetFactory 메소드 (출처: MSDN Library)


 

사용자 삽입 이미지
<그림2> GetFactory 메소드 사용 예 (출처: MSDN Library)


<그림 1>은 GetFactory 메소드에 대한 소개이며, <그림 2>는 샘플 소스이다. <그림 2>에 나온 것처럼 DataRow 와 String 을 이용하여 Provider Factory 를 알아내게 된다.

이처럼 버전 2.0 에서는 Provider에 대한 부분이 보다 유연성을 갖게 되었다는데 의미를 두고자 한다.



연결풀링(Conncetion Poolling)의 향상


연결풀링(Connection Pooling)이라는 개념은 ADO 때부터 꾸준히 중요한 위치를 차지하고 있다. 연결풀링이 어떤 향상을 가져왔는지에 대해 논하기 전에 연결풀링이 무엇인지 간단히 소개하고자 한다(필자가 현업에서 개발하면서 아쉽게도 연결풀링의 개념을 파악하지 못하는 개발자들을 보았기 때문에 이 기회를 통해 소개하고 싶기 때문이기도 하다.).

연결풀링이란 대체 무엇이길래 중요한 위치를 차지하는가? 일반적으로 우리는 코드 상에 데이터 베이스에 대한 연결을 생성할 때 다음과 같은 구문을 작성하게 된다.

Dim adoCon as new SqlConnection(연결문자열) : adoCon.Open()

이 때 ADO는 하나의 풀(Pool)을 생성하게 된다. 이 풀이 하는 일은 동일한 커넥션의 요청(여기서 동일하다는 의미는 단순히 동일한 DB에 대한 연결이 아닌 동일한 연결 문자열을 통한 요청을 말한다)이 들어왔을 때 새로운 커넥션을 생성하는 것이 아니라 기존에 생성되어 있던 풀을 반환하는 활용할 수 있게 하는 역할을 하게 된다. 이처럼 매번 요청 시마다 커넥션을 생성하는 것보다 작성된 풀을 활용한다는 것만으로 리소스의 활용도는 그만큼 높아지게 되는 것이다. 그리고, Connection이 Close나 혹은 Dispose가 될 때 풀에 다시 반환되게 된다. 만약 풀에 사용 가능한 자원이 없으면 새로운 연결을 생성하여 반환하게 된다. 이것이 연결풀링의 기본 개념이라 할 수 있다.

ADO.NET 에서는 연결풀링에 대한 보다 상세한 설정을 제공하게 된다. 예를 들어, 풀 크기와 연결 소멸 시간의 지정 등에 대한 설정이 가능하도록 향상되었다. 또한, ADO.NET 2.0에서는 ClearAllPools와 ClearPool 이라는 새로운 메소드를 제공하게 되는데, 이 메소드를 통해 특정 혹은 전체의 풀을 지울 수 있게 되었다.

데이터베이스 프로그래밍시 연결 풀링에 대한 이해를 통해 자신의 Product의 Quality를 높이도록 하자.



배치 업데이트의 지원


DataSet을 사용하여 둘 이상의 행을 변경(추가, 삭제, 수정)하게 되는 경우 DataAdapter는 각각의 행에 대한 처리를 하게 된다. 이때 변경하고자 하는 행의 수만큼 DataAdapter는 각 행위를 체크하여 실행하기 때문에 그만큼 라운드트립이 발생하여 성능을 저하시키게 된다. 이때 배치 업데이트를 통해 해당 네트워크의 라운드트립을 감소 시킬 수 있게 되었다. 배치 업데이트를 지정하는 구문은 다음과 같다.

DataAdapter.UpdateBatchSize = Int32

여기서 Size는 0, 1, 혹은 1이상을 지정하게 되는데 0 은 배치 업데이트의 최대를 나타내며 1은 예전과 같이 각각의 행을 처리하는 것과 동일하다. 1 이상인 경우에는 지정된 수만큼을 나타내게 된다.

좀 더 확실한 이해를 돕고자 MSDN에 나오는 배치 업데이트의 샘플 코드를 축약하여 발췌하였다.

사용자 삽입 이미지
<그림 3> 배치 업데이트 샘플 코드(출처: MSDN Library)


샘플코드를 살펴보면 BatchUpdate에 DataTable과 배치 사이즈를 ByVal로 전달하는 것을 확인할 수 있다. Sub 내에는 Using 블록으로 감싸 코드를 작성하였으며 (Using에 대해서는 "VB.NET 2005, 생산성과 성능이 향상되는 일곱가지 기능" 칼럼에 소개하였다) 블록 안에 DataAdapter를 생성 후 하단에 각각 Update, Insert, Delete Command 를 작성하였다. 그 후 DataAdapter의 UpdateBatchSize에 전달된 batchsize 를 지정하여 Update 처리를 하는 것을 알 수 있다. 이처럼 배치 업데이트를 사용하게 되면 그만큼 네트워크의 라운드트립을 감소시킬 수 있게 된다.

필자 심의준님은 MCSD .NET이며 웹젠에서 개발자로 근무 중이다.

 

저자 :[ 심의준(IT 테크라이터) 2005/11/28]

 

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/microsite/powerguide/techguide/solveit/0,39033240,39141825,00.htm

 

 

 

  Comments,     Trackbacks