키스맥 - 리얼베이직 매킨토시 전문 웹 매거진 웹진

  + 파일메이커 기초편
  + 4th Dimension
  + 리얼베이직
  + OS X 10.3
  + 홈페이지 만들기
  + 포토샵 강좌
  + 디카 완전정복
  + 실무로 배우는 Quark
  + MLayout
  + iPod 강좌
  + html 강좌
  + 간단매뉴얼&팁
  + 5세대 iPod 강좌
  + iTunes 한 컷 강좌
  + iPod 한컷강좌
            


17회. Database -1-


지난 강좌에서는 네트웍에 대해서 공부를 했습니다. 네트웍은 최근 컴퓨터 기술에 있어서 가장 중요하면서도 어디에든 빠지지 않는 가장 기본적인 기능중 하나이기 때문에 이에 대해서 잘 알고 이해하는 것이 중요합니다. 따라서 네트웍을 모르고는 괜찮은 프로그램 만들기도 어려운 세상이지요..^^;; 따라서 항상 자주자주 연습을 해서 쉽게 사용할 수 있도록 공부하고 익히는 것이 중요할 것 같습니다.

이번에는 데이타베이스에 대해서 공부를 해보기로 하겠습니다. 데이타베이스는 최근 뿐 아니라 오래전 부터 데이타를 저장하고 다루는 분야에 있어서 가장 기본이 되고 가장 중요한 기술로 인식이 되어왔습니다. 오라클이니 MySQL 이니 MS-SQL, 4D, FileMakerPro 등 이러한 시스템들이 모두 데이타베이스를 위한 소프트웨어들입니다. 데이타베이스는 작은 자료부터 어마어마하게 많은 자료를 다루는 데에 있어서 사용되지 않는 분야가 거의 없다고 보시면 됩니다. 인터넷에 떠다니는 방대한 모든 자료들이 거의 대부분은 데이타베이스를 기반으로 하여 저장되어있는 정보들이라고 해도 관언이 아닙니다. 이러한 데이타베이스에 대해서 한번 알아보고 Mac OS X 에서의 데이타베이스 시스템과 리얼베이직에서의 데이타베이스 활용에 대해서 공부를 해보도록 하겠습니다.

이번 강좌는 그림이나 예제보다는 글만으로 된 설명이 많기 때문에 때로는 지겹고 어렵게 느껴질 수도 있을 것입니다. 따라서 데이타베이스를 처음 접하시는 분이나 어렵게 생각하는 분들에게는 더욱 지겹고 어렵게 느껴질 수도 있겠지만 내용 자체는 그리 어려운 내용들이 아니니 잘 보고 이해하시기 바랍니다. 그럼 시작해 볼까요?


1) 데이타베이스에 대해서..
데이타베이스는 많이들 들어보셨을 것입니다. 그럼 데이타베이스는 어떤 것을 말하는 것일까요? 잠시 사전적인 의미를 참조해보도록 하죠.

" 데이터베이스는 그 내용을 쉽게 접근하여 처리하고 갱신할 수 있도록 구성된 데이터의 집합체이다. 가장 널리 보급된 데이터베이스는 데이터를 다양한 방법으로 접근하고 재구성할 수 있도록 정의한 테이블형의 데이터베이스인 관계형 데이터베이스이다. 분산 데이타베이스는 네트웍 상의 여러 다른 지점에 분산되어 있거나 중복되어 있는 데이터베이스를 말하며, 객체지향 데이터베이스는 객체 클래스와 서브 클래스로 정의된 데이터가 서로 일치하는 데이터베이스이다. 데이터베이스에는 판매정보, 상품정보, 재고정보, 고객정보 등의 데이터가 수록될 수 있다. 사용자는 데이터베이스 관리도구를 이용하여 데이터의 읽고/쓰기를 제한하거나, 보고서 작성 또는 데이터의 활용도를 분석할 수 있다. 데이터베이스와 그 관리도구는 대형 메인프레임에 주로 적용되었지만, 요즘에는 AS/400과 같은 소형 분산 워크스테이션과 중형급의 시스템 뿐만 아니라 PC에도 사용된다. SQL은 IBM의 DB2, 마이크로소프트의 Access 그리고 Oracle, Sybase, Informix 등의 데이터베이스를 대화 형식으로 직접 조회하거나 갱신할 수 있도록 만들어진 표준 언어이다. "

좀 딱딱하고 이해하기 힘든 말이지만 다시 한번 풀어서 알아보도록 하죠. 쉽게 얘기를 해서 데이타베이스는 데이타를 저장하는 방식 중의 하나입니다. 컴퓨터에서 데이타를 저장하는 방식중에는 여러가지가 있습니다. 메모리에 저장하는 방식이나 대표적으로 파일을 이용하여 저장하는 방식이 있죠. 메모리에 저장을 하는 방식은 빠르고 좋으나 문제는 컴퓨터가 꺼지게 되면 그 내용은 사라지게 된다는 점입니다. 그래서 메모리에 저장하는 데이타들은 일시적인 데이타들이 많습니다. 파일로 저장을 하는 방식은 컴퓨가 꺼져있어도 가능하지만 문제는 엄청나게 많은 데이타가 존재하게 되는 경우에는 그 내용을 하나하나 검색해서 찾아보기가 어렵다는 단점이 있습니다. 파일에 대한 검색방법으로는 파일명으로의 검색외에는 특별한 부분이 없습니다. 물론 파일의 타입이나 확장자와 같은 파일의 특성을 이용할 수도 있겠지만 자세한 검색은 불가능합니다. 예를 들어서 내용을 이미 알고 있고 그 내용을 담고 있는 파일의 파일이름이 대략적으로 어떤것이다라는것을 알고 있다면 관련 파일이름으로 쉽게 찾을 수 있을 것입니다. 하지만 이러한 경우는 직접 파일을 작성하였거나 한번 열어본 사람만 알 수 있는 방법이지요. 또한 아무리 똑독해도 수천가지의 이상의 파일이 존재하게 될 경우는 그것을 쉽게 검색하기는 어려운 법입니다.

데이타베이스의 첫번째 중요한 점은 이러한 데이타의 어려운 검색 방법을 굉장히 쉽게 해준다는 것입니다. 쉬운 검색을 위해서 데이타베이스에서 사용하는 방법은 여러가지 검색 조건을 이용하는 방법을 사용합니다. 이 검색 조건은 단순하게 파일을 검색할 때 사용하는 내용이 아니라 데이타의 입력일시나 입력한 사람 및 여러가지 사용자가 설정한 검색 조건을 이용하여 검색을 할 뿐만 아니라 데이타의 내용을 통해서도 검색이 가능합니다. 예를 들어서 서울의 강남에 사는 사람들의 데이타가 데이타베이스 시스템을 통해서 저장이 되어있다면 이름, 동, 나이, 성별의 조건을 통해서 검색을 할 수 있게 됩니다. 그럼 쉽게 해당하는 사람의 정보를 알수도 있겠죠. 또다른 간단한 예로는 우리가 인터넷을 통해서 사용하는 인터넷 검색 사이트 입니다. 한두 글씨만 입력을 하고 검색을 하게 되면 관련된 내용이 굉장히 많이 나타나게 되죠. 파일로 되어있는 시스템에서는 위와 같은 조건은 사용하기가 어렵습니다.

그리고 위의 여러가지 검색 조건을 이용하더라도 데이타베이스는 빠른 검색 성능을 보여줍니다. 검색 속도가 느리다고 하면 아무리 기능이 좋아도 제대로 활용할 수 없겠죠. 최근 빠른 CPU 와 하드디스크, 메모리등의 등장과 빠른 인터넷 라인의 등장으로 여러가지 조건의 데이타 검색은 예전에 비해서 훨씬 빠른 성능을 제공해 주고 있습니다. 빠른 검색 기능은 데이타베이스를 받쳐주는 기본 기능입니다.

위와 같은 내용을 기반으로 하여 데이타를 다루는 방식을 데이타베이스라고 합니다. 간단하게 다시 말하면 데이타를 쉽게 저장하고 쉽게 찾아서 활용하기 위한 기술인 것이죠. 그리고 데이타베이스 기능을 구현한 시스템을 데이타베이스 시스템이라하고 보통 약자로 DBMS 라 합니다. 더욱 간단하게는 DB라고도 하죠.^^;;

동사무소를 가던 어디를 가던간에 컴퓨터를 이용하여 데이타를 입력하고 검색하는 장면을 많이 볼 수 있을 것입니다. 동사무소, 편의점, 마트점, PC 방 등등...이제 이러한 모든 곳에서 방대한 데이타를 컴퓨터를 이용하여 다루는 것이라고 하면 데이타베이스 시스템을 이용한다라고 생각을 하면 될 것입니다.

2) 데이타베이스 시스템의 구조
이제 데이타베이스에 대해서는 어느정도 감을 잡으셨는지요. 이제는 좀 더 세분화 해서 데이타베이스 시스템에 대해서 알아보도록 하죠. 위의 내용으로는 데이타만 저장하면 그냥 검색이 쉽고 빠르게 된다라고 생각을 할 수 있습니다. 하지만 실상은 그러하지 않습니다. 데이타베이스 시스템을 이용하여 쉽게 검색을 하기위해서는 제대로된 검색을 위한 설계가 필요합니다. 예를 들어서 굉장히 많은 주소록이 있는데 이를 데이타베이스 시스템을 이용하여 구현한다고 생각을 해보도록 하죠. 먼저 필요한 내용으로는 이름, 전화번호, 주소, 나이, 성별, 주민등록 번호, 사진, 회사주소, 회사연락처 등등 여러가지가 있을 수 있습니다. 이러한 하나하나의 항목들을 데이타베이스에서는 필드라는 이름으로 구분을 해줍니다. 데이타베이스에는 필드라는 말을 많이 사용하는데요 이 필드가 위와 같은 데이타 항목들을 말합니다. 데이타베이스에서는 이러한 세세한 항목들을 하나하나 구분을 해줘야 좀 더 빠르고 쉽게 데이타를 검색할 수 있습니다. 그래야 좀 더 세분화된 검색 조건을 만들 수 있기 때문이지요.

데이타베이스의 기본 구조는 위와 같은 항목을 나타내는 필드와 여러개의 필드로 구성된 테이블, 그리고 테이블로 구성된 데이타베이스로 구분이 될 수 있습니다. 간단하게 세분화된 데이타베이스의 구조를 설명하자면 다음과 같습니다.

- 필드 : 데이타가 입력되는 항목을 나타냄
- 테이블 : 여러개의 필드의 묶음을 나타냄
- 데이타베이스 : 여러개의 테이블이 모여서 하나의 데이타베이스를 이룸
- 레코드 : 기록되는 데이타

데이타베이스는 간단하게 위의 4가지로 구분을 할 수 있습니다. 데이타베이스를 설계한다는 것은 바로 필드와 테이블을 설계한다는 것이지요. 설명이 부족하게 느껴질 수 있겠지만 좀 더 구체적인 이해는 뒤에가서 데이타베이스의 상세 내용과 예제를 통해서 알아보도록 하겠습니다.


