[C#] 가계부 만들기 - 카테고리 설정 - DataSet, Linq

프로젝트/가계부(1)  2013.03.04 09:00

안녕하세요 명월입니다.
이번 포스팅에서는 DataSet에 대해서 알아보도록 하겠습니다.
먼저 소스를 설명하기 전에 왜 이 모듈을 사용하는가에 대해 간단하게 짚고 넘어가겠습니다.
이전 데이터 뷰를 할때도 MSSQL 과 비동기 연결을 해서 adapter 로 Fill 받아서 입력하였습니다.
먼저 왜 웹에서 자주 사용하는 DataReader를 사용하지 않고 Dataadapter를 사용하는 것 입니다. 제 프로그램은 제대로 된 형태의 프로그램은 아닙니다. 그 이유인 즉, 클라이언트 프로그램이 디비에 직접 붙기 때문이지요. 원래 처음 개발 설계는 EXEL로 시작하였으나 EXEL이 MSSQL 처럼 쿼리를 자유자재로 접속해서 데이터를 가져오기가 힘들더라구요. 그 결과, 개발일정 맞추기 위해 억지로 MSSQL로 작성하였습니다.


원래 실무에서 DB를 사용하는 프로그램은 클라이언트 프로그램이 디비에 직접 접속하지 않습니다. 왜냐하면 직접 접속을 하면 DB가 노출이 되어 버려서 해킹의 위험성이 높아지기 때문입니다.
그래서 보통 서버, 클라이언트 프로그램을 나누고 클라이언트 프로그램이 서버에 접속하여 전문 전송을 요청 하면 서버가 디비 검색을 해서 클라이언트에게 전송해주는 방식으로 작성을 합니다.


그렇다면 클라이언트와 서버는 DB이외에도 전송할 데이터가 많은데 DB커넥션이 많으면 어떨까요? 그렇습니다. 퍼포먼스가 떨어집니다.


퍼포먼스를 올리기 위해선 커넥션을 최소로 유지해야 하겠습니다.즉 데이터 양이 적고 빈번하게 사용하는 부분은 미리 데이터를 읽어들여서 메모리에 저장해 놓으면 DB커넥션이 그만큼 줄어 들겠지요
그러나 데이터량이 많은 것을 한번에 메모리에 저장해 놓으면 프로그램 저하가 심각해 질 수가 있습니다.


그래서 Category 처럼 데이터 량은 적으나 사용이 빈번한 것은 메모리에 읽어들이는 것을 채택해야 하겠습니다.


아차차. 말이 길어졌네요. 그럼 프로젝트 내용을 보면서 확인해 보겠습니다.



클래스는 SqlDB 클래스에 추가 시켰습니다.



먼저 클래스는 Dataset을 상속 받았습니다.



클래스를 인스턴스 클래스화로 만들었습니다. 보면 MSSQL에서 무언가를 불러들여서 인스턴스를 시키네요.



디비에서 Category를 풀 스캔해서 메모리에 올리는 Fill. 즉 메모리에 전부 저장해 놓는 작업입니다.




이 부분은 메모리에 등록 되어있는 DataSet을 입력 ,삭제, 수정하는 함수 입니다.



이 부분이 메인이 되겠네요.. 위에 함수는 단순히 입금, 출금 카테고리를 나누기 위한 Select 입니다. 아래 카테고리는 해당 데이터 를 뽑아 가는 함수 식입니다. 여기서 조금 더 응용을 해서 Dictionary 클래스를 조금더 변형을 가했습니다.





보시면 복잡해 보이지만 단순한 작업입니다. C++ 에서는 Template 라는 매크로가 있습니다.
물론 C# 에서는 Generic 클래스가 있습니다. C++ 처럼 매크로가 아니고 메모리에 올려서 사용하지만 C++의 Template 매크로와 비슷한 기능을 가지고 있습니다.


그리고 Dictionary 는 Map과 같은 static 구조의 동적배열입니다.


그리서 Template와 Map, Dataset 의 조합으로 Category를 만들어 보았습니다.


다음 포스팅에서는 이걸 사용해서 코드가 얼마나 간단해 지는 가에 대해 확인해 보겠습니다.
예제 소스는 예제 소스 카테고리에 있습니다. ^^



댓글 0개가 달렸습니다.
댓글쓰기