Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 추적 기록과 모니터링 (FireDAC)


Recommended Posts

Docwiki에 있는 "Tracing and Monitoring (FireDAC)"를 번역한 글 (번역일: 2022년 3월 10일)

위로 가기: [DocWiki 번역] 디버깅 및 기술 지원 (FireDAC)

 

이 주제는 FireDAC에 있는 추적 기록(Tracing)과 모니터링(monitoring) 기능을 사용하는 방법을 설명한다. 추적 기록과 모니터링은 FireDAC 애플리케이션 디버깅 도구의 근간이며, 애플리케이션이 데이터베이스와 어떻게 통신하는 지를 보여준다.

목차


 

개요 (Overview)

FireDAC의 추적 결과물은 FireDAC 애플리케이션과 데이터베이스 간의 통신을 상세하게 기록하는 로그이다. 여기에는 참조 번호, 시간, API 호출 정보, 데이터베이스로 전달한 SQL 구문, 파라미터와 필드 값 등 데이터 교환 내용, 에러, 경고, 데이터베이스 관리 시스템 (DBMS) 환경에 대한 리포트 등이 포함된다.

FireDAC에서 제공하는 추적 결과 제공 방식은 3가지 이다. 각각 담당 컴포넌트가 다르며 연결(connection)의 MonitorBy 파라미터에 지정되는 값이 다르다. 

컴포넌트 MonitorBy 값 설명
TFDMoniFlatFileClientLink FlatFile 추적 결과물을 플랫 파일에 기록한다. 애플리케이션이 종료되면 생성된 추적 파일(들)의 목록을 보여진다.
TFDMoniRemoteClientLink Remote 추적 결과물을 FDMonitor 유틸리티로 보내 FDMonitor 를 통해 FireDAC 애플리케이션을 모니터링 할 수 있다. 추적 결과 기록 기능을 켜기 전에 먼저 FDMonitor 유틸리티를 먼저 작동시켜야만 한다.
TFDMoniCustomClientLink Custom 추적 결과물을 사용자 정의 이벤트 핸들러로 보낸다. FireDAC 애플리케이션에서는 OnOutput 이벤트 핸들러를 사용하여 사용자 정의 추적 결과물을 생산한다. 

모니터링 컴포넌트들은 싱글톤(singleton)이다. 즉, 인스턴스 하나가 추적 구현에 대응한다. 추적 결과 기록 기능을 켜놓은 모든 커넥션은 단일 추적기를 사용하므로, 모든 커넥션에 대한 결과물도 하나만 생산된다.

 

추적 기록 다루기 (Controlling Tracing)

연결(Connection)에서 추적 결과 기능을 켜려면, 

  1. TFDMoniXxxxClientLink 컴포넌트를 폼에 올려 놓는다.
  2. 이 컴포넌트의 Tracing 프로퍼티를 True로 지정한다.
  3. 연결 정의(connection Definition)MonitorBy 파라미터에 값을 지정한다. 예: MonitorBy=Xxx 

Connection(연결)의 MonitorBy 파라미터는 해당 연결 정의를 특정 추적 메소드와 연계한다. 연결 정의가 맨 처음 연결되고 나면 이 파라미터는 읽기-전용이 된다. MonitorBy 지정은 영구적이어야 한다.

MonitorBy=Xxx를 지정한 연결을 처음 오픈 하기 전에 반드시 TFDMoniXxxxClientLink.Tracing 프로퍼티를 True로 지정해야 한다. 그 후에는, TFDMoniXxxxClientLink 컴포넌트의 Tracing 프로퍼티를 사용하여 추적 결과 기록을 임시로 켜거나 끌 수 있다.

주의: 데이터 모듈 또는 폼이 생성될 때에는, 반드시 TFDMoniXxxxClientLinkTFDConnection 보다 먼저 생성되어야 한다. 

특정 Connection(연결)에서 추적 기록을 처음부터 끄려면 MonitorBy=Xxx를 사용한다. 임시로 켜거나 끄려면 TFDConnection.ConnectionIntf.Tracing 프로퍼티를 사용한다. 단, ConnectionIntf는 해당 Connection(연결)이 설정된 후에야 접근할 수 있다는 점에 주의한다.

예를 들어,: 

FDMoniFlatFileClientLink1.Tracing := True;

with FDConnection1.Params do begin
  Clear;
  Add('DriverID=SQLite');
  Add('Database=c:\test.sdb');
  Add('MonitorBy=FlatFile');
end;

FDConnection1.Connected := True;
...
// Connection의 추적 기록 끄기
FDConnection1.ConnectionIntf.Tracing := False;
...
// Connection의 추적 기록 켜기
FDConnection1.ConnectionIntf.Tracing := True;


FireDAC의 추적 기록 내용 (The Trace Content)

FireDAC의 추적 기록 내용을 다루려면, TFDMoniXxxxClientLink.EventKinds 프로퍼티를 사용한다. 추적 결과물 예시:

     1385 15:47:14.093     >> Fetch [ATable="FDQA_FK_tab", Command="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM FDQA_FK_tab AF LEFT JOIN FDQA_tabwithpk AT1 ON AF.fk_id=AT1.f1"]
     1386 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=0, Result=SQLITE_NULL]
     1387 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=1, Result=SQLITE_INTEGER]
     1388 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=1, AValue^=2]
     1389 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=2, Result=SQLITE_NULL]
     1390 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=3, Result=SQLITE_NULL]
     1391 15:47:14.093          . sqlite3_step [stmt=$0F16E6B8]
     1392 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=0, Result=SQLITE_INTEGER]
     1393 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=0, AValue^=2]
     1394 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=1, Result=SQLITE_INTEGER]
     1395 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=1, AValue^=3]
     1396 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=2, Result=SQLITE_INTEGER]
     1397 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=2, AValue^=2]
     1398 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=3, Result=SQLITE_TEXT]
     1399 15:47:14.093          . sqlite3_column_text [stmt=$0F16E6B8, iCol=3, bytes=4]
     1400 15:47:14.093          . sqlite3_step [stmt=$0F16E6B8]
     1401 15:47:14.093          . profile [SQL="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM FDQA_FK_tab AF LEFT JOIN FDQA_tabwithpk AT1 ON AF.fk_id=AT1.f1", time=0]
     1402 15:47:14.093     << Fetch [ATable="FDQA_FK_tab", Command="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM FDQA_FK_tab AF LEFT JOIN FDQA_tabwithpk AT1 ON AF.fk_id=AT1.f1", RowsAffected=2]