리얼베이직의 가장 중요한 장점이자 가장 강력한 기능중 하나가 바로 데이타베이스 입니다. 리얼베이직에 데이타베이스 기능이 들어가게 된 것은 버젼 3.x 대 부터입니다. 처음에는 데이타베이스 기능이 없었습니다. 하지만 데이타베이스가 없는 리얼베이직은 앙꼬 없는 찐빵과 같은 존재였죠. 3.x 버젼 이하에서는 기능도 미약했었기 때문에 정말로 재미를 위한 프로그래밍이나 단순 데모 프로그램을 만드는 것 외에는 크게 활용도가 없었습니다. 하지만 3.x 버젼에 이르러서 데이타베이스를 지원하기 시작했습니다. 처음 버젼의 리얼베이직 데이타베이스는 속도도 느리고 기능도 미약했지만 새로운 가능성을 보여주는 시도였죠. 리얼베이직의 자체 데이타베이스 시스템은 굉장히 미약한 기능 때문에 단순 데이타 저장이나 주소록 정도의 단순한 데이타베이스를 구성하는데에만 사용이 되었지만 리얼베이직의 데이타베이스의 숨은 잠재력을 보여준 것은 Plugin 을 이용한 Oracle, 4D, OpenBase, MS-SQL, FrontBase, MySQL, PostgbresSQL 등의 여러가지 범용 데이타베이스 시스템 지원이었습니다. 자체적인 데이타베이스 시스템은 미약했지만 타 데이타베이스 시스템의 지원은 훌륭했습니다. 왜냐하면 해당 데이타베이스 시스템의 모든 기능을 사용할 수 있었기 때문이지요. 그중에서도 Oracle 과 MySQL 의 지원이 가장 좋았습니다. 하지만 Oracle 은 버젼 7.3 까지만을 지원했고(그래도 훌륭했습니다.) 가상메모리와 사용하게 되면 죽어버리는 버그가 있었죠. 또한 MySQL 은 리얼베이직사에서 직접 기능 제공을 못하고 별도의 ThirdParty 업체에서 기능을 제공하였습니다. 하지만 버젼 4.대에 이르러서는 대부분의 모든 데이타베이스 시스템을 지원하였고 5.5 버젼대에 이르러스는 Oracle 9까지도 지원을 하게 되었습니다.

솔직히 매킨토시에서의 데이타베이스의 지원이나 사용은 그동안 굉장히 열학했습니다. 오라클이나 MySQL 도 사용할 수 었었고 Filemaker 나 4D와 같은 데이타베이스 시스템이 있었지만 이러한 것들도 자체 데이타베이스 시스템을 이용하였기 때문에 활용성 면이 굉장히 적었거나 폐쇄적이었습니다.
하지만 MacOS X 가 나오면서 기본적으로 MySQL 이나 PostgresSQL 과 같은 무료 범용 데이타베이스 시스템을 활용할 수 있게 되었고 오라클과 같은 대용량 데이타베이스 시스템도 Mac OS X 를 지원하게 되었지요. 거기다가 리얼베이직은 범용 데이타베이스 시스템을 활용하는데 있어서 굉장히 편리한 개발 환경과 강력한 기능을 제공해 주어 매킨토시의 데이타베이스 툴로 아주 유명하게 되었습니다. 데이타베이스의 지원으로 Windows 환경에서 VisualBasic 과 같은 위치가 되었다고 할 수 있죠. 리얼베이직의 데이타베이스 지원과 Mac OS X 의 등장으로 매킨토시에서도 이제 제대로된 데이타베이스 환경을 구축하는 사례가 외국에서는 심심치 않게 보여지고 있습니다.

여튼 리얼베이직은 Mac OS X 환경에서 데이타베이스 시스템을 다루기 위한 가장 좋은 툴 중에 하나라는 사실을 잊지 마시기 바랍니다.


앞서 언급한 것 처럼 리얼베이직에서는 여러가지 데이타베이스 시스템을 지원해 줍니다. 이에 대해서 어떤 데이타베이스 시스템이 있는지를 알아보고 기능이나 특성, 활용 방법에 대해서 얘기해보도록 하겠습니다.

1) RealDatabase
리얼베이직에서 기본적으로 제공을 해주는 자체 데이타베이스 시스템입니다. 리얼베이직 데이타베이스 시스템을 솔직히 리얼베이직에서 사용가능한 데이타베이스 시스템 중에서 가장 열악한 환경이나 기능을 제공해 준다고 해도 과언이 아닐정도로 미약한 성능을 보여줍니다. 하지만 손쉽게 사용할 수 있다는 점과 리얼베이직을 사용하는 유저라면 누구든지 사용할 수 있다는 점, 자체 파일 시스템으로 데이타베이스를 구현하고 간단한 어플리케이션의 데이타 저장용으로 사용할 수 있다는 점은 큰 장점이라 할 수 있습니다. 따라서 주소록이나 스케쥴 관리 프로그램, 또는 기타 여러가지 데이타를 저장하는 독립적인 프로그램을 개발할 경우에는 리얼베이직의 RealDatabase 시스템을 이용하는 것이 편리합니다.

하지만 앞서 말한 것 처럼 단점도 많겠죠. 가장 큰 문제점 중 하나는 안정성입니다. 프로그램이 갑자기 다운되는 경우(대부분 프로그램을 잘못 만들어서 죽는 경우도 있겠지만 Mac OS 9 이나 Mac OS X 10.2.8 이하에서는 갑자기 죽는 경우가 많았습니다.)나 프로그램의 오류로 인해서 다운되는 경우에 데이타베이스 파일 시스템이 깨져버리는 경우가 종종 생깁니다. 그래서 자체적인 백업 기능을 만들어서 해야하기 때문에 굉장히 신경을 써서 구축을 해야합니다. 이러한 문제는 5.5x 버젼이나 Mac Os X 10.3 대에 이르러서는 많이 고쳐졌고 믿을만해졌지만 이전 버젼부터 계속 사용해오고 안정성 문제에 대한 치명적인 오류를 경험했던 유저에게는 아직까지 불안함 마음을 안겨주기도 합니다. 또 한가지는 굉장히 제한적인 SQL 문법을 지원한다는 점입니다. SQL 에 대해서는 뒤에가서 자세히 공부를 해보도록 할 것이지만 여기에서 간단히 언급을 해보도록 하죠. 앞서 데이타베이스 시스템에 대한 설명을 할 때 데이타베이스의 장점 중 하나가 쉬운 검색이라고 하였습니다. 여러가지 조건을 이용해서 데이타를 쉽게 그리고 강력하게 검색할 수 있게 해주는 이유중 하나가 바로 SQL 의 지원이기 때문입니다. SQL 은 데이타베이스 시스템에서 검색을 해주기 위한 스크립트 언어같은 것이라 생각하면 되겠습니다. Structured Query Language 의 약자이죠. SQL 문은 데이타베이스 시스템에 따라서 조금씩 차이가 나는 함수를 제공하여 여러가지 기능을 제공해 줍니다. 하지만 SQL 문의 기능이 미약하면 몇가지 데이타를 구하기 위해서 좀 수고를 많이 해야합니다. 리얼베이직의 데이타베이스 시스템도 이 SQL 문을 지원하지만 일반적인 데이타베이스 시스템의 반도 안되는 아주 약소한 기능만을 제공해 줍니다.
하짐나 5.5x 에서는 데이타베이스 시스템 자체가 전혀 다르게 변경이 되어서 SQL 문에서 더욱 많은 기능을 제공해 주는데 그 만큼 속도는 좀 느려진 것 같습니다. 여튼 이러한 리얼베이직 데이타베이스 시스템과 버젼간의 차이는 뒤에가서 좀 더 자세히 공부해보도록 하겠습니다.

2) MySQL
MySQL 은 리눅스나 유닉스를 사용해본 유저분들은 설명를 하지 않아도 많이 알고 있을 정도로 강력하고 쉽고 빠르고 좋은 무료 데이타베이스 시스템입니다. 무료라는 점이 이 데이타베이스 시스템을 많이 사용하게 해주는 이유중 하나죠. 소스도 오픈되어있어서 전세계의 많은 개발자들에 의해서 꾸준히 업데이트 되고 있습니다. MySQL 은 무료라 하더라도 빠른 검색기능과 안정성 면에서 검증을 받아 많은 곳에서 사용이 되고 있습니다. 예를 들어서 다음(www.daum.net) 과 같은 유명 포털 사이트에서도 여러가지 용도로 MySQL 을 사용하고 있지요. 무료라고 해서 그냥 무시할 데이타베이스 시스템이 아니라 무료이면서도 강력한 기능과 안정성을 갖고 있다는 점을 생각해봐야합니다. 리얼베이직과도 잘 어울리며 쉽게 데이타베이스 프로그램을 만들 수 있습니다. MySQL 은 무료이면서도 Mac OS, Linux, Windows 의 대부분 플랫폼에서 돌아가는 버젼이 모두 준비되어있어 어떤 시스템에서 사용을 하더라도 쉽게 설치하고 사용할 수 있습니다. 따라서 많은 업체들이 MySQL 의 기능과 안정성을 염두하고 자신들의 업무나 시스템에 적용시키고 있습니다. 또한 아파치, PHP, MySQL 조합으로 홈페이지에 사용이 많이 되고 있지요. iTalk 이라는 메신저를 기억하고 계실런지 모르겠지만 국내에서 개발된 매킨토시용 메신저인 iTalk(그리핀에서 나온 iPod 용 마이크가 아닙니다.) 도 MySQL 데이타베이스를 이용하고 있습니다.

MySQL은 Mac OS X 에서 소스컴파일을 하여 사용할수도 있지만 별도의 설치 패키지 파일로 제공이 되고 있습니다. 따라서 이를 이용하면 손쉽게 설치하여 사용할 수 있습니다. 참고로 Mac OS X 용 MySQL 을 다운로드 받는 사이트를 알려드릴테니 직접 한번 설치해보시고 사용해보시기 바랍니다.(http://www.entropy.ch/software/macosx/mysql)

무료로 강력한 상용 데이타베이스 시스템의 성능을 만끽하고 싶으신분들은 MySQL에 대해서 공부를 해보는 것이 좋을 것 같습니다. 리얼베이직은 이러한 MySQL 데이타베이스 시스템의 성능을 모두 사용할 수 있습니다. 속도도 아주 빠르구요. 이 내용에 대해서는 뒤에가서 MySQL 설치와 함께 공부해 보도록 하겠습니다.

3) 4D
4D 는 4Th Dimension 의 약자로 매킨토시 초창기부터 데이타베이스 시스템을 제공해오던 대표적인 매킨토시 데이타베이스 시스템입니다. 예전 Classic(9.22 이하의 Mac OS) 시절에는 4D를 이용한 회계관련 프로그램이나 여러가지 데이타베이스 기반의 프로그램들이 상용으로 만들어져서 국내 유저들도 4D에 대해서 알게모르게 경험하신분들이 많을 것입니다. 4D는 그 당시 좀 특히하게 어플리케이션 형태로 데이타베이스 서버롤 돌려서 사용하기도 하였고 자체 데이타베이스 시스템을 이용하여 여러가지 다양한 데이타베이스 기반의 프로그램들이 만들어졌습니다. 대표적으로 CityMan 과 같은 프로그램도 여기에 해당이 되죠. 4D의 장점은 한가지 코드로 완벽하게 맥용과 피시용 프로그램을 개발할 수 있었다는 점입니다. 그리고 자체적으로 체택한 쉬운언어를 이용해서 좀 더 편리한 개발환경을 구축했죠. 하지만 의외로 높은 가격과 개발 언어가 쉬웠지만 대부분 알려져있는 베이직이나 C 언어와 같은 문법과 약간 상이한 개발환경으로 인해서 국내에서는 많은 지지도를 얻지는 못했습니다. 아무래도 맥 기반으로 처음 출시가 됐다는 점에서도 윈도우즈 일색인 국내에서는 환영받기 힘든 환경이었을 수도 있습니다. 하지만 아직까지도 4D는 외국뿐 아니라 국내에서도 어느정도는 점유율을 갖고 있으며 빠른 성능과 편리한 통합 개발 환경으로 인해서 꾸준히 사용되고는 있습니다. 하지만 유닉스 베이스의 데이타베이스 시스템이 주류를 이루는 것이 최근 대세이기 때문에(속도도 빠르고 안정적인 MySQL 과 같은 데이타베이스 시스템이 있기 때문이지요.) 점차 사용은 줄어들수도 있다라고 생각이 듭니다.

