안녕하세요 삽잡이입니다.
DB를 사용할 때에는
즉, DB를 읽고 쓰는 것들은 어플리케이션과 분류하여 사용할 수 있습니다.
어플리케이션이 직접 DB를 읽고 쓰기를 할 수 있는 코드를 넣을 수는 있습니다.
하지만, 별로 좋지 않은 코드가 됩니다.
DB의 유무를 떠나서 어플리케이션이 동작할 수 있어야하기 때문이죠.
따라서, DB 전용 라이브러리를 하나 만듭니다.
이를 통해 DB에 접근하게 되면...
즉, DB 라이브러리 형식의 객체를 사용하게 되면,
어플리케이션은 DB를 사용하는지 모르게 됩니다.
DB를 직접 지원할 수도 있지만,
어플리케이션에서 만약 DB가 아닌 다른 무언가로 사용하겠다고 한다면,
이때는 코드를 전면적으로 수정을 해야합니다.
그런데, DB라이브러리를 사용한다면,
똑같은 인터페이스 기능을 지원하되,
메모리상에 똑같은 객체를 제공해주면 어플리케이션이 달라지지 않겠죠.
똑같은 서비스를 그대로 수행할 수 있다 이겁니다.
어플리케이션 변경 없이 DB에서 사용했던 내용을
메모리, 네트워크 등으로 바꿀 수 있다 이겁니다.
결론적으로, 어플리케이션에서 했던 DB 작업을
라이브러리 어셈블리로 옮길 수 있다 이거죠.
이처럼 객체 하나를 가지고 놀 수 있다 이거죠.
DB를 사용하는 코드가 없더라도,
다 라이브러리에서 제공을 해주기때문에
라이브러리 형식을 통해서 기능을 사용하면 된다 이겁니다.
즉, 라이브러리의 객체를 생성해서 모든 DB 서비스를 생성하게됩니다.
라이브러리 하나를 만들게되면,
클래스를 정의하고, 클래스에서 직접 이야기를 하여
Client가 요구하는 서비스를 수행할 수 있게 되는 것입니다.
굉장히 코드의 유연성을 높일 수 있게 되지요.
관계형 DB에서 핵심은 바로 '테이블'이었습니다.
어떤 데이터를 찾고싶으면?
어떤 데이터를 넣고싶다면?
어떤 데이터를 변경하고싶다면?
모두 다 Table의 상태를 겨냥해야되지요.
테이블을 동작시키고자할 때에 해당 테이블에 맞는 클래스를 구현해주면 됩니다.
여러개의 테이블을 동작하고 싶다면 어떻게 해야할까요?
어플리케이션에서 그리고 SQL 수준에서
동시에 동작시킬 수 있는 방법을 제공해줍니다.
즉, 각 테이블을 가져와서 조합하는 방법과,
SQL 명령을 통해 결과 집합으로 만들어 반환하는 방법이 있다는 것입니다.
SQL 수준에서 동작시키는 방법은,
만약, 테이블을 가져오는게 비효율적이고 싫을 때
가상의 View...
즉, 가상의 테이블로써 임의의 테이블을 임시적으로 만드는 것입니다.
아무튼... 가상의 View를 만들어 Select 명령을 통해 결과 집합을 얻어올 수 있습니다.
DB라이브러리를 만들어 이처럼 연결 및 해제
그리고 삭제, 추가, 업데이트등 로직을 추가하여 사용하면 됩니다.
SqlConnection 객체를 생성하여 해당 연결 객체를 통해
연결 및 해제를 하는 메서드를 구현합니다.
테이블안에 있는 Column들을 표현해주기 위해서 Cloumn의 정보들이 많을 경우,
해당 테이블을 추상화한 클래스를 하나 만들어 인자로 넘겨줘도 됩니다.
이와 같이 삽입 명령을 나타내는 메서드를 구현할 수 있습니다.
마지막 코드를 보게되면, using 블럭 안에 명령과 연결 객체를 통해
'명령 객체'를 생성하여 ExecuteNonQuery() 메서드를 때리는 것을 확인할 수 있습니다.
Insert 명령은
Insert Into 테이블 명 필드 명 값
형식으로 올 수 있습니다.
필드명은 열로써, SQL 자체에서는 필드라고 부릅니다.
또한, Insert Into 에서 Into는 생략 가능하고,
대체적으로, 표준은 아니지만 어감상 Into를 넣어 사용합니다.
필드 또한 생략이 가능하지만,
명확한 매핑을 위해서 필드를 사용하는 방식이 권장되는 방식입니다.
중요한 것은,
값을 넣을 경우 작은 따옴표( ' )를 사용해줘야한다는 것입니다.
SQL에서 값을 표현하는 방식입니다.
정수, 실수, 문자열, 시간등과 같은 여러가지의 형식이 존재하는데,
SQL 명령 자체에는 이 모든 데이터들의 '값'을 표현하고자 할 때에는
작은 따옴표 ( ' )를 붙여 사용합니다.
값이 들어가고 해당 필드의 형식을 보고 그 형식에 맞게 값을 넣어주게 되지요.
표준 방식으로써 설명하고 있습니다! |
SQL은 여러 DBMS와 동작하지만, 현재 표준을 이야기하고 있습니다.
물론, MS SQL에서는 "문자열"을 사용할 수 있습니다.
정수를 표현할 때에는 작은 따옴표 없이 그냥 사용하기도 합니다.
하지만, 정수가 아니라면 작은 따옴표를 붙여 값이라는 것을 명시해줘야합니다.
아무튼...
이를 통해서 SQL은 형식이 명확하지 않고, 강력하지 않다는 사실을 알게 됬습니다.
또한,
SQL은 대,소문자를 구분하지 않습니다.
그런데 필드, 테이블, DB 명은 기본적으로 대,소문자를 구분하지요.
DBSM마다 다르기에, DBMS 스펙을 봐야하지만,
MS SQL은 구분을 해줍니다.
Delete 명령을 사용할 때에는 where 즉, 조건절이 따라와야합니다.
Update를 사용할 때에는
입력한 필드의 값을 사용자가 입력한 값으로 변경하라는 인자들을 전달하여 값을 수정시킵니다.
즉, 바꾸고자하는 row를
'선택한 값'과 '실제 바꾸고자하는 값'이 필요하다는 뜻입니다.
또한, 바꿀 대상을 알아야하기 때문에 where절이 필요합니다.
Select의 경우에는 두가지의 경우로 메서드를 만들 수 있습니다.
우선, return 타입이 'DataTable' 형식인 메서드와,
select 결과 집합을 가져와 메모리 상에 List Colleciton으로 변환하는 메서드가 있습니다.
예전에는 어플리케이션 내에서 select 명령을 통해
결과 집합을 얻고 'DataReader' 객체를 통해 접근을 했습니다.
그런데, DB와 관련된 기능을 모두 .dll 어셈블리에 넘겨버렸기 때문에,
어플리케이션은 DB에 대해서 알 수 없게됬죠.
따라서, .dll 라이브러리로 DB로부터 얻고싶은 정보를 요청해야합니다.
결과 집합을 얻고자 하는 마음에,
해당 메서드를 호출 했을 때, 어떻게 결과 집합을 얻을 것이냐로써,
'DataTable' 형식으로 받는 방법과 'List<T>' 형식으로 받을 수 있는 방법을 소개한 것입니다.
List<T> 형식은 말 그대로, 우리가 알고 있는 List 형식으로 넘겨 받는 것입니다.
그리고 Datable 형식은,
DB를 메모리 상에 테이블로 표현하는 객체로써,
내부적으로 Collection을 가지고 있는 집합을 반환받을 수 있습니다.
즉, DB의 데이터 테이블을 메모리상에 테이블로 반환받을 수 있다는 것입니다.
따라서, 어떤 형식으로 반환을 할 것이냐에 따라 코드도 조금씩 달라집니다.
이처럼, DataTable 객체를 만들어서
Load() 메서드를 통해 자동으로 채워 반환하는 방법이 있고,
List Collection 하나를 만들어,
테이블을 계속 읽고 추가하여 반환하는 것이지요.
이번 시간은 여기까지 하도록 하겠습니다.
이상 삽잡이였습니다!
<참고 : C# and the .NET4 Platform>
'삽질의 현장 > - .NET' 카테고리의 다른 글
#090_닷넷(.NET)_ ADO.NET - 자리표시자 & 저장 프로시저 (0) | 2015.11.19 |
---|---|
[삽잡이::C#] ADO.NET_Command Type (0) | 2015.11.18 |
#088_닷넷(.NET)_ ADO.NET - 또 다른 ADO.NET 데이터 공급자 (0) | 2015.11.17 |
#087_닷넷(.NET)_ ADO.NET - 비연결 계층 (0) | 2015.11.17 |
#086_닷넷(.NET)_ ADO.NET - 연결 계층 (0) | 2015.11.17 |