LazarusCompleteGuide:12.4

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

라자루스 데이터 데스크톱

앞에서는 데이터를 처리해야 하는 최종 소비자 라자루스 애플리케이션을 어떻게 프로그램화하는지를 살펴보았다. 그러한 애플리케이션을 개발하기 위해서는 데이터베이스를 생성, 설계, 이동시켜야 한다. 데이터베이스 애플리케이션의 생성에는 반복되는 작업이 수반된다. 동일한 데이터에 다른 방식으로 접근하는 폼을 여러 번 생성할 경우, 동일한 작업을 반복하기에 이른다: 디스플레이 이름을 설정하고, 필드 크기를 설정하고, 컨트롤에 힌트를 제공하는 등의 작업 말이다. 데이터베이스 내의 모든 테이블과 필드에 대한 이러한 프로퍼티들의 값은 하나의 구조, 즉 데이터 사전이라 불리는 구조로 넣을 수 있다. 이것은 모든 시각 디자인 정보를 보유하고 IDE에서 또는 런타임 시 적용한다. 데이터 사전은 원할 경우 데이터베이스의 재생성 또는 리모델링에 사용할 수도 있다.


라자루스 데이터 데스크톱은 데이터 사전 관리자와 데이터 접근 툴로서 이중 작업을 실행하도록 설계되었다. 그에 더해 오브젝트 파스칼 코드를 생성하여 데이터베이스를 관리 및 접근하는 기능, 라자루스 IDE와의 통합 기능도 덤으로 가진다-데이터 데스크에서 생성된 데이터 사전은 IDE 내부에서 접근 가능하며, 어떤 TDataset 자손으로든 적용 가능하다.


라자루스 데이터 데스크톱은 (때로는 데이터베이스 데스크톱이라 불림) 아래의 기능을 제공한다:

  • FPC가 지원하는 다수의 데이터베이스로 접근: DBF 파일, MySQL, Firebird, Oracle, PostGreSQL, SQLite, ODBC가 지원되는 모든 데이터베이스.
  • 모든 TField 프로퍼티를 저장할 수 있는 데이터베이스를 위한 데이터 사전의 생성.
  • .ini 파일 또는 데이터베이스에 데이터 사전 저장.
  • 데이터 사전으로부터 DDL과 DML SQL 문을 생성.
  • 테이블 데이터의 검사.
  • 어떤 쿼리든 실행하고 결과를 검사하는 기능.
  • 다수의 포맷으로 데이터 내보내기 기능. 예: XML, JSON, RTF, 평문 (CSV), DBF, SQL.
  • 데이터세트로부터 코드 생성. 쿼리에서 얻은 데이터에 일치하는 객체를 생성하고, 쿼리로부터 그 객체의 프로퍼티를 로딩하기 위한 코드를 생성할 수 있다. OPF를 (객체 지속성 프레임워크)를 이용하는 사람들을 위한 특별 보너스로, tiOPF 코드를 생성하는 기능이 있다.


이 모든 기능은 프리 파스칼 코드 베이스에 이미 존재하며, 그 중 대부분은 라자루스 IDE 자체에서도 컴포넌트 팔레트를 통해 이용 가능하다. 데이터 데스크톱은 일상적인 데이터베이스 프로그래밍 작업을 처리하도록 고안된 툴에 이러한 기능을 표시할 뿐이다.


이러한 작업을 모두 관리하는 API는 확장 가능하게 설계되었기 때문에 프로그래머의 프로젝트 요구조건에 맞도록 확장할 수 있다. 실행해야 하는 것에 따라 새 클래스를 쓰고 등록하거나, 기존 클래스를 향상시키는 것이 가능하다. 데이터 데스크톱의 소스 코드는 라자루스에 딸려 오기 때문에 본인이 추가하고자 하는 향상된 기능으로 재컴파일 가능하다.


라자루스 데이터 데스크톱은 계속 개발 중이며 그것이 사용하는 API들 역시 마찬가지다. 가장 최근에 개선된 점을 활용하는 최고의 방법은 SVN에서 최신 버전을 재컴파일하는 것이다. 이는 tools/lazdatadesktop 디렉터리에 위치한다. 컴파일을 위해선 여러 라자루스 패키지가 필요하다:

