[FireDAC Skill Sprints] 1. FireDAC 동영상과 샘플로 고급기능 활용하기

2015.03.24 16:47

엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


1회차에서는 FireDAC을 소개하고 연결하는 과정으로 진행합니다.

FireDAC 소개

FireDAC은 델파이와 C++빌더에서 멀티-디바이스 데이터베이스 애플리케이션을 개발할 수 있는 범용(Universal) 데이터 엑세스 컴포넌트입니다. 


FireDAC은 통합 API를 사용해 다양한 데이터베이스를 동일한 코드로 제어할 수 있습니다. 그렇기 때문에 개발자는 데이터베이스를 신경쓰지 않고 애플리케이션 개발에 집중할 수 있고, DBMS 변경 시 대부분의 코드를 재사용할 수 있습니다. 그 뿐아니라 FireDAC은 데이터베이스 별 고유기능을 사용하고, 최적의 성능을 발휘할 수 있도록 데이터베이스 별 네이티브 드라이버를 지원합니다.


또한 기술적으로 아래의 장점을 제공합니다.

  • 30배 빠른 데이터 입력이 가능한 Array DML
  • DBMS의 사용내역을 추적하고 모니터링
  • 엑셀형식으로 내보내고, 가져오기 기능을 개발할 수 있는 Batch Move
  • DB에서 가져온 메모리상의 데이터를 대상으로 쿼리할 수 있는 Local SQL
  • 이 외의 기술적인 장점은 아래의 FireDAC Skill Sprints 동영상과 샘플로 고급기능 활용하기 시리즈로 직접 확인하시기 바랍니다. 


FireDAC의 자세한 소개는 데브기어 FireDAC 소개페이지와 FireDAC 기술문서 - Overview를 참고할 수 있습니다.

FireDAC Skill Sprints 동영상과 샘플로 고급기능 활용하기

2. FireDAC으로 DBMS 사용 내역 추적, 모니터링 하기

FireDAC 추적기능을 이용하면 애플리케이션과 데이터베이스 사이의 통신내용을 상세하게 보거나 기록할 수 있습니다. 이 추적 정보에는 이벤트 발생시간, API 호출내역, DB로 전송된 SQL 문, 파라메터와 필드 값, 오류와 경고 등이 기록되어 여러분의 DB 애플리케이션의 문제점을 디버깅하고 해결하는데 유용하게 사용할 수 있습니다.


샘플에서는 데이터 조회(테이블 오픈) 시 애플리케이션과 DBMS의 통신내용을 모니터링 유틸리티(FireDAC Monitor)로 확인하고, DB 애플리케이션 디버깅 시 유용한 메터데이터(DBMS 객체 정보)를 이용해 테이블, 필드, 제너레이터, 스토어드 프로시저 목록을 조회해 봅니다.

3. 캐쉬를 이용한 업데이트와 자동증가필드(Identity) 적용

캐쉬 업데이트는 애플리케이션의 메모리 영역(즉, 데이터셋)에 업데이트 내역을 기록하고, DBMS에 한번에 업데이트(또는 일괄취소) 할 수 있는 기능입니다. 

캐쉬 업데이트를 사용하면 작업내용을 로컬에서 관리하므로 DBMS와의 트래픽을 줄일 수 있고, 사용자는 통신속도와 관계없이 빠른 작업이 가능합니다. 그리고 작업이력을 확인(변경된 레코드 조회, 변경된 항목의 이전 값 확인 등)하고, 작업 변경취소(마지막 작업 변경취소, 선택한 레코드 변경취소 등)을 FireDAC에서 제공하는 메소드를 이용해 손쉽게 구현할 수 있습니다.


샘플에서는 캐쉬 업데이트를 이용해 조회한 데이터를 메모리 상에서 편집(입력, 수정, 삭제) 후 업데이트 목록 표시, 변경취소, 일괄적용/취소 기능을 구현해 봅니다.

Array DML은 DBMS에 업데이트할 데이터를 배열 형태의 파라메터로 한번에 전송해 아주 빠르게 데이터를 입력할 수 있는 기능입니다.

Array DML을 사용하면 DBMS와 애플리케이션 사이의 통신비용을 줄이고 DBMS에 전송하는 요청 횟수를 현격히 줄입니다. 그 결과 실행 속도를 대폭 향상시킬 수 있습니다.

예를 들면, 1만건의 데이터 입력 시 반복 입력 작업을 트랜젝션으로 묶으면 20배 빨라지고, Array DML을 사용하면 다시 10배가 더 빨라집니다. 샘플을 통해 결과를 직접 확인해 보기 바랍니다.

FireDAC에는 검색옵션, 형식옵션, 업데이트옵션, 리소스옵션, 트랜젝션옵션 등의 수많은 옵션을 제공합니다.

