Smart Tables SDK
SmartTablesSDK는 고급 쿼리링, 필터링, 정렬 및 데이터 조작 기능을 포함한 구조화된 데이터 테이블 관리에 대한 포괄적인 솔루션을 제공합니다. 사용자 지정 보기, 데이터 가져오기/내보내기 및 AI 기반 데이터 처리를 지원하는 강력한 데이터 관리 애플리케이션을 쉽게 구축하세요.
설치
npm install @odin-ai-staging/sdk
빠른 시작
이 예시에서는 EKB API를 통해 SmartTablesSDK를 사용하여 프로그래밍 방식으로 구조화된 데이터 테이블을 만들고 관리하는 방법을 알아봅니다. API 자격 증명으로 SDK를 초기화한 다음 간단한 워크플로우를 따라 기능적인 데이터베이스를 구축합니다.
import { SmartTablesSDK } from '@odin-ai-staging/sdk';
// SDK 초기화
const smartTablesSDK = new SmartTablesSDK({
baseUrl: 'https://your-api-endpoint.com/',
projectId: 'your-project-id',
apiKey: 'your-api-key',
apiSecret: 'your-api-secret'
});
// 빠른 예시: 테이블 만들고 데이터 추가
async function quickExample() {
// 새 테이블 만들기
const table = await smartTablesSDK.createTable(
'고객 데이터베이스',
'고객 정보 관리'
);
// 열 추가
await smartTablesSDK.addColumn(table.id, {
name: 'name',
type: 'text',
description: '고객 이름'
});
await smartTablesSDK.addColumn(table.id, {
name: 'email',
type: 'email',
description: '고객 이메일 주소'
});
// 데이터 추가
await smartTablesSDK.addRow(table.id, {
name: '홍길동',
email: 'hong@example.com'
});
// 데이터 쿼리
const results = await smartTablesSDK.queryTable(table.id, {
filters: [{ column: 'name', operator: 'contains', value: '홍' }],
pagination: { limit: 10, page: 1 }
});
console.log('쿼리 결과:', results.data);
}
구성
SmartTablesSDKConfig 인터페이스
interface SmartTablesSDKConfig {
baseUrl: string; // API 엔드포인트 URL
projectId: string; // 프로젝트 식별자
apiKey?: string; // 인증용 API 키
apiSecret?: string; // 인증용 API 시크릿
accessToken?: string; // 웹 앱 사용을 위한 액세스 토큰
}
핵심 개념
SmartTable
SmartTable은 스키마, 메타데이터 및 데이터 관리 기능을 가진 구조화된 데이터 테이블을 나타냅니다.
interface SmartTable {
id: string; // 고유 테이블 식별자
project_id: string; // 이 테이블이 속한 프로젝트
title: string; // 테이블 표시 이름
description: string; // 테이블 설명
schema: SmartTableColumn[]; // 열 정의
table_name: string; // 내부 테이블 이름
created_at?: number; // 생성 타임스탬프
updated_at?: number; // 마지막 업데이트 타임스탬프
}
SmartTableColumn
테이블 열의 구조와 속성을 정의합니다.
interface SmartTableColumn {
name: string; // 열 이름
type: ColumnType; // 데이터 유형
description?: string; // 열 설명
notNull?: boolean; // 필수 필드
unique?: boolean; // 고유 제약 조건
defaultValue?: string | number | boolean | null; // 기본 값
options?: Record<string, unknown>; // 추가 옵션
}
type ColumnType = 'text' | 'number' | 'boolean' | 'date' | 'email' | 'url' | 'json';
필터링 및 쿼리링
여러 연산자와 정렬 옵션이 포함된 고급 필터링 시스템.
interface TableFilter {
column: string;
operator: FilterOperator;
value: string | number | boolean | null;
}
type FilterOperator = 'eq' | 'ne' | 'gt' | 'lt' | 'gte' | 'lte' | 'contains' | 'startswith' | 'endswith';
interface TableSort {
column: string;
direction: 'asc' | 'desc';
}
interface TablePagination {
page?: number;
limit?: number;
search?: string;
}
테이블 관리
getAllTables()
프로젝트의 모든 테이블을 가져옵니다.
async getAllTables(): Promise<SmartTable[]>
예시:
const tables = await smartTablesSDK.getAllTables();
tables.forEach(table => {
console.log(`테이블: ${table.title} (${table.id})`);
console.log(`열 수: ${table.schema.length}`);
});
getTable(tableId)
ID로 특정 테이블을 가져옵니다.
async getTable(tableId: string): Promise<SmartTable>
createTable(title, description, metadata?)
새 테이블을 만듭니다.
async createTable(
title: string,
description: string,
metadata?: Record<string, unknown>
): Promise<SmartTable>
updateTable(tableId, title, description?, metadata?)
테이블 메타데이터를 업데이트합니다.
deleteTable(tableId)
테이블과 모든 데이터를 영구적으로 삭제합니다.
열 작업
addColumn(tableId, column)
테이블에 새 열을 추가합니다.
async addColumn(tableId: string, column: SmartTableColumn): Promise<void>
예시:
// 텍스트 열 추가
await smartTablesSDK.addColumn('table_123', {
name: 'product_name',
type: 'text',
description: '상품 이름',
notNull: true
});
// 기본값이 있는 숫자 열 추가
await smartTablesSDK.addColumn('table_123', {
name: 'price',
type: 'number',
description: 'USD 단위 상품 가격',
defaultValue: 0,
notNull: true
});
updateColumn(tableId, columnName, updates)
열 속성을 업데이트합니다.
deleteColumn(tableId, columnName)
테이블에서 열을 제거합니다.
데이터 작업
addRow(tableId, data)
테이블에 새 행을 추가합니다.
async addRow(tableId: string, data: Record<string, any>): Promise<any>
예시:
const newRow = await smartTablesSDK.addRow('table_123', {
product_name: '무선 헤드폰',
price: 99.99,
supplier_email: 'supplier@example.com',
in_stock: true
});
console.log('새 행 ID:', newRow.id);
updateRow(tableId, rowId, columnName, newValue)
테이블의 특정 셀을 업데이트합니다.
deleteRow(tableId, rowId)
테이블에서 행을 삭제합니다.
쿼리링 및 필터링
queryTable(tableId, options?)
고급 필터링, 정렬 및 페이지네이션으로 테이블 데이터를 쿼리합니다.
예시:
기본 쿼리
const results = await smartTablesSDK.queryTable('table_123');
console.log('모든 데이터:', results.data);
필터링된 쿼리
const results = await smartTablesSDK.queryTable('table_123', {
filters: [
{ column: 'price', operator: 'gte', value: 50 },
{ column: 'in_stock', operator: 'eq', value: true },
{ column: 'product_name', operator: 'contains', value: '헤드폰' }
]
});
페이지네이션이 포함된 정렬된 쿼리
const results = await smartTablesSDK.queryTable('table_123', {
sort: [
{ column: 'price', direction: 'desc' },
{ column: 'product_name', direction: 'asc' }
],
pagination: {
page: 2,
limit: 20,
search: '무선'
}
});
console.log(`${results.total}개 항목을 찾았습니다`);
console.log(`페이지 ${results.page} / ${Math.ceil(results.total / results.limit)}`);
데이터 가져오기/내보내기
importTable(title, description, columnMappings, file)
CSV 또는 Excel 파일에서 데이터를 가져옵니다.
async importTable(
title: string,
description: string,
columnMappings: ColumnMapping[],
file: File
): Promise<ImportResult>
예시:
const fileInput = document.getElementById('csvFile') as HTMLInputElement;
const file = fileInput.files[0];
const columnMappings: ColumnMapping[] = [
{ sourceColumn: 'Name', targetColumn: 'product_name', dataType: 'text' },
{ sourceColumn: 'Price', targetColumn: 'price', dataType: 'number' },
{ sourceColumn: 'Email', targetColumn: 'supplier_email', dataType: 'email' }
];
const result = await smartTablesSDK.importTable(
'가져온 상품',
'CSV에서 가져온 상품',
columnMappings,
file
);
console.log(`${result.rows_imported}행을 가져왔습니다`);
AI 기반 기능
computeRowColumns(dataTypeId, rowId, columnNames?)
특정 행 열에 대한 AI 계산을 트리거합니다.
computeAllRows(dataTypeId)
테이블의 모든 행에 대한 AI 계산을 트리거합니다.
예시:
const result = await smartTablesSDK.computeAllRows('table_123');
console.log(`${result.total_rows_processed}행을 처리했습니다`);
console.log(`${result.total_columns_updated}열을 업데이트했습니다`);
오류 처리
SmartTablesSDK는 다른 SDK 컴포넌트와 동일한 오류 처리를 사용합니다:
try {
const table = await smartTablesSDK.createTable('내 테이블', '설명');
} catch (error) {
if (error instanceof APIError) {
console.error(`API 오류 ${error.status}: ${error.message}`);
} else {
console.error('예상치 못한 오류:', error);
}
}
모범 사례
효율적인 쿼리링
- 대용량 데이터세트에 페이지네이션 사용
- 데이터 전송을 줄이기 위해 필터 적용
- 가능한 경우 여러 작업 결합
// 좋음: 필터와 페이지네이션이 포함된 효율적인 쿼리
const results = await smartTablesSDK.queryTable(tableId, {
filters: [{ column: 'status', operator: 'eq', value: 'active' }],
pagination: { limit: 50, page: 1 },
sort: [{ column: 'created_at', direction: 'desc' }]
});
스키마 설계
- 적절한 열 유형 정의
- 제약 조건(notNull, unique)을 적절히 사용
- 의미 있는 설명 제공
// 좋음: 잘 정의된 열 스키마
await smartTablesSDK.addColumn(tableId, {
name: 'email',
type: 'email',
description: '고객 이메일 주소',
notNull: true,
unique: true
});
오류 처리 및 검증
- 항상 우아하게 오류를 처리합니다
- 작업 전에 데이터를 검증합니다
- 관련 작업에 트랜잭션을 사용합니다
async function safeTableOperation(tableId: string, data: any) {
try {
if (!data.email || !data.email.includes('@')) {
throw new Error('잘못된 이메일 형식');
}
const result = await smartTablesSDK.addRow(tableId, data);
return result;
} catch (error) {
console.error('작업 실패:', error);
if (error.message.includes('unique constraint')) {
throw new Error('이미 존재하는 이메일');
}
throw error;
}
}