여튼 리얼베이직은 4D와도 잘 어울립니다. 4D의 데이타베이스 서버는 6.8까지 지원이 되며 매킨토시용으로 처음 선보여졌던것 처럼 TCP/IP 와 AppleTalk 을 지원합니다. 이전 버젼에서는 리얼베이직에서 사용할 때 한글로 된 내용이 들어가 있을 경우 데이타의 소팅등에서 문제를 보였었습니다. 최신 버젼에서는 테스트할 수 있는 환경이 있지를 않아서 정확한 내용을 확인해보지 못했습니다.

4) ODBC
ODBC 는 MS 를 위한 데이타베이스 시스템 접속을 위한 방식이라고 하면 될 것 같습니다. 이를 통해 맥에서도 MS-SQL 에 접속이 가능하죠. ODBC 를 이용하기 위해서는 별도의 ODBC 드라이버가 필요합니다. 이 드라이버는 예전에는 별도로 제공되지는 않고 OFFICE 를 설치하면 그 안에 ODBC 드라이버가 있었는데 이를 이용하면 됩니다. Mac OS X 에는 ODBC 를 기본으로 지원하나 별도의 데이타베이스 시스템의 드라이버가 없으면 사용을 할 수 없습니다. ODBC 역시 리얼베이직과 사용시에 한글로 된 내용을 불러올 때 문제가 있었습니다. 이 또한 최신 버젼에서는 테스트를 못해봤습니다..^^;;

5) OpenBase
OpenBase 는 Mac OS X의 기본이 되는 Next Step 시절부터 지원을 해오던 데이타베이스 시스템입니다. 당연히 Mac OS X 대에서도 10.0부터 꾸준히 지원을 해오고 있는 데이타베이스 시스템입니다. 뿐만 아니라 NT용도 별도로 있죠. OpenBase 는 자체적인 개발툴도 지원을 하고 적극적인 Mac OS X 지원을 밝혀왔지만 국내에서는 그다지 많이 사용되고 있지는 않은 데이타베이스 시스템입니다. 초창기의 Mac OS X 버젼의 OpenBase 는 한글 사용시 속도도 느리고 문제도 있었다는 보고가 있지만 최근에는 어떻게 돌아가는지 정확한 소식은 없습니다. 대신 아류작으로 OpenBase 의 단점을 보완해서 나온 FrontBase 라는 데이타베이스 시스템도 있습니다.

6) SQLLite
SQLLite 는 데이타베이스 시스템은 아니고 리얼베이직 자체 데이타베이스 시스템인 RealDatabase 를 대체할 수 있는 아주 좋은 데이타베이스 시스템입니다. 별도 업체에서 제작하여 Plugin 형태로 판매가 되고 있습니다. SQLLite 데이타베이스 시스템은 RealDatabase 의 단점을 보완하여 더욱 좋은 안정성과 빠른 검색 속도, 그리고 편리하고 다양한 기능을 갖고 있는 SQL 언어를 제공해 줍니다. 최근에는 Pro 버젼과 데이타베이스 서버 시스템도 개발하여 판매가 되고 있는데 리얼베이직 유저에게 많은 호응을 불러일으키는 괜찮은 플러그인으로 알려져 있습니다. 이에 대한 자세한 정보는 http://sqlabs.net 에서 확인 가능합니다.

7) Valentina
Valentina 역시 SQLLite 와 같은 별도의 플러그인 형식으로 되어있는 RealDatabase 시스템을 대체해주는 데이타베이스 시스템입니다. 자체적으로는 전 세계에서 가장 빠른 검색 속도를 제공해 준다고 합니다. 최근에는 SQLLite 에 비해서 사용자수는 적은 것 같지만 정말로 빠른 성능을 보여줍니다. 하지만 처음 데이타베이스를 초기화 하는 방법이 좀 까다롭고 생성되는 데이타베이스 파일자체가 워낙 거대해서 효율성 면에서는 조금 떨어질 수도 있습니다. 하지만 리얼베이직 뿐 아니라 애플스크립트등 다양한 시스템을 지원하여 아직까지도 꾸준히 사용되고 있는 데이타베이스 시스템입니다.

8) Oracle
데이타베이스의 황재격인 Oracle 은 대용량을 다루는 데이타베이스 시스템으로 아주 유명합니다. 국내의 큰 기업들이 대용량의 데이타를 다룰 때 사용하는 데이타베이스 시스템으로 아주 대표적이죠. 뛰어난 안정성과 강력한 기능들은 여타 데이타베이스 시스템에서는 없는 그러한 성능을 보여줍니다. 거의 국내 대표 데이타베이스 시스템이라 하더라도 손색이 없을 정도로 뛰어난 기능뿐 아니라 국내 업체들이 가장 많이 사용하고 선호하는 데이타베이스 시스템입니다. 물론 국외나 다른곳에서는 그렇지 않지만 국내에서 특히 많은 점유율을 갖고 있는 것으로 알려져 있습니다. 특히 PLSQL 이라는 내부적으로 프로세스를 만들어서 처리할 수 있는 기능은 대용량의 데이타를 빠르게 처리할 수 있는 환경을 제공해 줍니다.

리얼베이직은 Oracle 과 잘 호환이 되며 5.2.4버젼가지는 Oracle 7.3가지만 지원을 하고 최근 5.5x 버젼대에 포함되어있는 Oracle 데이타베이스 시스템은 Oracle9까지 지원하는 것으로 알려져있습니다. 리얼베이직의 PLSQL로 만들어진 프로세스를 불러와서 실행할 수도 있기 때문에 오라클에 관련된 클라이언트 프로그램 개발시 아주 유용하게 사용할 수 있습니다.

9) 기타
그 외에 PostgresSQL 이나 텍스트 파일로 구성된 데이타베이스 데이타 내용을 다룰 수 있는 CSV DB, DBF DB, Sybase DB 등이 있습니다. 이렇게 많은 데이타베이스 시스템을 제공해주는 것은 그만큼 리얼베이직이 어떤 데이타베이스 시스템이라 하더라도 손쉽고 편리하게 매킨토시용 클라이언트 프로그램을 만들 수 있다는 점을 보여주고 있습니다.


그럼 이제 리얼베이직의 Database 에 대해서 공부를 해보도록 하겠습니다. 리얼베이직 데이타베이스의 기본을 이루는 것은 바로 Database Class 입니다. 이 클래스를 기반으로 RealDatabase, MySQLDatabase, PostgreSQLDatabase 등의 하위 클래스들이 생성이 된 것이지요. 따라서 Database 클래스의 내용을 기본적으로 공부하고 이해하면 나머지 Database 클래스에 대해서도 70~80%는 다 알게 됩니다. 그럼 리얼베이직 데이타베이스 엔진의 기본을 이루고 있는 Database 클래스의 속성과 함수들에 대해서 알아보도록 하겠습니다. 그리고 Database 클래스로부터 파생된 RealDatabase, MySQLDatabase 등에 대해서 알아보도록 하겠습니다.(*예문은 RealDatabase 와 MySQL 을 중심으로 설명하도록 하겠습니다.)

1) Database 클래스
- Database 클래스의 속성(Properties)
* DatabaseName : 작업할 데이타베이스의 작업명을 나타냅니다. RealDatabase 에서는 데이타를 저장하는 File 명이 이 작업명이 됩니다. MySQL 과 같은 별도의 데이타베이스 시스템에서는 별도의 Database 작업명이 존재하게 됩니다. MySQL 에서 로긴 후에 "Show Databases" 명령어를 입력하게 되면 현재 존재하는 Database 작업명을 볼 수 있습니다. 이러한 DatabaseName 속성은 오라클에서도 사용되고 하니 사용하는 데이타베이스 시스템의 특성에 대해서 잘 이해하고 사용하시기 바랍니다.

* Error : 뒤에 나올 Database 클래스의 함수 중 SQLSelect 나 SQLExecute 함수, 또는 InsertRecord 함수를 실행하고 나서 어떤 문제가 있을 경우 이 값이 True 가 됩니다. True 가 됐을 경우는 뒤에 나올 ErrorCode 와 ErrorMessage 속성을 통해서 어떤 에러인지 확인할 수 있습니다. 참과 거짓으로 에러의 유무를 나타내기 때문에 Error 속성의 데이타형은 Boolean 형입니다.

* ErrorCode : Database 클래스의 Error 값이 True 가 되면 ErrorCode 를 검색하여 에러번호가 몇 번인지 알 수 있습니다. 하지만 에러코드만으로는 정확한 에러의 이유를 모르는 경우가 많습니다. 따라서 반드시 ErrorMessage 속성을 통해서 에러의 내용을 확인하시기 바랍니다. ErrorCode 는 정수형의 숫자를 갖게 되기 때문에 속성은 Integer 형입니다.

* ErrorMessage : ErrorCode 에 따른 정확한 에러메세지를 보여줍니다. 따라서 에러가 발생시에 에러코드 뿐 아니라 에러메세지도 확인할 수 있는 코드를 작성해서 문제 발생시 빠르게 대처할 수 있도록 해야합니다.

그럼 위의 Error, ErrorCode, ErrorMessage 속성을 이용하여 에러가 발생했을 경우 어떻게 에러를 확인하는 코드를 나타내 주는지 간단한 예제 코드를 만들어 보도록 하겠습니다. 우선 MyDatabase 라는 Database 변수(객체)가 있다는 전제하에 코드를 작성해 보도록 하겠습니다. 에러가 발생했는지 아닌지를 확인하기 위해서는 조건을 따져주는 조건문이 필요하기 때문에 다음과 같이 작성해 봅니다.
if MyDatabase.Error then
111111msgbox MyDatabase.ErrorCode+" "+MyDatabase.ErrorMessage
111111return
end if
위와 같이 하면 에러가 발생했을 경우 에러코드와 에러코드와 에러메세지를 바로 확인할 수 있으며 Return 이라는 명령어를 통해서 작업을 중단시키기 때문에 이후의 코드가 실행되어서 오류가 나는 것을 방지해 줍니다.

