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


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


3회차에서는 FireDAC의 Cached Updates와 Auto-Inc Fields에 대해 진행했습니다.

캐쉬를 이용한 업데이트

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

캐쉬 업데이트를 사용하면 작업내용을 로컬에서 관리하므로 DBMS와의 트래픽을 줄일 수 있고, 사용자는 인터넷속도와 관계없이 빠르게 작업할 수 있습니다. 그리고 부가적으로 작업이력을 확인(변경된 레코드 조회, 변경된 값 확인 등)하고, 작업을 되돌리는 기능(최종작업 되돌리기, 선택 레코드 되돌리기 등)등을 제공되는 메소드를 이용해 손쉽게 구현할 수 있습니다.


캐쉬 업데이트를 적용하려면 데이터셋(예> TFDQuery, TFDTable)의 CachedUpdates 속성을 True로 설정합니다.


캐쉬 업데이트는 분산 캐쉬 업데이트 모드와 중앙 캐쉬 업데이트 모드를 제공합니다.

  • 분산 캐쉬 업데이트 모드 - 각 데이터셋이 다른 데이터셋과 관계없이 변경사항을 추적합니다.(기본 모드)
  • 중앙 캐쉬 업데이트 모드 - 여러 데이터셋을 단일 변경로그에 시간순으로 기록합니다.(중앙 캐쉬 업데이트 모드 자세히 보기)

캐쉬 업데이트 주요 메소드

다음은 캐쉬 업데이트에서 사용하는 주요 메소드입니다. 메소드에 대한 설명만 기록합니다. 메소드의 상세설명과 사용법은 FireDAC 기술문서 - Caching Updates(FireDAC) 를 참고하기 바랍니다.


업데이트 내역 추적

캐쉬 업데이트 사용 시 업데이트 내역을 추적할 수 있고, 변경을 취소할 수 있습니다.

  • UpdatesPending - 변경 로그가 있으면 True 를 반환합니다. 
  • ChangeCount - 변경된 레코드 수를 반환합니다.
  • UpdateStatus - 현재 레코드의 변경 유형을 반환합니다. 
  • FilterChanges - 레코드를 변경 유형으로 필터링 할 수 있도록합니다.
업데이트 취소
기존 변경을 취소하기 위한 프로퍼티와 메소드
  • SavePoint - 변경 로그의 현재 상태를 설정 / 가져옵니다. 
  • RevertRecord - 현재 레코드를 이전 상태로 되돌립니다. 
  • UndoLastChange - 마지막으로 수정 한 레코드로 이동하고 레코드를 이전 상태로 되돌립니다. 
  • CancelUpdates - 변경 로그에 포함 된 모든 레코드를 취소합니다.

업데이트 적용

캐쉬의 변경을 데이터베이스에 적용하려면 ApplyUpdates 메소드를 사용합니다. 레코드 적용 시 예외가 발생한 경우 그 예외는 레코드에 연결됩니다. 

ApplyUpdates 메소드는 다음 특징이 있습니다.

  • ApplyUpdates 시 예외를 발생하지 않고 리턴값으로 예외 수 반환
  • 트랜젝션으로 업데이트가 적용되지 않는다. 애플리케이션에서 ApplyUpdates로 적용해야 한다.
  • 즉시 업데이트와 데이터셋 처리 방식은 동일하다.
업데이트 이후 수정 된 레코드는 변경 로그가 남아 있어, 변경로그를 삭제하려면 CommitUpdates 메소드를 호출해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
FDQuery1.Append;
...
FDQuery1.Post;
FDConnection1.StartTransaction;
iErrors := FDQuery1.ApplyUpdates;
if iErrors = 0 then begin
  FDQuery1.CommitUpdates;
  FDConnection1.Commit;
end
else
  FDConnection1.Rollback;

캐시를 이용한 업데이트에 대한 자세한 내용은 FireDAC 기술문서 - Caching_Updates를 참고하기 바랍니다.

자동 증가 필드

FireDAC은 새로운 레코드 추가 시 자동증가 컬럼에 새로운 값을 할당 할 수 있습니다.(즉시 업데이트와 캐쉬 업데이트 모두에서 동작) 

DBMS의 자동 증가 필드는 다음과 같이 특수한 Identity(또는 유사한) 컬럼 데이터형식을 사용하거나 제너레이터(또는 시퀀스)와 테이블 트리거를 사용해 구현됩니다.