이 글에서는 주요 옵션을 살펴봅니다. 주요 옵션을 살펴보고 필요한 옵션은 상세확인 해 여러분의 애플리케이션을 향상해 보기 바랍니다.


샘플에서는 데이터 지연 조회(DetailDelay), 데이터 페이징 단위 조회(RecsSkip, RecsMax)과 같은 고급 기능을 FireDAC 옵션을 이용해 손쉽게 구현해 봅니다.

커맨드 텍스트 전처리는 SQL 명령을 데이터베이스에 전달하기 전 파라메터를 치환하고, FireDAC 매크로 함수를 DBMS에 맞도록 치환하는 기능입니다.

전처리 기능은 아래 3 종류의 매크로 명령을 제공합니다.

  • 매개변수를 확장할 수 있는 대체변수
  • 한번 작성 후 다양한 DBMS에서 사용할 수 있는 SQL문 작성하는 이스케이프 시퀀스
  • 연결된 DBMS에 따라 조건부로 실행되는 SQL문을 작성하는 조건부 대체 

샘플에서는 매크로 대체변수를 이용해 데이터 탐색기를 만들고, 이스케이프 시퀀스로 작성된 통합 SQL문이 실제 DBMS에 전달 시 어떻게 변환되는지 확인해 봅니다.

FireDAC의 ETL은 Extract, Transform, Load의 약자로 아래의 역할을 의미합니다. 

  • Extract(추출) : 같은 종 또는 이기종 데이터 소스로부터 데이터를 추출 
  • Transform(변환) : 추출한 데이터를 분석용 데이터 형식 또는 입력쿼리로 변환
  • Load(로드) : 최종 목적(데이터베이스, 운용 데이터 저장소, 데이터 마트, 또는 데이터 창고)으로 로드 

FireDAC ETL로 아래의 기능을 구현할 수 있습니다.(몇가지 예시입니다.) 

  • Query문으로 조회한 데이터를 엑셀에서 사용할 수 있는 CSV 파일로 내보내기
  • 텍스트파일의 데이터를 데이터베이스 테이블로 가져오기
  • 데이터베이스에서 다른 데이터베이스로 데이터 이동하기

샘플에서는 위 3가지 기능을 직접구현해 봅니다. 컴포넌트 구성과 컴포넌트 속성을 참고할 수 있습니다.

8. TFDMemTable: 메모리 기반 데이터셋 사용하기

TFDMemTable은 메모리 기반 데이터셋입니다. 즉, 데이터베이스 연결 없이 파일 데이터나 코드로 추가한 데이터를 메모리에 올려 데이터셋의 기능(필터링, 정렬 등)을 사용할 수 있습니다.


TFDMemTable은 아래 기능을 할 수 있습니다.

  • 디자인타임과 런타임 시 파일 불러오기(Load File), 파일로 내보내기(Save File), 다른 데이터셋의 데이터가져오기(Assign Data) 기능 사용
  • 런타임 시 파일과 스트림으로 데이터 내보내기, 불러오기 기능을 사용할 수 있으며, JSON, XML, Binary 포맷 선택 가능
  • 멀티티어 애플리케이션(REST 클라이언트, 데이터스냅 등)에서 수신 데이터를 보관하는 데이터셋 역할
  • 내부에서 데이터 보관할 시 컬랙션객체(TList, TStringList) 대신 메모리테이블 사용 시 데이터셋의 기능(UI 컨트롤에 데이터바인딩, Local SQL, 필터링, 정렬 등)을 사용해 다양한 기능 손쉽게 구현가능
  • Local SQL을 이용해 메모리테이블(데이터셋)에서 쿼리 실행
  • ETL 기능으로 다른 데이터소스(텍스트, CSV 등)에서 가져온 데이터 보관

Local SQL은 DB로부터 애플리케이션의 메모리 상으로 가져온 데이터(데이터셋: TDataSet을 상속받은 객체)를 대상으로 다시 SQL 쿼리를 할 수 있는 기능입니다. Local SQL은 아래와 같이 사용할 수 있습니다. 

  • 여러 이기종 DB들에 대한 쿼리 : 다양한 DB에서 가져온 여러 데이터셋을 대상으로 원하는 데이터 쿼리(조인 가능) 
  • 인 메모리 데이터베이스 : TFDMemTable은 메모리상에 있는 데이터셋의 역할 
  • 오프라인 모드 쿼리 : 원격 DB에 연결할 수 없는 경우에도, 이미 가져온 데이터셋을 대상으로 쿼리 실행 
  • 데이터스냅 클라이언트 쿼리 : 데이터스냅 서버(미들웨어)에서 받아온 데이터셋을 대상으로 쿼리 실행 
  • 간편한 마이그레이션 : 애플리케이션 내에서 써드파티를 통해 가져온 데이터셋 객체를 대상으로 쿼리 실행