* Host : 원격으로 데이타베이스 시스템에 접속할 경우 서버가 되는 시스템의 IP 주소를 나타내는 속성입니다.
RealDatabase 시스템 같은 경우는 이 속성을 사용하지 않습니다. 하지만 MySQLDatabase 시스템이나 오라클, 또는 기타 다른 범용 데이타베이스 시스템에서는 이 속성이 반드시 필요하게 되죠. 왜냐하면 MySQL 은 항상 원격으로 접속하게 되어있기 때문입니다. 자신의 컴퓨터에 MySQL과 같은 데이타베이스 시스템에 접속하기 위해서는 Host 속성에 자신의 IP 주소를 입력하게 되면 됩니다. IP주소가 있는 경우는 숫자로된 주소를 입력하면 되지만 별도의 도메인이 있을 경우는 도메인명(michelin.zdns.net 같은)을 넣으셔도 됩니다. Host 의 데이타형은 String 형입니다.

* UserName : 데이타베이스 시스템에 접속시에 필요한 아이디를 나타냅니다. 이 역시 RealDatabase 시스템에서는 사용하지 않습니다.
RealDatabase 시스템은 파일구조로 되어있기 때문에 별도의 로긴 아이디가 필요하지 않은 것이죠. 하지만 MySQL이나 오라클 등의 원격으로 이용하는 데이타베이스 시스템일 경우는 반드시 아이디와 암호를 필요로 합니다. 자신의 컴퓨터에 설치되어있다하더라도 별도의 데이타베이스 시스템의 아이디와 암호가 필요합니다. UserName 의 데이타형은 String 형입니다.

* Password : 데이타베이스 시스템에 접속시에 필요한 아이디에 대한 암호를 나타냅니다. 내용은 앞서 설명한 UserName 과 똑같습니다. UserName 이 아이디를 나타내기 때문에 아이디에 대한 암호가 당연히 필요한 법이죠. Password 의 데이타형은 String 형입니다.

Database 클래스의 속성은 위와 같습니다. 하지만 이를 기반으로 하는 하위 데이타베이스 클래스(RealDatabase, MySQL 등)는 사용하지 않는 속성도 있지만 별도의 속성을 필요로 합니다. 이에 대해서는 뒤에 하위 데이타베이스 클래스를 공부하면서 다시 알아보도록 하죠.

- Database 클래스의 함수(Methods)
* Close : 이는 연결된 데이타베이스의 작업을 종료하는 것입니다. 원격격으로 연결된 데이타베이스 시스템일 경우는 연결을 끊고 Database 변수(객체) 자체를 종료시킵니다. 파일구조의 RealDatabase 시스템인 경우는 작업 자체를 종료만 시키게 됩니다. 따라서 Global 하게 Database 변수(객체)를 만들어서 공용으로 사용할 경우는 작업이 끝난 후에는 Close 함수를 이용해서 작업을 종료시켜 주는 것이 좋습니다.

* Commit : 변경된 내용을 최종적으로 업데이트 할 때 사용됩니다.
데이타베이스 시스템에서는 데이타의 추가, 변경, 삭제 등의 작업을 하고 나서 데이타가 바로 수정이 되는 것이 아닙니다. 데이타를 추가, 변경, 삭제 등의 작업을 하고 난 후에 실질적으로 Commit 함수를 이용해서 업데이트 해줘야만 데이타의 변경이 적용이 되죠. 데이타베이스 시스템에 따라서는 Commit 가 필요하지 않는 경우도 있지만 이는 데이타베이스의 기본사항중 하나입니다.

* Connect : 원격의 데이타베이스 시스템에 접속할 때 사용됩니다.
앞서 공부한 DatabaseName, Host, UserName, Password 속성이 다 갖추어지면 이 함수를 통해서 원격의 데이타베이스 시스템에 접속을 하게 됩니다. Socket 의 연결 함수인 Connect 처럼 데이타베이스 시스템 서버에 접속하는 함수입니다.

* FieldSchema : Table 이름을 인수로 사용하는 이 함수는 해당 Table의 Filed 구조를 가져오게 됩니다.
이 값은 RecordSet이라 불리는 별도의 클래스 형을 갖게 됩니다. RecordSet 데이타베이스에서 데이타가 들어가 있는 레코드를 순서대로 가리키고 이를 이용해서 데이타를 가져올 수 있는 클래스를 말합니다. 이에 대해서는 뒤에가서 자세히 배우게 될 것입니다. 따라서 FieldSchema 함수와 RecordSet 클래스를 이용하여 Table 의 필드명을 가져올 수 있습니다.

* InsertRecord : 데이타를 입력해주는 함수입니다.
리얼베이직의 데이타베이스 시스템을 이용하여 데이타를 입력해주는 방법은 2가지가 있습니다.
한가지는 DatabaseRecord 클래스를 이용하여 입력하는 방법과 또 한가지는 SQL 문을 이용하여 데이타를 입력하는 방법입니다. InsertRecord 함수는 DatabaseRecord 클래스를 이용하여 데이타를 입력할 때 사용되는 데이타입력 함수입니다. 사용하는 인수로는 데이타베이스의 Table 명과 DatabaseRecord 변수(객체)를 인수로 사용합니다. DatabaseRecord 에 대해서는 뒤에 가서 자세히 배워보도록 하겠습니다.

* Property : 이는 데이타베이스의 속성을 나타내는 값입니다. 이는 4D에서만 사용되는 속성이라서 거의 사용되지는 않습니다. (*아쉽게도 필자를 4D를 거의 사용하지 않습니다..^^;;)

* Rollback : 데이타베이스 내의 데이타가 추가, 변경, 삭제등의 데이타 변경이 있었을 경우 Commit 를 하지 않았을 경우 이전의 데이타로 되돌려 줍니다. 즉 아무리 삭제를하고, 추가하고 변경을 해도 다시 되돌릴 수 있다는 것이죠. 하지만 최종 업데이트 명령인 Commit 를 하게되면 이 함수를 사용해도 데이타를 되돌릴수는 없습니다.

* SQLSelect : 데이타를 검색할 때는 항상 SQL 문을 사용하게 됩니다. 이때에는 Select 명령어를 이용한 SQL 문을 이용하게 되는데요. 이때에 사용되는 함수입니다. 즉 데이타를 검색할 때 사용되는 함수라는 것이죠. 인수로는 SQL 작성된 Select 문을 인수로 사용합니다. 반드시 검색에만 사용이 되는 함수입니다. Create 나 Insert, Update 등의 다른 SQL 문을 넣게 되면 에러가 뜨게 됩니다. 인수로는 SQL 문장을 사용하지만 리턴되는 값은 데이타를 실질적으로 가져올 수 있는 RecordSet 변수(객체) 를 리턴하게 됩니다. RecordSet 을 이용한 데이타 검색은 뒤에 RecordSet 을 공부할 때 좀 더 자세히 공부해보도록 하겠습니다.

* SQLExecute : Select 문을 제외한 다른 SQL 문을 이용하여 데이타 변경을 하였을 경우 사용되는 함수입니다. 보통 테이블을 생성할 때 사용되는 Create, 데이타의 내용을 수정하는 Update, 데이타를 삭제하는 Delete, 데이타를 입력하는 Insert 문으로 작성된 SQL 문일 경우 사용되게 됩니다. 특별히 리턴하는 값을 없으며 인수로는 SQLSelect 함수와 동일하게 해당 SQL 문을 인수로 사용하게 됩니다. SQLExecute 문을 실행하고 난 다음에는 항상 에러를 체크해줘야합니다. 에러체크를 위한 코드는 앞서 Error 속성을 설명할 때 잠시 언급했었던 if 조건문을 사용하여 Error 속성이 참인지 거짓인지를 확인하여 에러 메세지를 확인해야 합니다. 에러체크를 항상 해주어야 하는 이유는 SQL 문은 내용이 많은 경우 긴 문장을 만들게 되는데 이때에 필드명이나 콤마, 따옴표등을 잘못 작성하여 생기는 문장 오류나 없는 테이블이나 필드명을 입력하는 경우 생기는 논리적인 에러를 확인하기 위함입니다.

* TableSchema : 해당 데이타베이스의 Table 리스트를 구할 때 사용됩니다.
MySQL 같은 경우 테이블 리스트는 MySQL 로긴 후에 터미널 상에서 "Show Tables" 명령어를 이용하여 쉽게 알 수 있지만

2) RealDatabase 클래스
RealDatabase 클래스는 앞서 배운 Database 클래스로 부터 파생되어 만들어진 클래스입니다. 따라서 Database 클래스의 대부분의 모든 속성과 함수를 갖고 있으며 사용할 수 있습니다. RealDatabase 클래스의 용도는 리얼베이직 자체의 데이타베이스 시스템으로 사용됩니다. MySQL 과 같은 범용 데이타베이스와는 다르게 RealDatabase 클래스는 파일 시스템을 기본으로 하고 있으며 서버와 클라이언트라는 개념을 갖고 있지는 않습니다. 그럼 RealDatabase 클래스의 속성과 함수에 대해서 알아보도록 하겠습니다.

*RealDatabase 클래스는 앞서 배운 Database 클래스의 모든 속성을 상속받았기 때문에 추가적인 부분이나 차이점에 대해서만 설명하도록 하겠습니다.

- RealDatabase 의 속성(Properties)
* DatabaseFile : RealDatabase 는 앞서 몇번 언급되었던 것 처럼 파일시스템을 기본으로 하고 있는 리얼베이직 자체의 데이타베이스 시스템 입니다. 파일 시스템을 기본으로 하고 있기에 FolderItem 타입의 DatabaseFile 속성을 갖고 있습니다. 즉 데이타가 저장될 파일이 필요한 것이죠. 그 파이르이 내부는 데이타베이스의 구조로 이루어져 있을 것이구요. 이러한 데이타베이스 파일을 나타내는 속성이 바로 DatabaseFile 속성입니다.

- RealDatabase 의 함수(Methods)
*CreateDatabaseFile : 이 함수는 RealDatabase 시스템에서 데이타가저장되는 실질적인 데이타베이스 파일을 생성해주는 함수입니다. 당연히 RealDatabase 클래스 속성인 DatabaseFile 에 FolderItem 내용이 추가되어있어야 합니다. DatabaseFile 속성을 통해서 어떤 파일을 생성할지를 알 수 있기 때문이지요. 리턴값으로는 참과 거짓을 나타내는 Boolean 데이타를 리턴하게 됩니다. True 값을 리턴하게 되면 제대로 데이타베이스 파일을 생성한 것이고 False 를 리턴하게 되면 어떤 이유 때문에 데이타베이스 파일을 생성하지 못한 것을 나타냅니다.

- 그 외의 RealDatabase와 연관된 함수

* NewRealDatabase 함수
이 함수는 RealDatabase 클래스의 CreateDatabaseFile 함수와 동일한 역할을 합니다. 따라서 인수로는 RealDatabase 클래스의 DatabaseFile 속성가 같은 FolderItem 속성을 필요로 하고 리턴 값으로는 Database 클래스 타입의 변수(객체)를 리턴하게 되죠. 하지만 이 함수는 5.5 이상에서는 사용되지 않는 함수입니다. 리얼베이직 5.5x 버젼에서는 RealDatabase 클래스의 CreateDatabaseFile 함수만 사용되게 됩니다. 하지만 지금 강좌가 5.2.5를 기준으로 되기 때문에 5.2.5를 사용하시는 유저분들은 원하시는 함수를 사용하셔도 됩니다. 단 5.5x 나중에 프로젝트를 업데이트하여 사용하신다고 하면 NewRealDatabase 함수가 쓰여진 부분의 코드를 모두 변경해줘야하기 때문에 되도록 RealDatabase 클래스의 CreateDatabaseFile 함수를 사용하는 것이 좋을 것 같습니다.