패키지 설명
lazDBF DBF 지원용.
lazSQLDB 앞서 설명하였듯이 SQLDB 지원용.
lazDataDict 데이터 사전의 IDE로 통합용.
lazDBExport 내보내기 컴포넌트(export component)용. 해당 컴포넌트들은 컴포넌트 팔레트의 Data Export 탭에 표시된다.
RuntimeTypeInfoControls RTTI 컨트롤용. API와 데이터 사전 에디터가 해당 패키지를 독점적으로 사용한다.
표 12.23: 라자루스 패키지


위의 패키지들은 IDE에 설치될 필요는 없으나 설치한다면 컴파일 시 필요한 유닛의 경로가 컴파일러 경로로 추가되도록 보장할 수 있다. lazdatadesktop 프로젝트를 열고 컴파일할 경우 바이너리 작업(working binary)을 야기한다. 라자루스 데이터 데스크톱이 시작되면 그림 12.15와 같은 폼이 나타날 것이다.

그림 12.15: 라자루스 데이터 데스크톱의 시작 모습


시작 시 최근에 사용한 데이터 사전 (첫 번째 탭) 또는 데이터베이스 연결의 (두 번째 탭) 리스트가 표시된다. 엔트리를 더블 클릭하면 새 탭에서 열릴 것이다. Connections를 이용해 데이터베이스 내 테이블의 데이터와 구조를 보면서 데이터베이스로 연결할 수 있다. 데이터베이스가 SQL 기반일 경우 쿼리문을 데이터베이스에서 실행할 수 있다. 쿼리의 결과를 볼 수 있으며, 지원하는 내보내기 포맷(export format) 중 하나로 내보낼 수도 있다.


데이터 사전

데이터 사전은 데이터베이스에 대한 일종의 메타 데이터베이스에 속하는, 데이터베이스에 관한 메타 정보를 저장하는 장소로, 데이터베이스의 기본 구조를 (데이터베이스 스키마) 완전히 설명한다. 구체적으로 말하자면 다음과 같은 정보를 보유한다: 각 테이블에 모든 필드와 테이블의 리스트, 테이블의 모든 색인. 데이터 사전은 필드의 내용을 어떻게 표시해야 하는지 결정하는 확장된 필드 속성들도 포함한다: 소수점(decimals) 수, 통화 포맷, 필드를 표시하는 컨트롤에 표시할 힌트 등. 데이터 사전은 여전히 개발 중이며, 추후 여러 종류의 정보, 즉 도메인, 뷰(view), 트리거, 시퀀스, 저장된 프로시저 등의 정보를 관리하도록 확장될 것이다.


구조화된 형식으로 이러한 메타 정보를 이용하도록 만들 경우 여러 목적에 부합된다:

  • 런타입 시에 필드와 폼 프로퍼티를 설정하기 위해 라자루스 프로그램 내부로부터 데이터 사전으로 접근이 가능하지만 (예: ad-hoc 쿼리), 설계 시 라자루스 IDE에서 적용할 수도 있다.
  • 데이터베이스를 생성 시 이용할 수 있다: 데이터 사전은 구조를 설명하는 데이터베이스를 재생성시키는 SQL문을 생성할 수 있다.
  • 두 개의 데이터 사전을 비교할 수 있고, 차이점을 이용해 업데이트 스크립트를 생성할 수 있다.
그림 12.16: 라자루스 데이터 사전 에디터


데이터 사전은 처음부터 생성할 수도 있지만 기존 데이터베이스로부터 역설계(reverse-engineer)될 수도 있다. 새 데이터 사전을 생성하려면 File ▷ New 메뉴를 사용한다. 아니면 Dictionary ▷ Import 메뉴를 이용해 데이터베이스를 역설계하고 새 데이터 사전을 생성하거나, 기존의 것을 업데이트할 수 있다. dBase 파일 'contents.dbf' 를 가져올 경우 이는 새 데이터 사전을 유도하여 'dictionary'와 같은 이름으로 저장할 수 있다. 데이터 구조로 된 트리를 확장하고 나면 필드 정의 리스트가 보인다.


