ADO.NET은 두 가지로 나뉘어질 수 있다. 첫 번째는 데이터베이스와의 연결을 유지한 상태에서 역할을 수행하는 .NET Data Provider이고 또 하나는 그 반대의 경우로 비연결 지향적인 DataSet이다. 이 구조를 간단하게 도식적으로 표현하면 다음 그림과 같다.


많이 본 그림인가? 오호~ 많이 본 그림이라면 벌써 ADO.NET을 보기 위해서 MSDN을 찾아봤다는 말?~ 멋쟁이~

위 그림에서 보면 알 수 있듯이 왼쪽에 있는 것은 .NET Data Provider로 실제로 데이터베이스와 연결을 유지한 채로 모든 일을 수행한다. 이 .NET Data Provider에는 Connection, Command, DataReader 그리고 DataAdapter 클래스가 있다. 이 들 각각의 클래스는 이전에 사용되었던 ADO 에서의 클래스들과 매우 유사한 기능을 가지고 있다. 그럼 .NET Data Provider에 대해서 간략하게나마 알아보도록 하겠다.

.NET Data Provider

위에서 .NET Data Provider는 데이터베이스와의 연결을 유지하면서 모든 일을 하는 것이라고 했습니다. 따라서 .NET Data Provider는 데이터베이스가 무엇이냐는 것이 중요하다고 할 수 있다. 이런 데이터베이스의 종류에 따라서 Sql 서버용과 OLE DB 데이터 용, 그리고 ODBC를 이용할 수 있는 세 개의 네임스페이스를 제공하고 있다. 이 네임스페이스들은 System.Data 네임스페이스에 속해 있고, 이 네임스페이스들을 사용하려면 System.Data 하부의 각각의 네임스페이스를 사용해야 한다. ( 예, using System.Data.SqlClient ) .NET Data Provider는 위 그림에서 볼 수 있듯이 다음의 4개의 클래스로 이루어져 있다.

  • Connection

    Connection 클래스는 데이터베이스와 클라이언트를 연결해준다는 의미에서 기존의 ADO의 Connection 클래스와 매우 유사하다. 이 클래스의 역할은 ConnectionString에 의해서 데이터베이스에 접근해서 데이터베이스와의 연결을 열고, 닫는 메서드를 제공한다. 또한 데이터베이스를 사용 중에 데이터베이스를 변경할 수도 있는 메서드를 제공하는 등 기존의 Connection보다는 안정적이고 다양한 메서드를 제공하고 있다. 자세한 내용은 차후에 다루도록 하겠다.

  • Command

    Command 클래스 역시 쿼리문을 실행한다는 점에서 ADO의 Command 클래스와 유사한다. 이 클래스의 역할은 연결되어있는 Connection 클래스 안에서 Insert, Update, Delete와 같은 레코드를 변경하는 일과 DataReader 클래스에 레코드를 반환하는 일들로 요약될 수 있다. 또한 Parameters 컬렉션과 함께 사용되어서 저장 프로시저나 매개변수를 필요로 하는 쿼리문을 실행할 수 있는 환경을 제공한다.

  • DataReader

    DataReader 클래스는 읽기 전용(read-only)과 전진 전용(forward-only)만 제공하는 ADO의 RecordSet 클래스와 유사하다. 따라서 DataReader는 레코드를 읽다가 이전 혹은 제일 처음의 레코드로 갈 수 없으며, 데이터를 변경하는 일 또한 할 수 없습니다. 하지만 읽기 전용(read-only)과 전진 전용(forward-only)을 사용함으로써 가장 빠르게 데이터에 접근할 수 있다는 것이 DataReader의 가장 큰 강점이라고 할 수 있다. 이것은 데이터를 가져올 수 있는 속도가 비교적 느린 웹 환경에 알맞게 설계된 클래스라고 할 수 있다.

  • DataAdapter

    위 그림에서 보면 .NET Data Provider의 나머지 세 개의 클래스와는 다르게 DataAdapter 클래스는 DataSet 클래스와 연결되어 있는 것을 볼 수 있다. DataSet 클래스는 비연결 지향적인 클래스이므로 데이터 원본과는 전혀 상관없이 역할을 수행한다. 따라서 이 DataSet 클래스와 데이터 원본과의 다리 역할을 해서 클라이언트가 수행한 데이터베이스의 변경작업을 이 DataAdapter 클래스가 맡아서 한다. 또한 그림에서 보면 SelectCommand, InsertCommand, UpdateCommand, DeleteCommand 가 있는데 이것들은 DataAdapter 클래스에 있는 프로퍼티이다. 이 프로퍼티들은 Command 형이고 각각의 쿼리문마다 적절한 프로퍼티를 설정해 주어야 한다.

  • DataSet

    DataSet은 앞에서 간략하게 언급했듯이 비연결 지향적인 데이터 클래스이다. 데이터베이스에서 레코드를 가져온다는 점은 기존의 ADO의 RecordSet과 비슷하지만 레코드를 가져온 후에 데이터베이스와의 연결을 끊어버린다는 점이 다르다. 사실 더 정확히 말하자면 DataAdapter 클래스가 레코드를 가져와서 DataSet에 레코드를 전달해 주고 연결을 끊어버린다는 것이다. 또 이렇게 가져온 레코드는 XML 문서 형식으로 클라이언트의 메모리에 담아두고 처리하는데, 이런 이유에서 DataSet은 데이터 원본이 무엇인지 모르며 알 이유도 없는 것이다.

    이는 다시 말하자면 .NET Data Provider는 데이터베이스와 연결된 상태에서 모든 일을 하기 때문에 데이터베이스의 종류에 따라서 네임스페이스가 다르지만 DataSet의 경우는 데이터베이스가 무엇인지 전혀 상관없으므로 유일한 DataSet 클래스 하나로만 일을 수행한다. 또, XML 문서 형식으로 처리하므로 데이터베이스가 아닌 것(웹 서비스상에서 넘어온 XML 문서)도 데이터베이스의 테이블을 처리하듯이 XML 문서를 처리할 수 있는 것이다.

    위의 그림에서 보면 DataSet 에는 DataTable이 있고 그 안에는 DataRow, DataColumn, Constraint가 있다. 또, 각각의 DataTable간의 관계를 정해주는 DataRelation이 있다. 자세히 들여다보면 데이터베이스의 구조와 비슷하다는 것을 알 수 있다. 기존의 ADO를 사용하던 개발자의 경우는 무엇인가 좀 다르다는 것을 느낄 것이다. 바로 테이블이 여러 개 존재할 수 있다.
  • '.net' 카테고리의 다른 글

    DB _ command  (0) 2007.07.17
    DB를 연결  (0) 2007.07.17
    C# 정리 내용  (5) 2007.07.10
    HttpRequest.ServerVariables Property  (2) 2007.07.04
    Silverlight 개발자 100만명  (0) 2007.06.11

    + Recent posts