* OpenRealDabase 함수
이 함수는 이미 생성된 RealDatabase 클래스의 데이타베이스 파일을 오픈할 때 사용되는 함수 입니다. 사용되는 인수나 리턴 값은 NewRealDatabase 함수와 동일합니다. 데이타베이스 파일을 오픈하기 위해서 FolderItem 타입의 변수(객체)가 필요하고 리턴값으로 Database 클래스 타입의 변수(객체)를 리턴하는 것이죠. 이 함수 역시 리얼베이직 5.5x 이상에서는 사용되지 않는 함수입니다. 이전의 소스에서 이 함수를 사용한 코드가 보이고 5.5x 이상을 현재 사용하고 있다고 하면 RealDatabase 클래스내용으로 변경을 해줘야합니다.

- 리얼베이직 5.2.5 버젼과 5.5x 버젼의 RealDatabase 클래스의 변경된 내용.
NewRealDatabase 함수와 OpenRealDabase 함수를 공부하면서 내용중 5.5x 에서는 사용되지 않는다는 설명을 드렸습니다. 이는 5.5x 대에서는 좀 더 효율적인 기능과 성능을 제공하기 위해서 5.5 버젼에서 부터 RealDatabase 클래스의 기본 내용이 변경 되었기 때문입니다. 이럴 경우에 5.2.5 이하의 버젼으로 데이타베이스 프로그램을 개발한 유저들은 굉장한 어려움이 봉착할 수 있습니다. 왜냐하면 5.5x 에서는 생성되는 데이타베이스 파일의 기본 포맷도 다르게 생성되기 때문에 5.5x 와 5.2.5 이하 버젼의 데이타베이스 파일과 서로 직접적인 호환이 되지 않기 때문입니다. 뿐만 아니라 데이타베이스 내의 Table 을 생성하는 방법이나 구문도 변경이 되었고, 저장되는 데이타 방식이나 내용들이 모두 변경이 되었습니다. 따라서 이미 저장된 데이타가 굉장히 많은 경우나 작성한 코드가 굉장히 많을 경우에는 정말 난해한 어려움에 봉착하게 됩니다. 이러한 문제점의 해결의 위해서 기본적으로 RealSoft 사에서는 OldFormat 이라는 방식으로 이전의 데이타베이스 포맷을 사용할 수 있도록 해줍니다. 방법은 예전의 방식일 경우에는 끝에 "OldFormat" 이라는 구문을 붙이게 되는 것이죠. 즉 NewRealDatabase 함수 같은 경우는 NewRealDatabaseOldFormat, OpenRealDabase는 OpenRealDabaseOldFormat 처럼 되는 것입니다. 따라서 이전의 데이타베이스 파일들은 이런 식으로 사용이 가능하며 RealDatabase 클래스도 RealDatabaseOldFormat 클래스가 별도로 있어서 이전의 데이타베이스 시스템을 지원하게 됩니다. 그러므로 리얼베이직 5.5 이상의 버젼을 사용하고 있는 유저들은 이전의 데이타베이스를 그냥 사용한다고 하면 OldFormat 클래스를 이용하면 될 것입니다. 하지만 이렇게 하지 않고 모든 데이타를 5.5x 용으로 바꾸려고 하는 경우에는 데이타가 많을 때에는 정말 굉장히 많은 작업을 해야하는 경우도 생겨납니다. 이에 대해서도 RealSoft 사에서는 5.2.5이하의 데이타베이스 파일을 5.5이상의 데이타베이스 포맷으로 변경을 해주는 유틸리티를 제공해 주고 있습니다. 리얼베이직은 5.x대에서 부터는 윈도우즈 버젼의 리얼베이직도 개발해서 제공하고 있기 때문에 데이타베이스 파일을 변경해주는 유틸리티는 리얼베이직과 윈도우즈 버젼 모두 제공해주고 있습니다. 해당 유틸리티의 다운로드 사이트는 다음과 같습니다.

