Skip to content

ApmTransactionTable

개요

ApmTransactionTable은 APM(Application Performance Monitoring) 환경에서 트랜잭션 데이터를 테이블 형태로 표시하는 컴포넌트입니다. 성능 분석, 오류 추적, 트랜잭션 상세 정보 조회 등의 기능을 제공합니다.

주요 기능

  • 트랜잭션 데이터의 테이블 뷰 제공
  • 정렬, 페이징, 행 선택 기능
  • 프로파일 정보 표시
  • 도구 슬롯을 통한 확장 가능한 UI
  • 트랜잭션 시간 시각화

Props 인터페이스

typescript
interface ApmTransactionTableProps<
    T extends TransactionData & Record<string, unknown>
> extends PagingTableProps<T> {
    maxMap: TransactionTime;
}

interface PagingTableProps<T> {
    alias: string; // 테이블 식별자
    width: number; // 테이블 너비
    height: number; // 테이블 높이
    displayCount: number; // 페이지당 표시 개수
    columns: PagingTableColumn[]; // 컬럼 정의
    rows: PagingTableRow<T>[]; // 행 데이터
    rowHeight?: number; // 행 높이 (기본값: 56)
    sortKey?: string; // 정렬 키
    sortOrder?: PagingTableSortOrder; // 정렬 순서
    sortLoading?: boolean; // 정렬 로딩 상태
    useSkeleton?: boolean; // 스켈레톤 UI 사용 여부
    useSelect?: boolean; // 행 선택 기능 사용 여부
    foundRowId?: string; // 강조할 행 ID
    selectedRowIds?: string[]; // 선택된 행 ID 목록
}

interface TransactionTime {
    elapsedTime: number; // 경과 시간 최대값
    methodTime: number; // 메서드 시간 최대값
    sqlTime: number; // SQL 시간 최대값
    txcallTime: number; // 트랜잭션 호출 시간 최대값
    batchTime: number; // 배치 시간 최대값
}

이벤트

typescript
interface ApmTransactionTableEmits<T> {
    (e: 'sort', key: string, order: PagingTableSortOrder): void;
    (e: 'select', id: string, row?: PagingTableRow<T>): void;
}
  • sort: 컬럼 정렬 시 발생
  • select: 행 선택 시 발생

슬롯

tools

테이블 상단의 도구 영역을 커스터마이징할 수 있습니다.

vue
<template #tools="slotProps">
    <button @click="exportData">내보내기</button>
    <button @click="refreshData">새로고침</button>
</template>

기본 사용법

vue
<template>
    <apm-transaction-table
        :alias="'transaction-table'"
        :width="1000"
        :height="500"
        :columns="columns"
        :rows="rows"
        :display-count="10"
        :max-map="maxMap"
        @select="onSelectRow"
        @sort="onSort"
    />
</template>

<script setup lang="ts">
import { ApmTransactionTable } from '@jennifersoft/apm-components';
import type {
    PagingTableColumn,
    PagingTableRow,
    TransactionTime,
} from '@jennifersoft/apm-components';

const columns: PagingTableColumn[] = [
    { key: 'serviceName', name: '서비스명', type: 'text', sortable: true },
    { key: 'elapsedTime', name: '경과시간', type: 'number', sortable: true },
    { key: 'startTime', name: '시작시간', type: 'datetime', sortable: true },
];

const rows: PagingTableRow<TransactionData>[] = [
    {
        id: '1',
        data: {
            serviceName: '/api/users',
            elapsedTime: 1267,
            startTime: Date.now(),
            // ... 기타 트랜잭션 데이터
        },
    },
];

const maxMap: TransactionTime = {
    elapsedTime: 1737,
    methodTime: 937,
    sqlTime: 480,
    txcallTime: 320,
    batchTime: 0,
};

const onSelectRow = (id: string, row?: PagingTableRow<TransactionData>) => {
    console.log('선택된 행:', id, row);
};

const onSort = (key: string, order: PagingTableSortOrder) => {
    console.log('정렬:', key, order);
};
</script>

인터랙티브 데모

데이터 구조

TransactionData

typescript
interface TransactionData extends Record<string, unknown> {
    sid: number; // 시스템 ID
    domainName: string; // 도메인명
    instId: number; // 인스턴스 ID
    instanceName: string; // 인스턴스명
    serviceName: string; // 서비스명
    serviceHash: number; // 서비스 해시
    txid: string; // 트랜잭션 ID
    errCode: string; // 오류 코드
    elapsedTime: number; // 경과 시간
    methodTime: number; // 메서드 시간
    sqlTime: number; // SQL 시간
    txcallTime: number; // 트랜잭션 호출 시간
    batchTime: number; // 배치 시간
    startTime: number; // 시작 시간
    endTime: number; // 종료 시간
    cpuTime: number; // CPU 시간
    sqlCount: number; // SQL 개수
    httpStatusCode: string; // HTTP 상태 코드
    linked: boolean; // 연결 여부
    stacked: boolean; // 스택 여부
    async: boolean; // 비동기 여부
    transactionTypes: TransactionType[]; // 트랜잭션 타입 목록
}

type TransactionType = 'ERROR' | 'LINKED' | 'STACKED' | 'ASYNC';

고급 사용법

커스텀 도구 모음

vue
<template>
    <apm-transaction-table v-bind="tableProps" @select="onSelectRow">
        <template
            #tools="{ columns, page, updateColumns, updatePage, resetSettings }"
        >
            <div class="custom-tools">
                <button @click="exportCsv(columns)">CSV 내보내기</button>
                <button @click="resetSettings">설정 초기화</button>
                <span>페이지: {{ page }}</span>
            </div>
        </template>
    </apm-transaction-table>
</template>

정렬 및 필터링

vue
<script setup lang="ts">
import { ref, computed } from 'vue';

const sortKey = ref<string>('startTime');
const sortOrder = ref<PagingTableSortOrder>(PagingTableSortOrder.DESC);
const sortLoading = ref<boolean>(false);

const onSort = async (key: string, order: PagingTableSortOrder) => {
    sortLoading.value = true;
    sortKey.value = key;
    sortOrder.value = order;

    // 정렬 로직 수행
    await performSort(key, order);

    sortLoading.value = false;
};
</script>

의존성

  • @jennifersoft/apm-components
  • @jennifersoft/apm-apis
  • @jennifersoft/vue-components-v2 (도구 버튼 사용 시)