샘플에서는 Local SQL을 이용해 dbExpress, REST Client, 메모리테이블 등 총 5종류의 이기종의 데이터셋을 조인한 데이터를 그리드에 출력합니다.

10. BDE 프로젝트를 FireDAC으로 마이그레이션 하기

(준비 중)


관련링크



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 데이터 엑세스 FireDAC, Skill Sprints

[FireDAC Skill Sprints] 5. Cascading Options: 고급기능을 활용 할 수 있는 FireDAC 옵션

2015.03.11 14:22

엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


5회차에서는 FireDAC의 캐스캐이딩 옵션에 대해 소개하고 살펴봅니다.

FireDAC 캐스캐이딩 옵션

FireDAC에는 5종류의 옵션 그룹을 제공합니다.

  • FetchOptions : DBMS에서 데이터를 어떻게 취득할지 제어하는 검색 옵션입니다.
  • FormatOptions : DBMS의 데이터형식을 FireDAC 데이터 형식으로 또는 반대로 매핑하는 방법을 제어하는 형식 옵션입니다.(자세한 내용은 "Data Type Mapping"을 참조하세요.)
  • UpdateOptions : DBMS에 업데이트 전송 방법을 제어하는 업데이트 옵션입니다. 업데이트 시 테이블의 모든 필드를 업데이트하거나 변경된 필드만 업데이트 할 수 있습니다.
  • ResourceOptions : 시스템 리소스 사용과 데이터셋의 지속성을 제어하는 자원 옵션입니다. 예를 들면 FireDAC Phys 레이어 명령을 비동기 적으로 실행 또는 차단할 수 있습니다.
  • TxOptions : 트랜젝션 실행방법을 제어하는 트랜젝션 옵션입니다. 


위의 옵션은 Manager > Connection > DataSet/Command로 캐스캐이딩(위에서 아래로 적용) 됩니다. 즉, TFDConnection에 옵션을 설정하면 해당 연결을 사용하는 TFDQuery, TFDTable도 동일한 옵션이 적용됩니다.(일부 옵션 제외)

FireDAC 카테고리 별 주요옵션

다음은 FireDAC 주요옵션을 카테고리별로 나열한 것입니다. 각 옵션에 대한 자세한 내용은 항목 아래 기술문서 링크에 방문해 상세 설명을 보시기 바랍니다.


검색옵션(FetchOptions)

  • 취득 방법 ( CursorKind , Mode , RowsetSize ). 예를 들어, 결과 세트의 모든 레코드를 한 번에 검색 할 수 주문형 레코드를 검색 할 수 있습니다. 
  • 자원 보존 방법 ( Unidirectional , AutoClose , Cache , AutoFetchAll ). 
  • BLOB 필드 중첩 된 레코드 메타 데이터 검색 및 캐시 방법 ( Items , Cache ). 
  • 마스터/디테일 데이터셋 관계의 처리 방법 ( DetailDelay , DetailOptimize , DetailCascade ). 
  • 행 집합 페이징 ( RecsMax , RecsSkip ). 
  • TFDTable 작동 모드 ( CursorKind , LiveWindowParanoic , LiveWindowFastFirst ). 
  • 데이터 집합의 레코드를 세는 방법 ( RecordCountMode ).

TFDFetchOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDFetchOptions


형식옵션(FormatOptions)

  • 문자열 데이터 형식 ( StrsEmpty2Null , StrsTrim , StrsTrim2Len , InlineDataSize , MaxStringSize ) 
  • 숫자 데이터 형식 ( MaxBcdPrecision , MaxBcdScale , Round2Scale ) 
  • 시간 데이터 형식 ( Round2Scale ) 
  • 일반적인 데이터 형식 매핑 ( MapRules , OwnMapRules , DefaultParamDataType ). 예를 들어 NUMERIC (9, 0)의 열을 ftInteger 컬럼에 맵핑 할 수 있습니다. 
  • 필드 형식 ( FmtDisplayDateTime , FmtDisplayDate , FmtDisplayTime , FmtDisplayNumeric , FmtEditNumeric ) 
  • 데이터 집합의 정렬 ( SortLocale , SortOptions ) 
  • 식별자 따옴표 ( QuoteIdentifiers )

TFDFormatOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDFormatOptions


업데이트옵션(UpdateOptions)

  • 데이터 편집 허용 ( EnableDelete , EnableInsert , EnableUpdate , ReadOnly , CheckRequired , CheckReadOnly , CheckUpdatable ). 여기에는 TField.ReadOnly 과 TField.Required 도 영향을줍니다. 
  • 데이터베이스 레코드 잠금 ( LockMode , LockPoint , LockWait ). 
  • 자동 증가 필드에 대한 데이터베이스 생성기와 시퀀스의 사용 ( FetchGeneratorsPoint , GeneratorName ). 여기에는 TField.AutoGenerateValue 도 영향을줍니다. 
  • 업데이트 사후 명령의 생성 ( UpdateChangedFields , UpdateNonBaseFields , UpdateMode , FastUpdates ). 여기에는 TField.ProviderFlags 과 TField.Origin 도 영향을줍니다. 
  • 데이터의 업데이트 ( RefreshMode , RefreshDelete ). 
  • 업데이트 포스트 결과 확인 ( CountUpdatedRecords ).

TFDUpdateOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDUpdateOptions


리소스옵션(ResourceOptions)

  • SQL 명령 텍스트 전처리 ( EscapeExpand , MacroCreate , MacroExpand , ParamCreate , ParamExpand , PreprocessCmdText , UnifyParams ). 
  • 명령의 준비 ( DirectExecute , DefaultParamType ). 
  • 명령 실행 ( CmdExecMode , CmdExecTimeout , ArrayDMLSize ). 
  • 자원 관리 ( SilentMode ). 
  • 데이터 집합 지속성 ( Persistent , Backup , BackupExt , BackupFolder , DefaultStoreExt , DefaultStoreFolder , DefaultStoreFormat , StoreVersion , StoreItems ).

TFDResourceOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDResourceOptions


트랜젝션옵션(TxOptions)

  • 독점적 수준 ( Isolation ) 
  • 업데이트 기능 ( ReadOnly ) 
  • 자동 커밋 ( AutoCommit , AutoStart , AutoStop , StopOptions ) 
  • DBMS 고유의 파라미터 ( Params ) 
  • 액션 연결 해제 ( DisconnectAction ) 중첩 ( EnableNested )

TFDTxOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDTxOptions

FireDAC 옵션 샘플프로그램

이 샘플에서는 FetchOptions을 이용해 아래 3가지 기능을 구현했습니다.

  • 테이블에 데이터가 많은 경우 신속하게 화면에 표시하기 위해 데이터를 나눠서 가져오기(FetchOptions.RowsetSize, FetchOptions.Mode 이용)
  • 데이터를 페이징 단위(중간의 데이터 만)로 조회(FetchOptions.RecsSkip, RecsMax 이용)
  • 마스터/디테일 형식의 화면에서 키보드로 목록을 빠르게 움직여도 마지막에 위치한 상세정보만 표시해 불필요한 데이터 조회 방지(FetchOptions.DetailDealy 이용)

[샘플코드 받기 - 데브기어 github 페이지]


데이터를 지정건수 만큼 나눠서 가져오는 기능
데이터가 많은 경우 전체 데이터를 가져와 화면에 표시하는 것 보다 부분적으로 표시하고 추가로 데이터를 표시하는 것이 효과적일 수 있습니다.
FireDAC에서는 FetchOption의 Mode와 RowsetSize를 설정해 해당 기능을 구현할 수 있습니다. 다음 데이터목록을 가져오려면 TFDQuery.FetchNext 메소드를 호출합니다.
  qryEmployee.Close;
  if TCheckBox(Sender).Checked then
  begin
    qryEmployee.FetchOptions.RowsetSize := 3;
    qryEmployee.FetchOptions.Mode := TFDFetchMode.fmManual;
  end
  else
  begin
    qryEmployee.FetchOptions.Mode := TFDFetchMode.fmOnDemand;
  end;
  qryEmployee.Open;
  btnFetchNext.Enabled := TCheckBox(Sender).Checked;

데이터 페이징 단위로 조회 기능
페이징 단위로 데이터를 조회할 수 있습니다. DBMS 자체에서 Top, Limit 명령을 통해 쿼리로 수행하던 기능을 FireDAC 컴포넌트로 구현할 수 있습니다.
  qryEmployee.Close;
  qryEmployee.FetchOptions.RecsSkip := 10;
  qryEmployee.FetchOptions.RecsMax := 10;
  qryEmployee.Open;

상세 데이터 조회지연 기능 구현
사원정보(qryEmployee)와 사원이 진행한 프로젝트(qryProject)로 목록/상세 기능 구현 후 체크박스(chkFetchRowsetSize) 체크 시 DetailDelay 옵션으로 지연 조회 하도록 설정
  if TCheckBox(Sender).Checked then
    qryProject.FetchOptions.DetailDelay := StrToIntDef(Edit1.Text, 300)
  else
    qryProject.FetchOptions.DetailDelay := 0;

관련 링크



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 데이터 엑세스 Cascading Options, FetchOption, FireDAC, Skill Sprints