[ftp://ftp.realsoftware.com/Tools/REALdbConvertorMac.sit]
[ftp://ftp.realsoftware.com/Tools/REALdbConvertorWin32.zip]

- RealDatabase 에서 지원하는 필드의 데이타 타입
데이타베이스의 필드는 각각 그 타입이 있습니다. 변수가 정수형, 문자형 등의 여러가지 타입이 있는 것 처럼 데이타베이스의 실질적인 값이 들어가는 필드에도 각각의 타입이 있는 것이죠. 따라서 정수형의 데이타는 필드의 타입을 정수형으로 지정을 해야하며 문자형은 문자형으로 해야합니다. 데이타베이스의 필드에는 일반적인 데이타 유형외에또 종류나 크기에 따라서 여러가지 종류의 데이타 유형이 있습니다. 그럼 RealDatabase 에서 지원하는 데이타 타입에 대해서 알아보도록 하겠습니다.

- Integer : 정수형 데이타가 입력되는 필드의 데이타 타입입니다. 변수의 정수형과 동일합니다. MySQL과 같은 다른 데이타베이스 시스템에서는 Int, Num 식으로 지정할 수도 있으며 크기에 따라 TinyInt, BigInt 등의 별도의 데이타 타입이 있기도 합니다.

- Float : 정수가 아닌 실수형 데이타 타입의 필드입니다. 숫자를 다룰 때 정수만 다룰 수는 없는 법이죠. 실수를 사용할 때에는 Field 타입을 Float 로 해주세요. Float 형의 데이타 사이즈는 4Bytes 입니다.

- Double : 배정도 실수를 다룰 때 사용됩니다. 기본 실수보다도 더 큰 실수를 사용할 때 사용됩니다.
Double 형의 데이타 사이즈는 8Bytes 입니다.

- Char : 문자를 다룰 때에 사용됩니다. 이 타입은 미리 사이즈를 정해줘야 합니다. Char(10) 이라고 지정하면 10문자 길이의 문자만 입력할 수 있는 것이죠. 5개의 글자를 입력해도 나머지는 nil 로 들어가서 항상 데이타 입력시에 10bytes 를 차지하게 됩니다. 예를 들엇 주소록 사용시 우편번호, 전화번호, 주민등록 번호등의 정해진 크기의 문자를 입력할 때 유용합니다.

- Varchar : Char 와 마찬가지로 문자를 다룰 때 사용되는 필드 타입입니다. Char 와의 차이는 길이의 제한없이 자유로운 크기의 데이타를 입력할 수 있다는 점이지요. 앞서 예 처럼 주소록에서 주소나, 이름(이름은 항상 3글자만 있는 것은 아니니까요.), 기타 설명등의 내용을 넣을 때 유용합니다. 하지만 제한 크기는 있습니다. 최대 크기는 255 문자만 입력 가능합니다.

- Date : 리얼베이직의 Date 클래스와 마찬가지인 필드 타입입니다. 대신 년도, 월, 일에 대한 내용만 들어갑니다.

- Time : 리얼베이직의 Date 클래스와 마찬가지인 필드 타입입니다. 대신 시간, 분, 초에 대한 내용만 들어갑니다. Date나 Time 을 사용해도 되지만 데이타를 입력 할때에는 굉장히 불편한 경우가 많습니다. 따라서 보통 년도는 '2004-07-15' 식의 형식으로 Char 형으로 지정하여 입력을 합니다. 시간도 마찬가지입니다. '16:05-24' 식으로 Char 형으로 지정하여 입력하는 경우가 더 많습니다. 이렇게 해도 소팅이나 검색에는 전혀 문제가 없으며 데이타 입력시나 검색 조건 할당시 더욱 편리합니다.

- Currency : 10진수의 데이타 입력시 $ 표시가 들어가도록 하여 해당 국가의 금전 표시가 나타나도록 해줍니다. 그리 중요한 필드 타입은 아닙니다. 이런 타입이 없어도 전혀 프로그램을 개발하는데에는 지장은 없습니다.

- Boolean : 참과 거짓을 나타내는 필트 타입입니다. True, False 식의 단순 데이타 입력시에 이 필드 타입을 이용하면 유용합니다. 예를 들어서 CheckBox 콘트롤이나 2개로 이우러진 RadioButton 콘트롤의 데이타를 사용시에 유용합니다.

- Binary : Binary 데이타를 입력시에 사용되는 필드 타입입니다. 코드, 또는 이미지, 16진수의 데이타 등을 입력할 때 사용됩니다.

- Long VarBinary : Binary 와 동일하지만 최대 크기가 2GB 까지 지원됩니다. 일반적으로 그림 이미지 등을 데이타베이스에 저장할 때 사용된다고 보시면 됩니다. 순수한 Binary 코드를 입력시에는 SQL 문 작성이나 데이타 입력시 문제가 생길 수 있습니다. 이럴 경우에는 Base64 방식으로 Encode 하여 데이타를 입력하면 됩니다. 물론 데이타를 불러들일 때에는 Base64 방식으로 Decode 하면 됩니다. 관련 함수는 EncodeBase64 함수와 DecodeBase64 함수를 참조하시기 바랍니다. 물론 이런 방식 외에는 이미지를 다룰 때에는 MBS Plugins 에 포함된 기능 중에 PictureToString, StringToPicture 와 같은 함수를 이용해도 가능합니다.

- MacPict : Macintosh 고유의 그림 포맷인 PICT 이미지를 달룰 때 사용됩니다. 하지만 Long VarBinary 필드를 더 많이 사용하기 때문에 크게 의미있는 필드 타입은 아닙니다.

데이타베이스의 가장 큰 관점은 더 많은 내용을 더 작은 사이즈에 많이 입력하고 또는 빠르게 검색하는 것입니다. 이를 위해서는 적절한 데이타에 맞는 필드의 데이타 타입을 정하는 것이 중요합니다. RealDatabase 시스템과 같은 경우는 다른 범용 데이타베이스 시스템에 비해서 굉장히 협소한 데이타 타입만을 제공해 줍니다. 그리고 성능도 다른 범용 데이타베이스 시스템에 비해서 많이 떨어지기 때문에 Client&Server 환경이 필요하지 않고 작은 데이타들을 다룰 때에 유용합니다. 반면 MySQL 데이타베이스 시스템과 같은 경우에는 사이즈에 따라서 Tiny, Medㅗium, Big 등으로 나누어서 대부분의 많은 데이타 타입을 제공해 줍니다. 따라서 데이타의 종류에 따라서 적절히 필드의 데이타 타입을 정함으로써 쓸모없이 버려지는 공간 없이 많은 데이타를 입력할 수 있습니다. 그리고 데이타가 너무 비대해지면 검색 시간도 느려지기 때문에 수만건 수십만건의데이타를 다루는 데이타베이스의 작업에서는 1Bytes 의 작은 용량도 무시할 수 없는 것입니다. 따라서 MySQL 과 같은 데이타베이스는 좀 더 큰 용량의 데이타를 다룰 때 좋은 성능을 보여줍니다.

3) MySQLDatabase 클래스
MySQL 데이타베이스 시스템은 앞서 설명한 것 처럼 무료이면서도 안정적이고 빠른 성능을 제공해주는 범용 데이타베이스 시스템입니다. 서버와 클라이언트의 개념을 갖고 있어서 RealDatabase 와는 다르게 TCP/IP 접속을 제공해 주고 있습니다. 솔직히 리얼베이직에서 MySQL 데이타베이스 시스템을 사용할 수 있다는 점은 정말 좋은 환경이라고 생각하시면 됩니다. 앞서 데이타베이스 소개 부분에서 말씀드린 것 처럼 MySQL은 무료이면서도 안정성이나 성능면에서 어느정도 검증이 된 범용 데이타베이스 시스템이기 때문에 상용 데이타베이스 시스템에 비해서 절대 뒤질 것이 없는 아주 강력한 데이타베이스 시스템입니다. MySQL 을 사용할 수 있다면 다른 데이타베이스 시스템은 없어도 될 정도로 사용자를 만족시켜주는 부분이 많습니다. 거기다가 무료라는 점은 굉장하죠..^^;;

*MySQL 에 대한 자세한 내용은 리눅스 관련 책자나 인터넷을 통해서 검색하시면 많은 강좌 내용을 검색할 수 있습니다. 그럼 리얼베이직에서 제공해주는 MySQLDatabase 클래스에 대해서 알아보도록 하겠습니다.

- MySQLDatabase 의 속성(Properties)
* Port : 앞서 설명했던 것 처럼 MySQL 은 TCP/IP 접속을 지원합니다. TCP/IP 접속을 지원한다는 것은 MySQL 데이타베이스 시스템에 접속을 하기 위한 별도의 Port 가 제공된다는 점입니다. 이 포트는 MySQL 데이타베이스 서버쪽에서 자유롭게 변경을 하여 사용할 수 있습니다. 보통 기본포트로는 3306 포트를 사용하게 됩니다. 하지만 포트를 숨기고 싶을 경우는 다른 포트를 사용하시면 됩니다. 서버에서 포트를 변경하게 되면 이 포트 값에 해당 포트 값을 Port 속성에 넣어야만 MySQL 데이타베이스 서버에 접속할 수 있습니다. 물론 지정해주지 않으면 기본 포트 값인 3306 번을 갖게 됩니다. 이 속성의 데이타 형은 정수형인 Integer 타입니다.

* Timeout : MySQL 은 클라이언트 & 서버 환경을 제공하기 때문에 항상 사용하기 위해서는 Client 가 되는 쪽이 접속을 해야합니다. 그런데 접속이 제대로 되지 않거나 접속이 에러가 생기는 경우 먹통(?)이 되어서 아무것도 작동되지 않는 경우가 있습니다. 이럴 경우 경과되는 시간에 의해서 강제적으로 접속을 끊고 다른 작업이 가능토록 해주는 시간 설정값이 있는데 이것이 바로 TimeOut 속성입니다. 기본 시간은 15초로 설정되어있습니다.

* MySQLDatabase 클래도 Database 클래스로부터 상속을 받은 클래스이기 때문에 위의 속성 외에도 Database 의 기본 속성인 Host, DatabaseName, UaseName, Password 속성을 모두 사용할 수 있습니다. 특히 MySQL 데이타베이스 시스템에 접속하기 위해서는 이 속성들이 모두 필요하며 설정되어있어야 합니다.

그럼 간단하게 MySQL 데이타베이스 시스템에 접속하는 코드를 작성해 보도록 하겠습니다. 우선 몇가지 조건을 가정해 보도록 하겠습니다. MySQL 에는 MySQL 데이타베이스 시스템에 접속하기 위한 별도의 유저 아이디와 암호를 요구하게 되어있습니다. 따라서 MySQL 데이타베이스 시스템의 주소는 "kissmac.com"이라 가정을 하도록 하죠. 그리고 데이타베이스 작업 명은 "kissmacDB"로 하구요.
유저 이름은 "kissmac", 암호는 "kissmacPass" 로 설정을 하도록 합니다. 이럴 경우에 MySQL 데이타베이스 시스템에 접속하는 코드는 다음과 같습니다.
dim ConnectDB as MySQLDatabase
dim b as Boolean

ConnectDB = New MySQLDatabase

ConnectDB.Host = "kissmac.com"
ConnectDB.DatabaseName = "kissmacDB"
ConnectDB.UserName = "kissmac"
ConnectDB.Password = "kissmacPass"


b = ConnectDB.Connect()
if b = false then
111111msgbox "Connect Database system Error~!"
111111return nil
end if
위의 예를 보면 MySQLDatabase 타입의 ConnectDB 변수(객체)를 선언 한 후에 New 명령어를 이용해서 객체를 실질적으로 초기화(생성) 한 것을 알 수 있습니다. 그 부분의 코드가 바로
ConnectDB = New MySQLDatabase
입니다.
그리고 나머지는 MySQLDatabase 의 Host, DatabaseName, UserName, PassWord 속성의 값을 지정하는 것이죠. Host 속성은 "kissmac.com" 인 도메인 명을 넣었고 DatabaseName 은 "kissmacDB", UserName 에는 "kissmac", PassWord 에는 "kissmacPass"이 들어가게 됩니다. 그리고 MySQLDatabase 의 Connect 함수를 통해서 접속이 이루어 지고 이 Connect 함수는 접속의 성공에 따라 True, False 값을 리턴하기 때문에 접속이 제대로 이루어지지 않았을 경우 에러메세지를 나타내도록 한 것 입니다. 간단하게 보면 굉장히 간단한 코드이며 처음접하는 분들은 좀 복잡하다는 생각이 들수도 있습니다. 하지만 습관이 되고 손에 익숙해지면 아주 간단한 코드이니 자주자주 사용해서 연습해보도록 하시기 바랍니다. 또는 접속 부분만 함수를 만들어 놓고 리턴 값으로 MySQLDatabase 객체를 리턴하게 되면 편리하기도 합니다.

- MySQLDatabase 의 함수(Methods)
* GetAffectedRows : Database 클래스의 함수중 SQLExecute 함수가 있다는 것을 앞서 공부했을 것입니다. 이는 Insert, Update, Delete 등의 Select 문을 이용한 검색이 아닌 SQL 명령어를 사용할 경우 사용해주는 함수라고 설명을 해드렸었습니다. GetAffectedRows 함수는 SQLExecute 함수를 이용해서 변경되어 기록된 데이타의 Row(Reocrd 번호) 값을 구할 때 사용됩니다. 최근 변경된 데이타가 어떤 것인지 확인을 할 경우 필요할 수 있습니다. 하지만 보통 별도의 수정된 날짜를 필드로 별도로 두어서 수정 일자를 확인하는 경우가 더 많은 것 같습니다. 이는 데이타베이스 설계를 어떻게 하느냐에 따라 차이가 생길 수 있습니다.

* GetInsertID : MySQL 의 필드 타입을 지정할 때에는 자동으로 값이 증가되는 정수형 타입의 필드를 지정할 수 있습니다. 이 필드는 따로 값을 넣을 필요 없이 AUTOINCREMENT 로 지정을 하게 되면 데이타가 추가될 때 자동적으로 순서대로 값을 갖게 됩니다. GetInsetID 함수는 이러한 자동적으로 값이 증가되는 필드 중 마지막에 증가된 값을 구할 때 사용됩니다.

* LogPackets : 이는 개발시에 디버깅을 위한 함수입니다. 서버간의 패킷 전송에 대한 Log 내용을 지정한 파일로 저장할 수 있습니다. 리얼베이직 개발자를 위한 것이라기 보다는 MySQL 을 튜닝하거나 이쪽 분야의 관리자를 위한 기능이라고 보면 되겠습니다. 실질 적으로 개발시에는 데이타가 잘 입력되는지 아닌지만 검색하기 때문에 거의 사용되지는 않고 있습니다.^^;;

여기까지가 MySQL 에 대한 내용이었습니다. 앞서도 항상 얘기했지만 MySQLDatabase 클래스도 Database 클래스의 내용을 기본으로 확장된 클래스이기 때문에 항상 Database 클래스의 내용을 잘알고 이해하고 계시기 바랍니다. *MySQL 의 설치는 앞서 안내해드린 http://www.entropy.ch/software/macosx/mysql/ 페이지를 참고하시기 바랍니다.


앞서 SQL 언어에 대해서 간단히 언급이 되었었습니다. SQL 언어는 데이타베이스 시스템에 있어서 없어서는 안될 핵심 기능 중 하나입니다. 따라서 SQL 언어를 지원하지 않는 데이타베이스 시스템은 없다고 봐도 과언이 아니죠. SQL 은 Structured Query Language의 약자로서 데이타베이스 시스템에서 데이타를 검색하기 위한 조건문을 생성하는 문법이자 언어입니다. 이 언어를 사용해서 데이타를 입력하고 검색하는것이 가능하며 내용을 업데이트 하거나 삭제하는 것이 가능합니다. 뿐만 아니라 데이타베이스 작업 자체를 생성하고 필드를 구성하여 새로운 테이블을 만들 수 있는 생성의 기능도 갖고 있습니다. 가장 많이 사용되는 분야는 역시 데이타를 검색하는 것이겠죠.

SQL 언어는 언어라는 말 때문에 어렵게 느껴질 수도 있겠지만 굉장히 사용이 간단하고 편리합니다. 그럼 리얼베이직의 RealDatabase 에서 사용되는 대표적인 몇몇 SQL 문에 대해서 알아보도록 하겠습니다.(*다른 데이타베이스 시스템에 대한 SQL 언어는 따로 공부해야합니다. 하지만 SQL 언어는 기본이 모두 거의 동일하기 때문에 몇가지 언어만 익히면 쉽게 데이타를 다룰 수 있을 것입니다.)

1) SQL 의 기본 문법
SQL 의 기본문법은 알고 나면 간단합니다. 그럼 기본에 대해서 알아보도록 하죠.
명령어 필드 from Table
SQL 의 기본은 위의 예 처럼 명령어가 오고 그 다음에 검색하기 위한 필드명이 오게 됩니다. 그리고 마지막으로 Table 이름이 오게 되는데 중간에 from 이라는 접속사가 붙게 됩니다. 위의 문법을 통해서 간단한 예를 알아보도록 하죠.
Select * from UserName
예를 들어서 사용자의 이름들을 담고 있는 UserName 이라는 테이블이 있다고 가정해 보도록 하죠. 위의 예문은 Select 라는 명령어를 사용했습니다. Select 는 뒤에 자세히 배우겠지만 데이타를 검색할 때 사용되는 SQL 의 명령어 입니다. 이 명령어 다음에는 검색하기 위한 필드명이 오게 되어있습니다.
보통 "*" 를 표시하면 전체 필드를 나타냅니다. 그리고 from 접속사가 오고 테이블 이름인 UserName 이 마지막에 오게 되는 것이죠. 이해가 되시는지요. 그럼 위와 같은 SQL 문의 기본 명령어와 사용방법에 대해서 알아보도록 하겠습니다.