데이터 사전의 이용은 꽤 쉽다. 창 좌측 부분에서는 데이터 사전이 이용 가능한 객체를 모두 트리뷰로 표시한다. 항목을 선택하면 선택된 항목의 프로퍼티를 우측에 위치한 오브젝트 인스펙터 격자(grid)에 표시할 것이다. 트리와 오브젝트 인스펙터의 크기는 중앙에 스플리터(splitter) 컨트롤을 이용해 조정할 수 있다.


툴바에 있는 버튼들을 이용해 새 객체를 추가하거나 기존에 있던 객체를 삭제할 수 있다. 최근에는 테이블 필드나 색인도 같은 방식으로 생성(또는 제거)할 수 있다. 테이블의 경우, 테이블 이름과 주요 키 상수 이름을 편집할 수 있다. 필드의 경우, 색인과 마찬가지로 모든 필드 프로퍼티를 설정할 수 있다. 테이블 정의에서 필드를 선택하면 화면 오른쪽에 필드의 프로퍼티들을 표시할 것이다. 이를 편집할 수 있는데, 메인 폼은 그림 12.16과 비슷한 모양을 할 것이다. 모든 필드에 정보를 입력하는 것은 엄청나게 수고스러운 일이다. 데이터 사전의 장점은 이 작업을 한 번만 실행하여 그 정보를 다른 곳에서 여러 번 이용할 수 있도록 허용하는 데에 있다.


데이터 사전에 정보가 완성되면 라자루스 애플리케이션에서 이용할 수 있다 (설계 시 또는 런타임 시). SQL 문을 생성하거나 데이터 사전으로부터 코드를 생성할 때 (예: 쿼리의 결과에 대한) 이용할 수도 있다.


사전으로부터 SQL 생성하기

SQL 문의 생성은 [Generate SQL] 버튼 또는 메뉴 항목으로 실행할 수 있다. 클릭하면 델파이의 UpdateSQL 컴포넌트 에디터의 확장된 버전과 비슷한 모양의 대화창이 뜰 것이다. 이 대화창을 이용해 데이터 사전 내 어떤 테이블에서든 데이터를 선택, 업데이트, 삭제, 삽입하기 위한 SQL 문을 생성할 수 있다. 생성된 SQL 문의 형태를 미세하게 조정하기 위해 여러 개의 옵션이 제공된다. 또한 SQL에 테이블의 (또는 그 일부를) 재생성을 위한 SQL 문을 생성 시에도 이용할 수 있다. 이러한 구문들은 자신의 애플리케이션으로 복사가 가능한데, 예를 들어, TSQLQuery 컴포넌트의 다양한 프로퍼티로 복사할 수 있겠다.


그림 12.17은 다양한 필드가 선택된 SQL 생성 대화창을 보여준다.

그림 12.17: 데이터 사전으로부터 SQL 생성하기


아래 SQL 문으로 SQL 기반의 데이터베이스에 Toolbox로부터 내용 테이블을 생성할 수 있다:

CREATE TABLE CONTENTS (
   EDITION VARCHAR(10),
   REMARK VARCHAR(74),
   NAME VARCHAR(30),
   SECTION VARCHAR(30),
   PAGE VARCHAR(3),
   LANGUAGE VARCHAR(30),
   THEME VARCHAR(30),
   TITLE VARCHAR(74),
   TXINDEX VARCHAR(14),
   SUBTITLE VARCHAR(74),
   FIRSTNAME VARCHAR(30),
   CONSTRAINT CONTENTS_PK PRIMARY KEY (EDITION))


아래 코드는 라자루스 애플리케이션에서 런타임 시 데이터 사전을 사용하는 방법을 보여준다:

uses fpdatadict,dbf,db;

  var DD  : TFPDataDictionary; DBF : TDBF;
