재우니의 블로그


MS 에서는 ADO.NET은 플랫폼 상호 운용성과 확장 가능한 데이터 액세스를 제공하는 Microsoft ActiveX Data Objects(ADO)를 혁신적으로 개선한 제품으로, XML(eXtensible Markup Language)을 사용하여 모든 플랫폼의 모든 응용 프로그램에 데이터를 효율적으로 전송할 수 있습니다라고 정의 하고 있죠.

그러니까 기존의 ADO 보다 혁신적인 제품이라는 것과 XML사용으로 어떤 운영체제에 관계없이 자~~알 전송할 수 있다는 의미인것 같습니다. 이는 ADO 기능 확장으로 끝나지 않은 어떤 새로운 혁신이라고 볼 수 있겠네요.

그럼..ADO.NET 을 해부해 보면 2가지로 나눌 수가 있답니다.
첫 번째는 데이터베이스와의 연결을 유지한 상태에서 역할을 수행하는 .NET Data Provider이고 또 하나는 그 반대의 경우로 비연결 지향적인 DataSet이 있답니다. 여기서 DataSet 객체가 xml 에 기반을 두고 있다는 것 포함하고요.
기존에는 db 와 연결을 항상 유지했기 때문에 많은 응답처리를 요하게 되었지만 ado.net 은 비연결 지향적 또한 기능을 갖추고 있어서 한번의 요청으로 여러번의 수정 후에 최종적으로 한번 db에 접속하여 수정처리하기 때문에 그리 데이터베이스에 많은 부담을 주지 않은 점이죠.



1) .NET Data Provider

위에 설명을 드렸지만 데이터베이스의 연결을 유지하면서 모든 작업을 하는 것이라고 말했죠. 여기에 데이터베이스가 무엇이냐는 점이 중요한데요. 오라클이 있고 ms-sql 도 있고 mysql, access 등이 있죠. 이 점을 지정하는 네임스페이스가 있는데요. System.Data 네임스페이스에 속하고 호출해 줘야 사용이 가능합니다. 자~~ 객체한번 살펴볼까요?

- Connection : db 연결을 하는 객체역할

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

- Command 객체 : db 관련 명령을 수행하기 위한 객체,저장프로시저의 매개변수를 위한 Parameter 객체를 포함하고 있죠.

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

- DataReader : 말그대로 데이터를 읽어오는 객체이죠. 읽기전용이며 앞에서 뒤로 읽는답니다.

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

- DataAdapter : db 명령을 실행하고 dataset 객체를 생성하는 객체이죠.

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

- DataSet 객체 : 비연결지향적 객체입니다. 너무 간단하죠? ㅋㅋ

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

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

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

* 부분발췌 : http://www.zdnet.co.kr/


posted by 심재운(shimpark@gmail.com)