2) 기본 기능 설명
여기에서는 SQL 문에서 필요한 필수 명령어와 사용법에 대해서 간단하게 알아보도록 하겠습니다.
좀 더 자세한 SQL 문 사용에 대해서는 인터넷 무료 강좌나 별도의 서적을 이용해주시기 바랍니다.

- Create : Create 명령어는 Database 나 Table 을 생성할 때 사용됩니다. 리얼베이직의 자체 데이타베이스 시스템인 RealDatabase시스템에서는 데이타베이스를 만들 때에는 Create 문을 사용하지는 않습니다. 파일을 생성하는 것 자체가 Database 를 만들어주는 것이 되죠. 하지만 MySQL 이나 다른 데이타베이스 시스템에서는 기본 작업명이 되는 Database 를 생성해줘야 합니다. 작업할 Database 를 생성하기 위해서 MySQL 에서는 다음과 같이 합니다.
Create Database 생성할 데이타베이스 이름
이해가 되시는지요. 그럼 좀 더 쉽게 예를 들어보도록 하죠. KissmacUserList 라는 데이타베이스 작업을 만들려고 한다면 다음과 같이 하시면 됩니다.
Create Database KissmacUserList;
MySQL 에서 로긴 한 뒤에 위의 문장을 터미널에 입력하면 해당 Database 작업이 생성이 됩니다. Database 의 생성은 단순히 이름만이 필요해서 굉장히 간단했습니다. 그럼 이번에는 Table 을 생성하는 것에 대해서 알아보도록 하죠.

Table 을 생성할 경우에는 우선 먼저 어떤 필드를 구성할 것인지를 생각하고 설계해야 합니다. 여기서는 간단한 예를 들어보도록 하죠. 주소록 프로그램을 만든다는 가정하에 이름과 전화번호 필드가 필요하다라고 가정해보도록 합니다. 이것을 기본으로 하여 PhoneList 라는 Table 을 만들어 보도록 하죠.

우선 Table 을 만들어주는 문법은 다음과 같습니다.
Create Table Table이름 (필드 필드타입);
다음과 같이 해보도록 합니다.
Create Table PhoneList(Name Varchar(20), PhoneNum varchar(20));
위의 예에서 보면 우선 Create 라는 명령어가 나오고 어떤것을 만들 것인지를 나타내는 Table 이라는 구문이 나옵니다. 즉 Table 을 만든다는 것이지요. 앞서 Database 생성의 예와 비교하면 Create 다음에 Database 가 나오면 Database 를 만드는 것이고 Table 이 나오면 Table 을 생성하는 것입니다. 그리고 다음에는 "PhoneList" 라는 Table 명이 나오게 됩니다.그리고 괄호 안에 필요한 필드명과 필드의 타입이 나타나게 되죠. 필드의 타입은 자유롭게 크기가 결정될 수 있는 Varchar 타입으로 최대 크기를 20씩으로 정했습니다. 여튼 위와 같이 하면 "PhoneList"라는 테이블이 생성이 되고 "PhoneList" 테이블 안에는 "Name" 필드와 "PhoneNum" 필드가 생성이 됩니다.

- Insert : Insert 문은 말 그대로 데이타를 입력할 때 사용됩니다. 사용 문법은 다음과 같습니다.
Insert Into Table명(입력할 필드명1, 입력할 필드명2) Values (입력될 데이타1, 입력될 데이타2)
그럼 앞서 했던 예제를 통해서 간단하게 예제를 들어보도록 하죠. 앞서 Create 문을 통해서 만든 PhoneList 테이블에 데이타를 넣는 예제를 만들어 보도록 하겠습니다.
Insert Into PhoneList(Name, phoneNum) Values ('키스맥', '02-777-7777')
어떤가요? 간단하지 않나요? 여튼 위와 같은 식으로 하게 되면 Insert 문은 SQL 에 능숙하거나 편한 유저분들에게는 편리하지만 대부분 리얼베이직에서는 DatabaseRecord 클래스를 이용하여 데이타를 입력하게 됩니다. 크게 차이는 없습니다. DatabaseRecord 클래스에 대해서는 뒤에 다시 공부해 보도록 하겠습니다. 여튼 Insert 문은 Insert 문 다음에 Into 라는 접속어가 오고 그 다음에 Table 명 그리고 필드명과 데이타가 별도로 순서대로 입력이 된다는 점을 기억하시면 될 것 같습니다. Insert 문이 입력 되고 난 후에는 항상 Database 클래스의 Commit 함수가 실행되어야 실질적으로 입력된 데이타가 적용되게 됩니다.

- Update : Update 문은 말 그대로 내용을 수정하여 적용시켜주는 부분입니다.
사용 문법은 다음과 같습니다.
Update Table명 Set 필드명=값, 필드명, 값 [where 조건문]
SQL 문은 항상 기본 문법만 알면 응용하기에도 쉽습니다. 문법 자체가 그리 어렵지 않기 때문이지요. Update 문에서는 Table 명 다음에 Set 이라는 접속어가 오고 필드명에 직접 값을 입력해 주면 됩니다. 그리고 항상 염두해 둬야 하는 부분 뒤에는 Where 절이 올 수 있다는 점입니다. Where 절은 뒤에 배우겠지만 조건을 위해 생성할 때 사용되는 접속어 입니다. Where 다음에 조건이 오면 되겠죠. 여튼 앞서 가정했었던 주소록 Table 인 PhoneList 의 예를 한번 보도록 하겠습니다.
Update PhoneList Set Name='키스맥', PhoneNum='02-777-7777'
위의 예는 PhoneList 테이블의 Name 필드에 '키스맥' 이라는 데이타를 입력하고 PhoneNum 필드에 '02-777-7777'이라는 전화번호를 입력하나는 내용입니다. 그런데 여기에서 주의할 점은 데이타가 10개가 입력 되어있을 경우에 위와 같이 하면 모든 Name 필드의 값도 '키스맥;'이 되고 모든 10개의 PhoneNum 필드에도 '02-777-7777' 값이 입력이 되는 것 입니다. 그럼 어떻게 해야할까요? 여기에서 Where 절이 필요하게 됩니다. 뒤에 조건이 없을 경우에는 Update 문에서 적용시키는 필드의 모든 값에 내용이 변경되지만 조건문을 이용해서 필요한 항목의 내용만 바꾸도록 하면 되는 것입니다. 따라서 입력된 데이타 중에 Name 값이 '미쉐린'이라는 데이타가 있고 이 값의 전화번호를 '02-888-8888'로 수정한다고 가정해보도록 하고 다시 Update 문을 만들어 보도록 하겠습니다.
Update PhoneList Set PhoneNum='02-888-8888' Where Name='미쉐린'
자 어떤가요? 쉽게 이해되십니까? 위의 예에서는 Where 절이 추가로 붙었습니다. Where 절의 해석은 Name 필드의 값이 '미쉐린' 인 내용에 대해서만 적용하라는 것입니다. 따라서 위의 예제의 전체적인 해석은 Name 필드가 '미쉐린'인 기록된 데이타의 전화번호 필드인 PhoneNum 의 값을 '02-888-8888'로 변경하라는 내용입니다. 그런데 이때 생각할 점은 Name 필드의 내용이 '미쉐린' 인 데이타가 여러개 있다가 Where 의 조건에만 만족하면 그 여러개 데이타 모두 변경 된다는 점입니다. 그럼 이럴 경우 좀 더 정확한 데이타 변경을 위해서 예제를 하나 더 해볼까요?
Update PhoneList Set Name='차차차', PhoneNum='02-999-9999' where Name='미쉐린' and PhoneNum='02-888-8888'
이름만의 비교로는 동명이인인 경우가 있습니다. 따라서 이번 예제에서는 Where 절에 and 구문을 이용해서 전화번호 비교까지 했습니다. 내용은 Name 필드의 값이 '미쉐린' 이고 PhoneNum 필드의 값이 '02-888-8888'인 데이타의 내용을 Name 필드는 '차차차'로 바꾸고 PhoneNum 필드는 '02-999-9999'로 바꾸라는 말입니다. 어때요. 간단하죠? 꾸준한 연습으로 항상 익혀 두시기 바랍니다. 내용을 업데이트 하는 방법은 Update 문을 사용하는 방법 외에도 RecordSet 클래스를 이용하는 방법도 있습니다. 이에 대해서는 RecordSet 클래스를 공부할 때 다시 해보도록 하겠습니다. 그리고 Update 문에서도 변경된 내용은 Database 클래스의 Commit 함수가 실행되어야 그 변경된 내용이 적용되게 됩니다.

- Delete : Delete 문도 역시 이름처럼 기록된 데이타를 지워주는 내용입니다.
Delete 문도 Update 문과 마찬가지로 Delete 문 뒤에 Where 절을 이용하여 조건을 넣을 수가 있습니다.
그리고 그 조건에 맞는 데이타들을 삭제할 수 있는 것이지요. 그럼 Delete 문의 사용문법에 대해서 확인해보도록 하죠.
Delete From Table명 [where 조건문]
Delete 는 굉장히 간단하죠? Delete 는 특정 필드의 내용을 삭제하는 것이 아니라 기록 자체를 지우기 때문에 별도에 필드명을 필요로 하지 않습니다. 다만 Where 조건문에서나 내용을 비교해서 그 조건에 맞는 데이타를 삭제해야하기 때문에 필드명과 그 값이 필요하게 됩니다. 뒤에 Where 구문의 조건문이 없이 단순하게 Delete 와 테이블명만 적는다면 해당 테이블 안의 모든 내용을 지운다는 것을 말합니다. 따라서 자칫 잘못하다가는 단 한줄의 잘못된 Delete 문으로 모든 데이타를 삭제해버릴 수 있다는 점 주의하시기 바랍니다. 그럼 Delete 문에 대해서도 PhoneList 테이블을 기반으로 하여 예를 하나 들어보도록 하죠.
Delete From PhoneList
위와 같이 하면 잠시 설명해 드렸건 것 처럼 PhoneList 테이블 안의 내용을 모두 삭제하게 됩니다.
그럼 조건을 넣어서 해보도록 하죠. 이름이 '미쉐린'인 데이타만 삭제를 해보도록 하겠습니다.
Delete From PhoneList Where Name='미쉐린'
위와 같이 하면 됩니다. 간단하죠? SQL 문의 조건문은 항상 Where 문을 통해서 이루어 지고 조건이 들어가는 부분은 어떤 부분이던 동일한 방식으로 들어갑니다. 따라서 Where 절만 잘 알고 있으면 어떤 명령어를 사용한다 하더라도 올바른 조건을 손쉽게 입력할 수 있습니다.