위 내용을 설명하면,

  • 맨 앞의 숫자 (1385-1402)는 줄 번호이다. 기록된 위치를 정확히 알려주는 번호이다. 
  • 시간 기록은 해당 줄이 생성된 현지 시각이다. 성능 측정에 사용될 수 있다.
  • 아래 파라미터 들은 SQL 명령문과 기타 정보이다.
    • >> Xxxx--FireDAC 동작 하나가 시작됨
    • << Xxxx--FireDAC 동작 하나가 끝남
  • sqlite3_xxx--a DBMS API call (SQLite), 이것은 FireDAC 작동을 실행하기 위해 수행된 API이다.

 

결과물 다루기 (Controling Output)

추적 결과물 별로, 해당 컴포넌트들을 사용하여 다룬다.

플랫 파일 결과물 (Flat File Output)

TFDMoniFlatFileClientLink 컴포넌트는 플랫 파일 결과물을 다룬다. 기본값에 의해 추적 결과물 파일이 로컬 시스템의 TEMP 폴더에 자동으로 생성된다.  

결과물을 다루려면, 아래 프로퍼티(들)을 사용한다.

  • FileName-- 추적 결과물 파일 이름. 환경 변수 --$(name)--을 사용할 수도 있다. 기본값은 $(TEMP)\traceN.txt 이다.
  • FileEncoding--추적 결과물 파일 인코딩. 기본 인코딩은 ANSI 이다.
  • FileAppend-- True로 지정되면, 기존 추적 파일에 내용을 추가한다. 그렇지 않으면, 새로 실행될 때마다 매번 새로 덮어쓴다.
  • FileColumns-- 추적 결과물 텍스트 파일에 담길 컬럼(들)

 

원격 결과물 (Remote Output)

TFDMoniRemoteClientLink 컴포넌트는 원격 결과물을 다룬다. FDMonitor 유틸리티를 사용하여 추적 결과물을 볼 수 있다. FireDAC은 추적 기록을 전송할 때 TCP/IP를 사용한다. 따라서 네트워크 상의 다른 시스템에 DMonitor 유틸리티를 두고 작동할 수 있다. FireDAC을 OS X 앱을 만들 때에도 사용할 수 있다. 즉, 애플리케이션은 맥 컴퓨터에서 실행하고 FDMonitor는 윈도우 컴퓨터에서 실행할 수 있다.

결과물을 다루려면, 아래 프로퍼티(들)을 사용한다.

  • Host-- FDMonitor가 실행되는 장비의 IP 주소. 기본값은 localhost이다.
  • Port--the FDMonitor가 리스닝하는 IP 포트. 기본값은 8050이다.
  • Timeout -- FDMonitor에 연결을 설정하는데 소요될 수 있는 ms 단위 최대 허용 시간.

 

사용자 정의 결과물 (Custom Output)

TFDMoniCustomClientLink 컴포넌트를 사용하여 사용자 정의 추적 결과물을 생산한다. 그러려면, 애플리케이션에서 OnOutput 이벤트 핸들러를 정의해야 한다. 

주의: OnOutput 이벤트 핸들러에서 Application.ProcessMessages 호출을 피해야 한다. 성능을 심각하게 저하시켜서 (FireDAC 재진입이 지원되지 않음에도 불구하고 발생할 수 있기 때문에) 이슈가 발생될 수 있다.

 

모니터링 (Monitoring)

FDMonitor 유틸리티는 FireDAC 오브젝트(들)의 상태를 모니터링할 수 있다. 이 기능을 사용하려면, 개발자가 해당 오브젝트에서 모니터링을 켜놓으면 된다. 자세한 사항은 FireDAC\Samples\Moni Layer\Main demo 참조

 

SQL 명령문 점검하기 (Checking the SQL Command Text)

데이터베이스로 보내질 SQL 명령문을 보려면 아래에 있는 추적 기능을 사용한다.

  • TFDQuery.Text--데이터베이스로 보내질 SQL 명령문을 반환한다.
  • EFDDBEngineException.SQL, Params--예외를 발생시킨 SQL 명령문을 반환한다.

 

데이터셋 행 점검하기(Checking the Dataset Rows)

데이터셋 행(Row)을 실어 담으려면 아래 메소드 중 하나를 하용한다.

  • DataSet.GetRow.DumpRow(True)--현재 데이터셋 행을 나타내는 텍스트를 반환한다. 여기에는 모든 필드 값과 필드 이름이 들어 있다.
  • DataSet.GetRow.DumpRow()--현재 데이터셋 행을 나타내는 텍스트를 반환한다. 여기에는 모든 필드 값이 들어 있다.
  • DataSet.Table.Rows[i].DumpRow()--데이터셋 특정 행을 나타내는 텍스트를 반환한다.

 

기타 자료

Samples

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

 공유하기

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.