FireDAC에는 DBMS 별로 자동 인식 방식과 수동 지정 방식으로 처리해야 합니다.

DBMS 

자동증가 컬럼 구현 

 인식

 InterBase

 Generator와 BEFORE INSERT 트리거

 자동인식 및 수동 지정

 Microsoft SQL Server

 IDENTITY 데이터타입

 자동증가 데이터 형식으로 자동 인식

 Oracle

 시퀀스와 BEFORE INSERT FOR EACH ROW 트리거

 수동 지정

 MySQL

 AUTO_INCREMENT 데이터 타입

 자동증가 데이터 형식으로 자동 인식

 SQLite INTEGER PRIMARY KEY AUTOINCREMENT 데이터 타입

 자동증가 데이터 형식으로 자동 인식

- FireDAC 기술문서 참고 - http://docwiki.embarcadero.com/RADStudio/XE7/en/Auto-Incremental_Fields_(FireDAC)


자동 인식

FireDAC에서 자동 증가 데이터 형식 컬럼을 자동 인식하고 아래와 같이 설치됩니다.

  • TField.DataType = dtInt32 또는 dtUInt32의 경우 ftAutoInc (TFDAutoIncField), 그렇지 않은 경우는 수치 데이터 형 ftXxxx 중 하나 
  • TField.Required = False 
  • TField.ReadOnly = True 
  • TField.ProviderFlags = [pfInWhere] 또는 열이 기본 키 구성 요소의 경우 [pfInWhere, pfInKey]


수동 지정

다음 방법 중 하나를 사용해 자동 증가 모드를 수동으로 지정할 수 있습니다.
  • UpdateOptions.AutoIncFields 속성에서 자동 증가 컬럼을 설정
  • TFDAutoIncField를 직접 만듭니다.(컬럼이 ftAutoInc / ftInteger / ftLongWord 필드 형이여야 함)
  • TFieldAutoGenerateValue를 자동 증가 필드에 해당하는 arAutoInc로 설정(ProviderFlags, Required, ReadOnly 설정이 필요할 수 있음)
자동 증가 필드 사용에 대한 자세한 내용은 FireDAC 기술문서 - Auto-Incremental Fields를 참고하기 바랍니다.

캐쉬 업데이트 샘플 프로그램 소개

이 샘플에서는 캐쉬 업데이트를 적용해 아래 기능이 구현되어 있습니다.

  • 변경내용 일괄적용 / 일괄취소
  • 변경이력(캐쉬) 보기 / 변경 전의 값 확인
  • 마지막 / 선택 레코드 변경 취소
  • 저장 지점 생성(등록) / 되돌리기
그리고 인터베이스 DB에서 자동증가 설정(Generator & Trigger 이용) 되어 있는 SQL 컬럼을 사용할 수 있도록 설정되어 있습니다.

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


자동증가 설정(데이터모듈 생성 시)

데이터베이스와 연결된 상태에서 데이터셋(TFDQuery, TFDTable)에서 필드를 추가합니다.

(모든 필드 추가 : 데이터셋 컴포넌트 > 우측 마우스 메뉴 > Fields Editor > 우측 마우스 > Add all fields)

자동 증가 컬럼(SEQ) 선택 후 AutoGenerateValue 속성을 arAutoInc로 설정합니다. 
코드로 진행 시 아래와 같습니다.

SEQ(자동증가 컬럼) 선택 후 AutoGenerateValue 속성을 arAutoInc로 설정합니다. 아래의 코드로 설정 가능합니다.

1
2
3
4
5
6
7
8
9
10
procedure TDM.DataModuleCreate(Sender: TObject);
begin
  // Auto-Inc 설정
  FDQuery1SEQ.AutoGenerateValue := arAutoInc;
  FDQuery1SEQ.Required := False;
  FDQuery1SEQ.ReadOnly := True;
 
  // CachedUpdates 설정
  FDQuery1.CachedUpdates := True;
end;

캐쉬 업데이트 - 일괄적용 / 일괄취소

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm2.btnApplyUpdatesClick(Sender: TObject);
var
  iErr: Integer;