begin
  DD := TFPDataDictionary.Create;
  DD.LoadFromFile('toolbox.fpd');
  DBF := TDBF.Create(Nil);
  DBF.TableName := 'inhalt.dbf';
  DBF.Open;
  DD.Tables.TableByName('inhalt.dbf').ApplyToDataset(DBF);
  // Alternatively
  // DD.ApplyToDataset(DBF);
end.


위의 코드는 데이터 사전 인스턴스를 생성하여 파일로부터 그것을 로딩할 것이다. 이후 DBF 파일을 로딩하고, 데이터 사전을 그 파일에 적용할 것이다. 그 결과 DisplayName 이나 DisplaySize와 같은 프로퍼티들이 채워질 것이다. 데이터가 격자에 표시되면 적절한 열 크기와 제목이 자동으로 표시된다. 데이터 사전을 런타임 시 적용하는 대신 라자루스 IDE에서 설계 시 적용하는 것도 가능한다. lazDataDict 패키지가 설치된 경우 IDE는 3가지 방식으로 확장될 것이다:

  1. Data Dictionary 메뉴 항목이 Project 메뉴에 등록되어, 프로젝트에 대한 데이터 사전을 선택하고 구성하도록 해준다. 데이터 사전의 이름은 프로젝트 옵션을 이용해 저장될 것이며, 다음에 프로젝트가 로딩될 때 데이터 사전이 재로딩될 것이다.
  2. Database Desktop 메뉴 항목이 라자루스 데이터 데스크톱을 시작하는 Tools 메뉴 하에 생성된다. 처음 사용할 경우 라자루스 데스크톱 애플리케이션이 어디에 위치하는지 질문할 것이다.
  3. 폼 디자이너에서 Data dictionary 메뉴가 컨텍스트 팝업 메뉴에 등록되어, 데이터 사전을 원하는 TDataset 자손으로 적용 시 사용할 수 있다. 분명한 것은 다음 조건이 충족되었을 시에만 작동할 것이라는 점이다: 데이터세트에 대해 지속성 필드가 생성되었으며 (이를 위해 Fields Editor를 사용한다), 현재 프로젝트에 대한 데이터 사전이 선택되었다.


데이터베이스로 연결하기

데이터 데스크톱은 기존 데이터베이스로 연결하도록 해주고 그들의 테이블에 있는 데이터를 검사하도록 해주는 (또는 SQL 활성화된 데이터베이스의 경우 테이블에서 쿼리를 실행하도록) 기능을 추가로 제공한다. FPC가 지원하는 모든 데이터베이스로 연결할 수 있다. 필요한 것은 데이터 사전 엔진에 데이터베이스 지원을 등록하는 작은 클래스로 충분하며, 데이터 데스크톱은 그것을 집어 연결 타입을 제공할 것이다. 데이터베이스로의 연결은 Connection→New 메뉴 항목을 통해 이루어진다. 이 항목 아래에는 지원되는 연결 타입의 리스트가 표시된다. 타입을 선택하면 연결 파라미터가 주어지고, 연결을 성공적으로 구축하고 나면 데이터베이스 내용이 표시된 새 탭이 나타난다. DBF 파일로 데이터베이스에 연결하기 위해서는 DBF 파일의 디렉터리가 입력되어야 한다. 따라서 Toolbox 데이터베이스로 연결하기 위해서는 새 'DBF Files' 연결이 시작되어야 함과 동시 DBF 파일을 선택되고, 연결은 Toolbox 라는 이름, 즉 데이터 디렉터리의 이름으로 저장된다. 그 결과 그림 12.18과 같은 화면이 나타날 것이다.

그림 12.18: 툴상자 내용


창의 우측은 좌측에서 선택한 객체의 정의를 표시하는 작업 영역이거나, (테이블의 경우에는) 테이블의 내용을 표시한다. 테이블 데이터는 원한다면 편집이 가능한데, 데이터 데스크톱을 애플리케이션을 위한 테스트 데이터의 생성 시 이용할 수도 있기 때문이다. 하지만 더 광범위한 기능들도 있다. Data 뷰는 검색 버튼 외에도 두 개의 추가 버튼을 가진다. 하나는 데이터를 다양한 저장 포맷으로 내보내도록 해준다. 최근에는 총 8개의 포맷을 이용할 수 있다 (아래 참고). 나머지 버튼은 표시된 데이터를 바탕으로 다양한 종류의 오브젝트 파스칼 코드를 생성하도록 해준다. 최근에 생성 가능한 코드로는 4가지 유형이 있다.