- Select : Select 문은 데이타베이스 시스템에 기록된 데이타를 검색할 때 사용되는 명령어입니다.
실질적으로 SQL문을 사용할 때 가장 많이 사용되는 부분이며 가장 중요하고 기본이 되는 명령어입니다. Select 문의 사용 문법은 다음과 같습니다.
Select 함수 또는 필드명 From Table명 [where 조건문] [Order by, Group by]
Select 문은 단순 검색 부터 복잡한 조건 검색뿐 아니 오름차순, 내림차순등의 순차 정렬, 그룹의 내용을 볼 수 있는 그룹 검색 기능, 그리고 다양한 SQL 함수를 사용할 수 있는 부분입니다.
*SQL 문의 함수는 해당 데이타베이스에 따라서 크게 차이가 나는 경우도 있지만 공통적으로 사용되는 함수들도 있으니 이에 대해서 잘 알아두시기 바랍니다. SQL 문의 함수에 대해서도 공통적인 기본 함수에 대해서 뒤에 공부를 해보도록 하겠습니다. 그럼 앞서 계속 다루었던 PhoneList 테이블을 기반으로 검색 예제를 해보도록 하죠.
Select * from PhoneList
위의 내용은 PhoneList 테이블에 기록되어 저장되어있는 모든 필드의 내용을 그냥 입력 순서대로 출력하는 것입니다. 필드 명 대신 '*' 표시를 하면 전체 필드를 나타내는 것입니다.
그럼 이번에는 다음과 같이 해보도록 하죠.
Select Name From PhoneList
위와 같이 하면 모든 Name 필드의 내용을 나타내 줍니다. 그럼 이번에는 다음과 같이 해보죠.
Select * From PhoneList where Name='미쉐린'
위의 내용을 앞서 했었던 예제와 같이 Name 속성이 '미쉐린'인 데이타의 전체 내용을 검색해주는 것입니다. 중복 조건도 가능하죠. 다음과 같이 동일하게 해보면 됩니다.
Select * From PhoneList where Name='미쉐린' and PhoneNum='02-888-7777'
위의 내용은 어떤 것을 나타내는줄 잘 알겠죠? 바로 이름이 '미쉐린'이고 전화번호가 '02-888-7777' 인 데이타를 검색하는 내용입니다. 그럼 검색은 이정도로 하고 함수의 사용에 대해서 알아보도록 하죠.
SQL 은 기본 검색 외에도 함수기능을 넣어서 여러가지 검색 결과를 나타나게 할 수도 있습니다.
우선 다음과 같이 해보도록 하겠습니다.
Select Count(*) from PhoneList
위의 내용은 PhoneList 테이블에 기록된 데이타를 구해주는 내용이 됩니다. 즉 Count 라는 함수는 기록된 데이타의 수를 구해주는 함수인 것이죠. 여기에 조건도 넣을 수 있습니다. 다음과 같이 해보도록 하죠.
Select Count(*) from PhoneList where Name='미쉐린'
위의 내용은 이름인 Name 필드의 속성이 '미쉐린' 으로 기록된 데이타의 갯수를 구해줍니다. '미쉐린'이란 이름이 동명이인이 거의 없겠지만 다른 일반적인 이름에는 이런 방법이 가능하겠죠. 이름 말고도 여러가지 데이타를 산출하는 내용 중에는 이러한 Count 함수가 많이 사용됩니다. 다음 그림은 iPost 프로그램의 그룹에 포함된 메모의 갯수를 표현해주는 화면입니다.

이 갯수를 구할 때에도 똑같이 조건과 Count 함수가 사용됐습니다. 조건에는 그룹의 고유 ID를 사용하고 그 그룹에 포함된 매모 갯수를 Count 함수를 통해 구한 것이죠. 이러한 예는 4K 뉴스 다운로드 프로그램에서도 확인할 수 있습니다. 다음의 그림은 주제에 따른 등록된 뉴스의 갯수를 보여주는 4K 뉴스 입력 화면입니다. Count 함수는 쉽게 이해를 위해서 사용한 것이며 별도의 SQL 함수에 대해서는 공통적인 내용에 대해서 뒤에가서 공부해보도록 하겠습니다.

- Where : Where 절은 앞서 조금 예제를 봐서 알겠지만 SQL 문에서 조건문을 이용할 때 사용되는 접속어 입니다. SQL 의 모든 조건문은 Where 절 다음에 오게 됩니다. 그리고 Where 절은 SQL 문의 뒤에 위치해서 조건문이라는 것을 쉽게 확인 토록 해줍니다. Where 절에는 여러가지 비교 문이 사용가능 합니다. 예를 들어서 교집합등에서 사용하는 and, or 등의 접속어 입니다. 다음의 예를 보도록 하죠.
Name='미쉐린' and PhoneNum='02-888-8888'
위의 예를 Name 속성도 '미쉐린'이고 전화번호인 PhoneNum 필드의 값도 '02-888-8888' 인 데이타만 유효한 것을 나타냅니다. 둘다 조건을 만족해야한다는 점이죠. Name 필드는 '미쉐린'인데 PhoneNum 필드는 '02-888-7777'이면 그 데이타는 이 조건에는 유효한 것이 아니게 됩니다. 따라서 and 구문은 모든 조건이 만족해야하는 부분에서 사용이 됩니다. 반면에 or 구문은 둘중에 하나만 만족하면 되는 것을 나타냅니다. 다음의 예를 보도록 하죠.
Name='미쉐린' or PhoneNum='02-888-8888'
위의 내용은 Name 필드가 '미쉐린'이거나 PhoneNum='02-888-8888' 이거나 둘중에 하나만 만족하면 유효한 것임을 말해줍니다. 또는 다음과 같이 할 수도 있겠죠.
Name='미쉐린' or Name='키스맥'
위와 같이 하면 이름이 '미쉐린'이나 '키스맥'이면 모두 유효한 것을 나타냅니다. 그럼 위의 Where 절을 이용한 Select 문을 이용하면 다음과 같이 해볼 수도 있겠죠.
Select Count(*) from PhoneList where Name='키스맥' or PhoneNum='02-888-8888'
이해가 되셨는지요? Where 절은 검색시나 데이타 삭제 및 수정시 항상 필요한 내용이기 때문에 잘 이해하고 알아두시기 바랍니다.

- Order by : Order By 는 순차적인 정렬 방식을 나타냅니다. Order By 구문은 특정 필드의 내용에 따라서 오름차순 또는 내림차순 식으로 정렬을 하여 데이타를 산출 할 수 있도록 해줍니다. 보통 프로그래밍 언어에는 여러가지 정렬 방법이 있습니다. 하짐나 데이타를 다 받아서 정렬을 한다고 생각을 하면 그것을 효율성면에서도 떨어지고 프로그램을 개발하는데 있어서도 많은 어려움이 따를 수 있습니다. 따라서 가장 좋은 방법은 바로 데이타를 불어들일 때 정렬된 순서로 불러들이는 것이지요. 이것을 해주는 것이 바로 Order By 구문입니다. Order By 구문은 데이타를 검색시에 정렬된 순서로 가져오는 명령어이기 때문에 Select 구문하고만 같이 사용됩니다. 그럼 다음의 예를 보도록 할까요?
Select * from PhoneList Order By Name
위의 내용을 전체 PhoneList 테이블의 내용을 Name 필드의 순서대로 데이타를 검색해주는 내용입니다. 이름이 들어가는 필드이기 때문에 가나다 순으로 나타나거나 영문일 경우에는 ABC 순으로 검색되어서 순서대로 데이타가 검색이 되게 됩니다. 그럼 반대로 하려면 어떻게 하면 될까요? 다음과 같이 해보시기 바랍니다.
Select * from PhoneList Order By Name DESC
정렬의 기준이 되는 Name 필드의 뒷 부분에 DESC 라는 명령어를 추가합니다. 이러면 내림차순이 되는 것이죠. 이렇게 오름차순, 내림차순은 간단하게 Order By 구문 뒤에 DESC 를 추가하느냐 추가하지 않느냐에 결정됩니다. 아주 간단하지 않습니까? Order By 는 하나의 필드만이 아니라 2개 3개 를 연개해서 정렬을 할 수도 있습니다. 그 순서는 처음 지정하는 필드가 우선이 되어서 정렬을 하게 되는 것이죠. 그럼 다음의 예를 보도록 하겠습니다.
Select * from PhoneList Order By Age, Name
위와 같이 하면(앞서 했던 가정중 PhoneList 테이블에 Age 라는 필드가 더 있다는 가정하에 만든 예제입니다.) 먼저 나이순, 이름순으로 데이타가 검색이 되게 됩니다. 이렇게 2개 3개 이상의 필드를 기준으로 하여 정렬을 할 수 있습니다. Order By 구문에 대해서도 나중에 예제를 통해서 좀 더 확실하게 확인이 가능할 것입니다.

- Group by : Group By 는 같은 항목을 담고 있는 내용에 대해서 그룹화 할수 있는 내용입니다.
보통 앞서 잠시 보았던 Count 함수를 이용해서 같은 항목이 있는 갯수를 1개로 취급할 때 사용이 가능합니다. Group By 는 Order By 와 동일한 방법으로 SQL 문의 맨 뒤에 위치하여 사용이 가능합니다. 예를 들어보도록 하죠.
Select Count(*) from PhoneList Group By Name
위와 같은 방식으로 하면 동명 이인에 대해서는 1개로 개산이 됩니다. 물론 위의 PhoneList 가정에는 적합하지 못한 예이지만 그룹화된 내용을 다룰 경우(예를 들어서 4K 의 주제나 iPost 의 메모 그룹 등) 편리하게 사용됩니다.

*좀 더 자세한 SQL 문에 대한 내용은 인터넷이나 별도의 서적을 통해서 확인해 보시기 바랍니다. 또한 앞으로 리얼베이직의 Database 에 대한 예제를 통해서 나오는 내용은 제대로 이해할 때까지는 자주 연습을 해서 익혀두시기 바랍니다. 데이타베이스를 가장 쉽게 익히기 위한 방법중 하나는 바로 많은 연습입니다. 연습을 많이 하면 말로 설명하기 힘든 부분의 이해가 쉽게 되는 경우가 많습니다.


이번 강좌에는 Database의 기본에 대해서 설명을 해드렸습니다. Database 는 오래전부터 있었던 기술이기는 하지만 최근 들어서 더욱 성숙해졌고 데이타를 다루는 기본으로서 자리를 잡았기 때문에 많은 내용이 다루어져야 합니다. 이번 강좌에서는 특별한 예제도 없었고 이해하기 어려울 수도 있는 몇가지 SQL 을 다루었었습니다. 하지만 뒤의 내용들을 하나하나 다시 익혀가면 이번 강좌의 내용이 아하 이랬었구나 라는 생각이 들 수도 있을 것입니다. 따라서 앞으로의 데이타베이스 내용에 대해서 좀 더 심오하고 깊이있게 다룰 생각입니다. 데이타베이스 강좌는 다른 강좌에 비해서 내용이 좀 더 많아질 것 같습니다. 그만큼 예제도 좀 더 활용하기 좋고 알찬 예제를 통해서 앞으로 데이타베이스에 대해서 공부를 해보도록 하겠습니다. 다음 강좌에서는 리얼베이직에서 데이타베이스를 생성하고 검색하기 위해 필요한 RecordSet 클래스나 DatabseRecord 클래스에 대해서 공부를 할 것이며 MySQL 을 Mac OS X 에서 설치를 하고 리얼베이직에서 다루는 것에 대해서 실습을 할 것입니다. 그 이후에는 제대로 된 예제를 통해서 주소록 프로그램을 만들어 보려고 합니다.



다음글 - 18회. Database -2-
현재글 - 17회. Database -1-
이전글 - 16회. 리얼베이직의 기초 -14- 네트웍