begin
  DM.FDConnection1.StartTransaction;
 
  // ApplyUpdates는 오류를 발생하지 않음
  iErr := DM.FDQuery1.ApplyUpdates(-1);
  if iErr = 0 then
  begin
    DM.FDQuery1.CommitUpdates; // 변경로그 지우기
    DM.FDConnection1.Commit;
  end
  else
    DM.FDConnection1.Rollback;
 
  DM.FDQuery1.Refresh;
end;
 
procedure TForm2.btnCancelUpdatesClick(Sender: TObject);
begin
  DM.FDQuery1.CancelUpdates;
  DM.FDQuery1.Refresh;
end;
캐쉬 업데이트 - 업데이트 이력 추적
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 캐쉬 보기
if DM.FDQuery1.Active then
begin
  DM.FDMemTable1.CloneCursor(DM.FDQuery1, True);
  DM.FDMemTable1.FilterChanges := [rtModified, rtInserted, rtDeleted];
end;
 
// 이전 값 확인
ShowMessage(format('이전 값: %s  ->  새로운 값: %s', [
                    DM.FDQuery1.FieldByName('FIELD1').OldValue,
                    DM.FDQuery1.FieldByName('FIELD1').Value]));
 
// 마지막 변경 취소
DM.FDQuery1.UndoLastChange(True);
 
// 선택 레코드 변경 취소
DM.FDQuery1.RevertRecord;
 
// 저장점 생성
FSavePoint := DM.FDQuery1.SavePoint;
 
// 저장점으로 되돌리기
if FSavePoint > 0 then
  DM.FDQuery1.SavePoint := FSavePoint;

관련 링크

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15513
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13977
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16517
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22079
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23302
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18946
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39293
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174742
463 리펙토링 1-클래스, 정적메소드, 속성, 필드 이동하기 file 김원경 2017.02.23 652
462 코드 서명 – 여러분이 개발한 프로그램, 컴퓨터 바이러스처럼 보이지는 않나요? 관리자 2021.05.12 649
461 [베를린 U2] 윈도우 10 캘린더 활용하기 (1분 동영상) 험프리 2016.11.15 649
460 [고객 사례- 의료, 델파이] 의료용 소프트웨어(폐활량&심전도 체크) - Advanced Spirometer and ECG 관리자 2019.10.25 647
459 [시애틀] 개발 효율성을 극대화할 수 있도록 멀티-모니터를 활용해 개발환경 레이아웃을 구축할 수 있습니다. Humphery 2015.09.04 647
458 [업데이트][핫픽스][10,2 도쿄] 툴체인 이슈 핫픽스 험프리 2017.05.10 646
457 이 달의 기술자료 - 2015년 08월 험프리 2015.07.28 645
456 [기술백서] 다양한 팀 '협업' 방법론과 개발 방식 관리자 2020.03.18 645
455 [10.3 리오][업데이트 3] 엔터프라이즈 커넥터가 무상 제공됩니다 (엔터프라이즈, 아키텍트 사용 고객 한정) file 관리자 2019.11.22 645
454 이 달의 기술자료 - 2017년 12월 file 험프리 2017.11.24 644
453 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 2편 - 7장. 카메라(뷰 포인트)의 이해와 활용 관리자 2020.02.06 643
452 [RAD Studio 10.4 패치1 ] C ++ 디버깅과 누락 파일 패치 – 패치를 설치하는 새로운 방법! file 김원경 2020.06.01 640
451 [10.2 도쿄] RTL file 김원경 2017.03.24 638
450 [10.2 도쿄][릴리즈2] RAD 서버 싱글 사이트 라이선스 제공 험프리 2017.12.13 638
449 델파이/C++빌더에 TTcpClient, TTcpServer, TUdpSocket 등록하기 [1] file 험프리 2020.08.26 636
448 [10.2 도쿄][릴리즈3] 파이어몽키 UI 템플릿 관리자 2018.03.30 632
447 이 달의 기술자료 - 2016년 06월 file 험프리 2016.05.27 632
446 새롭게 출시될 RAD스튜디오 'NEW' 베타 버전, 지금 신청하세요! (유지보수계약 고객 한정) 관리자 2018.10.05 631
445 올인원 테스트 자동화 솔루션 - 래노렉스(Ranorex) file 관리자 2018.12.11 629
444 [고객 사례- 금융, 델파이] 주식, 화폐 등 금융 정보 분석 소프트웨어 - 게임스탑, 비트코인, 아마존, 구글 등 관리자 2021.02.04 628