데이터 내보내기

표시된 데이터는 다음 포맷으로 내보내기(export) 할 수 있다: CVS (콤마로 구분된 값) 텍스트 파일; 고정된 길이의 텍스트 파일; 단순한 XML 파일; 단순한 JSON 파일; 테이블을 표시된 데이터로 채우기 위한 SQL문; LaTeX 테이블; RTF 테이블과 DBF 파일. 그리고 더 많은 포맷이 계획 중이다. 이 기능은 데이터를 어떤 포맷에서 다른 포맷으로 변형 시 적합하다. 내보내기 메커니즘 리스트는 본인이 작성한 익스포터(exporter)를 이용해 쉽게 확장 가능하다. 이를 위한 API는 프리 파스칼 소스 코드에 있다. 관련 유닛은 fpdbexport라 불리며, 자신만의 커스텀 익스포트 메커니즘(export mechanism)을 작성할 예정이라면 이용할 수 있는 예제들도 많다.


익스포트 메커니즘을 예제 데이터로 적용할 수 있다: XML 내보내기 포맷은 그림 12.19에 표시된 내보내기 구성 대화창을 유도할 것이다. 좌측으로는 내보낼 수 있는 필드 리스트가 표시된다. 어떤 필드든 비활성화시켜 내보내기에서 제외시킬 수 있다. 우측으로는 해당 필드에 대한 내보내기 옵션이 있는 작은 격자가 표시된다. XML의 경우, 내보내진 이름은 그 필드를 나타내는 데 사용된 XML 태그의 이름이 된다.

그림 12.19: 툴상자 내용 내보내기


두 번째 탭은 일반 내보내기 옵션을 몇 가지 표시한다. 이는 주로 출력의 포맷을 제어한다. 분명한 점은 옵션들이 내보내기 포맷마다 다르다는 점이다. 마지막으로, 파일명이 대화창 상단에서 채워지고, 그곳에서 주어진 파일명으로 데이터가 내보내진다. 익스포트 메커니즘은 라자루스 애플리케이션에서도 이용할 수 있다: lazDBExport 패키지를 설치 시 컴포넌트 팔레트의 Data Export 페이지로 수많은 컴포넌트가 추가될 것이다. 각 데이터 포맷마다 내보내기 컴포넌트, 그리고 추가로 내보내기 포맷마다 선택 및 구성 대화창을 표시하는 TFPDataExporter 컴포넌트도 애플리케이션에 컴파일되어 있을 것이다.


애플리케이션에 표준 내보내기 포맷을 등록하기 위해 TStandardExportFormats 컴포넌트가 제공된다. 해당 컴포넌트를 폼에 드롭하고, 간단한 프로퍼티를 설정하여 원하는 포맷을 최종 사용자가 이용할 수 있도록 만든다. 그 외 커스텀 메이드 포맷은 코드에 등록해야 한다.


Toolbox 애플리케이션을 이용해 이를 설명할 수 있겠다: TStandardExportFormats 컴포넌트와 TFPDataExporter 컴포넌트를 (DEToolbox로 명명) 드롭하기만 하면 된다. 이후 DEToolbox 컴포넌트의 Dataset 프로퍼티를 DBF 파일로 설정해야 한다. 마지막으로 아래 OnClick 핸들러로 BExport 버튼을 추가한다:

procedure TToolBoxForm.BExportClick(Sender: TObject);
begin
  DEToolbox.Execute;
end;


내보내기 기능을 데이터 인식 애플리케이션으로 추가하는 데에는 위의 코드면 충분하다!


데이터베이스 코드 생성하기

