삽질의 현장/- .NET

#086_닷넷(.NET)_ ADO.NET - 연결 계층

shovelman 2015. 11. 17. 19:13


안녕하세요 삽잡이입니다.


이번 시간에는 데이터 공급자의 핵심 타입에 대해서 알아보려고 합니다.



닷넷 플렛폼 데이터 공급자는

이처럼 Connection, Command, DataReader, DataAdapter라는 

핵심적인 네가지의 객체를 가지고 있습니다.

즉, ADO.NET 형식에서 가장 중요한 형식입니다.


Connection 객체는 '데이터의 연결'을 지을 때 

Client에서 가장 먼저 호출하는 객체입니다.

즉, 우리말로 연결 객체이지요.


Connection 객체는 Command 객체와 연결되어있습니다.

Command 객체는 명령 객체이지요.

데이터 수정, 데이터를 가져오는 등의 기능을 가지고 있는 객체입니다.

이 명령에는 크게 세가지가 있습니다.


1. 데이터 읽기 명령

2. 데이터 읽기가 아닌 Insert, Delete, Update 명령

3. 집계 명령(스칼라 명령)


이렇게 세가지가 있습니다.


그런데 이때 DataRead, Insert, Delete, Select라고 하는

DB를 수정하고 읽을 수 있는 명령끼리 묶이고, 집계와 나뉠 수 있습니다.


즉, 위에서의 첫번째와 두번째 명령을 묶을 수 있고,

그리고 세번째 명령을 따로 나눌 수 있다 이겁니다.


Select는 오직 Read의 명령입니다.

그리고, Insert, Delete, Update는 데이터를 수정하는데 사용될 수 있습니다.

따라서, 이 두가지 종류의 명령은 종류가 다릅니다.



아무튼... DataReader 객체는 

말 그대로, 데이터를 읽을때에만 사용합니다.

따라서, DataRead 객체는 Select 명령에서만 사용합니다.


DB에 있는 데이터를 가져올 때 집합으로 가져오게 되있습니다.

즉, 메모리로 말하게 되면 Collection으로 가져오게 되있다는 것입니다.

즉, 집합을 대상으로 쿼리문을 때리면 집합을 얻게 됩니다.


사실, DB는 DB를 대상으로 쿼리를 때리는 것이 아닙니다.

테이블을 대상으로 때리게 되는 것이지요.

왠, 관계형 DB는 테이블의 집합이니깐요.


연결은 DB와 하지만,

각 테이블을 대상으로 명령을 내린다고 생각하시면 됩니다.

결론적으로 말씀드리자면, 테이블이 하나의 집합이 되는 것입니다.


한 DB에서 Select 명령을 통해 내용물을 가져올 수 있습니다.

이때 Select에 의해서 만들어진 집합을 Result Set이라고 부릅니다.

즉, 결과 집합입니다.

이 결과 집합은 DB내 테이블을 통해 가공된 집합입니다.


Select를 통해 얻어온 결과 집합은

테이블의 내용을 그대로

혹은, 내가 원하는 형태로 집합을 가져올 수 있습니다.

즉, 조건을 걸어 결과 집합을 얻을 수 있다 이겁니다.



따라서, Insert, Delete, Update, Select를 

'데이터 조작 명령'이라고 부를 수 있습니다.

데이터를 대상으로 명령을 내리는 것이기 때문입니다.


그런데 Insert, Delete, Update만으로는 Result Set을 얻을 수 없습니다.

무조건 Select만이 Result Set을 얻어올 수 있습니다.

데이터를 읽는 명령은 오직, Select 밖에 없기 때문이지요.


Insert, Delete, Update 명령은

얻는것은 따로 없고, 성공 유무만 알 수 있습니다.

따라서 명령 자체가 나뉘게 된 것입니다.


Select 명령을 내리게 되면,

엄청나게 많은 데이터들이 만들어지지만,

Insert, Delete, Update 명령을 내릴 경우 성공 유무만을 알 수 있으니

종류를 나누서 실행할 수 밖에 없는 것입니다.


그렇다면,

Result Set을 읽는 형식은 뭘까요?

예상하셨듯이 바로 DataReader 객체입니다.


DataReader는 말 그대로 고칠 수 없습니다.

결과 집합을 고쳐서 되겠습니까?

따라서, 읽기만 가능한데 한 행씩, Foward 방향으로 진행하여 읽을 수 있습니다.


결과 집합으로 얻어진 모든 데이터를 처음부터 끝까지 모두 읽어들이는 것이

바로, DataReader 객체의 목적이지요.


따라서, DataReader 객체는 오직, 결과 집합을 얻기 위해서 존재한다고 생각하시면 됩니다.


헷갈리실 수 있으니 다시 한번 정리해보겠습니다.


Command 명령에는 크게 세가지로 나뉜다고 했습니다.

Insert, Delete, Update와 같이 데이터 조작을 위한 명령과,

Select와 같이 데이터를 읽기위한 명령,

그리고 집계 명령으로 나뉠 수 있지요.


이렇게 나눠놨어도 핵심은

Insert, Delete, Update, Select 입니다.


DB를 사용하기 위해서는

Connection 객체를 우선 사용합니다.

그리고 Connection 객체를 사용해서 Command 객체를 만들어내지요.

즉, 연결한 객체에서 명령을 사용하겠다는 것을 의미합니다.


그래서 Select 명령을 때리면 Result Set이 만들어지고,

Result Set을 얻기 위해서 DataReader 객체를 사용하게 되는 것입니다.


Command 객체의 Select 명령을 내리게되면,

자동적으로 Result Set을 읽기 위한 DataReader 객체가 만들어집니다.

해당 객체는 하나씩 한 방향으로만 읽어질 수 있지요.


주의하셔야할 점은 Collection과 DB의 집합과 혼돈하셔서는 안됩니다.

테이블에는 어떤 순서도 없습니다.

즉, 어떤 형식으로 저장된지 모른다 이겁니다.


Result Set도 마찬가지입니다.

만들어지고 나면, Select가 원하는 형태로 만들어졌을 뿐,

순서라는 개념을 가지고 있지 않다 이겁니다.

이말은 그대로 읽어올 뿐 순서를 보장못한다는 소리이지요.


정말 혼돈하셔서는 안됩니다.

Result Set은 데이터의 집합일 뿐, Collection이 아닙니다.


이번 시간은 여기까지 알아보도록 하겠습니다.


이상 삽잡이였습니다!