데이터 데스크톱이 제공하는 중요한 기능으로, 매우 단순한 코드부터 다양한 목적을 위한 복잡한 오브젝트 파스칼 코드까지 생성이 가능하다는 점을 들 수 있다. 이 코드는 다양한 장소에서 생성 가능하다:

  • 쿼리의 결과를 표시할 때.
  • 테이블 데이터를 검사할 때.
  • 데이터 사전에서 테이블 정의를 검사할 때.


모든 연산이 이러한 상황에서 모두 사용할 수 있는 것은 아니다. 최근에는 아래 유형의 코드를 생성할 수 있다:

  1. SQL 문을 오브젝트 파스칼 문자열 상수로 변형할 수 있다.
    쿼리의 결과를 보고 있을 때만 실행할 수 있다.
  2. 표시된 데이터를 저장하는 데에 사용할 수 있는 DBF 파일을 생성하도록 코드를 생성할 수 있다.
  3. 특정 데이터세트를 바탕으로, 데이터 내 필드에 일치하는 프로퍼티들을 가진 오브젝트 파스칼 클래스를 생성할 수 있다. 뿐만 아니라, 데이터세트로부터 프로퍼티를 로딩하는 코드도 생성할 수 있다.
  4. 데이터 내 필드에 일치하는 프로퍼티들이 있는 tiOPF 클래스 선언을 생성하고, 데이터베이스로 혹은 그로부터 클래스를 지속시키는 데에 필요한 방문자(visitor) 클래스를 생성할 수 있다.


이러한 코드 생성기(code generator)들은 기본적으로 프리 파스칼과 함께 배포된다. 내보내기 포맷과 마찬가지로, 시스템에 등록시킬 수 있는 커스텀 코드 생성기를 추가로 작성하는 것이 가능하다. Generate code 기능을 선택 시, 이용 가능한 코드 생성기의 선택이 표시되고, 생성기를 선택하면 내보내기 구성과 비슷한 구성 대화창을 볼 수 있을 것이다.


내보내기 기능과 마찬가지로 모든 코드 생성기는 라자루스 프로그램에서 이용할 수 있다. 최종 사용자 애플리케이션에 직접 유용하진 않지만 지원 툴을 작성해야 하는 작업의 수고를 덜어준다.


쿼리 실행하기

SQL 기반으로 된 데이터베이스에서 'Connection' 탭은 쿼리 에디터(Query Editor)를 표시하는데, 이는 쿼리를 생성하고 실행하는 데에 사용할 수 있다. 쿼리가 SELECT 쿼리일 경우 쿼리 결과가 표시될 것이며, 테이블 데이터를 볼 때와 동일한 내보내기 및 코드 생성 메커니즘을 이용할 수 있다.


쿼리 에디터는 현재 히스토리 리스트, 디스크에 쿼리 저장하기, 디스크로부터 쿼리 로딩하기를 제공하는데, 그림 12.20와 같은 모습일 것이다.

그림 12.20: 쿼리 에디터


쿼리 에디터에서 이용 가능한 추가 코드 생성기로 SQL문 상수의 생성을 들 수 있다. 쿼리 에디터에 아래의 쿼리를 입력하면:

SELECT
  SUM(TOTAL_VALUE), SALES_REP, FIRST_NAME, LAST_NAME
FROM  SALES  LEFT JOIN EMPLOYEE ON (EMP_NO=SALES_REP)
GROUP BY  SALES_REP, FIRST_NAME, LAST_NAME


이는 아래의 SQL 상수 선언을 유도하는데,

Const
 SQL = 'SELECT'+ sLineBreak
   +'  SUM(TOTAL_VALUE), SALES_REP, FIRST_NAME, LAST_NAME'+ sLineBreak
   +'FROM'+ sLineBreak
   +'  SALES'+sLineBreak
   +'  LEFT JOIN EMPLOYEE ON (EMP_NO=SALES_REP)'+ sLineBreak
   +'GROUP BY'+ sLineBreak
   +'  SALES_REP, FIRST_NAME, LAST_NAME';


위의 선언을 라자루스 IDE로 직접 복사 및 붙여넣기가 가능하다.