Rayfin SDK는 TypeScript에서 데이터 스키마를 한 번 정의하고 프로덕션 준비 API, 형식이 안전한 클라이언트 및 인프라를 자동으로 수신하는 데코레이터 기반 프로그래밍 모델을 사용합니다.
주요 개념
Rayfin SDK는 세 가지 핵심 요소를 결합합니다.
- 데코레이터 기반 스키마: TypeScript 데코레이터를 사용하여 데이터 모델, 사용 권한 및 관계를 정의합니다.
- 자동 API 생성: 데코레이팅된 클래스는 컨트롤러 코드를 작성하지 않고 GraphQL 엔드포인트가 됩니다.
- 형식이 안전한 클라이언트: 생성된 TypeScript 클라이언트는 쿼리 및 변형에 대한 컴파일 시간 유효성 검사를 제공합니다.
작동 방식
Fabric 앱을 만들 때 코드는 다음 단계를 진행합니다.
| # | 단계 | 어떻게 되나요? |
|---|---|---|
| 1 | 개발자 | 선택한 편집기에서 앱을 작성합니다. |
| 2 | TypeScript | TypeScript에서 엔터티 클래스를 작성합니다. |
| 3 | Decorators | , , 및 기타 데코레이터를 사용하여 @entity@uuid@text@role클래스 및 필드에 주석을 추가합니다. |
| 4 | Schema | CLI는 데코레이팅된 클래스를 데이터베이스 스키마, 권한 정책 및 API 구성으로 컴파일합니다. |
| 5 | APIs | 스키마는 GraphQL 엔드포인트로 게시됩니다. |
| 6 | Client | 생성된 RayfinClient 데이터는 해당 엔드포인트에 대해 형식이 안전한 데이터 및 인증 클라이언트를 노출합니다. |
| 7 | Application | 프런트 엔드 애플리케이션은 클라이언트를 사용하여 데이터를 읽고 씁니다. |
1. 데코레이터를 사용하여 데이터 모델 정의
다음의 @microsoft/rayfin-coreTypeScript 클래스 및 데코레이터를 사용하여 데이터 구조를 정의합니다.
import { entity, uuid, text, int } from '@microsoft/rayfin-core';
@entity()
export class Product {
@uuid() id!: string;
@text() name!: string;
@text({ optional: true }) description?: string;
@int() price!: number;
}
2. 스키마 생성
Rayfin CLI(npx rayfin)는 데코레이팅된 클래스를 분석하고 다음을 생성합니다.
- 데이터베이스 스키마 - 테이블, 열, 제약 조건 및 인덱스
- API 구성 - GraphQL 엔드포인트 정의
- 권한 정책 - 행 수준 보안 및 필드 수준 액세스 제어
4. 타입 안전한 클라이언트 사용
GraphQL API는 데이터베이스에서 CRUD 작업을 수행하는 데 사용할 수 있습니다. Rayfin SDK는 데이터를 읽거나 쓰거나 삭제하는 데이터 클라이언트 작업을 기본으로 제공합니다.
import { RayfinClient } from '@microsoft/rayfin-client';
const client = new RayfinClient();
// TypeScript knows about Product fields
const products = await client.data.products.query()
.select(['id', 'name', 'price'])
.execute();
// Compile-time error if field doesn't exist
const invalid = await client.data.products.query()
.select(['nonexistentField']) // ❌ TypeScript error
.execute();
데코레이터 참조
Rayfin SDK는 일반적인 데이터 모델링 패턴에 대한 데코레이터를 제공합니다.
엔터티 데코레이터
| 데코레이터 | Purpose | Example |
|---|---|---|
@entity() |
클래스를 데이터베이스 엔터티로 표시 | @entity() class Product |
속성 데코레이터
| 데코레이터 | 데이터베이스 유형 | TypeScript 형식 |
|---|---|---|
@uuid() |
UNIQUEIDENTIFIER | string |
@text() |
NVARCHAR | string |
@int() |
INT | number |
@decimal() |
십진법 | number |
@bool() |
비트 | boolean |
@date() |
DATETIME2 | Date |
권한 데코레이터
| 데코레이터 | Purpose |
|---|---|
@role() |
역할 기반 권한 정의 |
권한 부여 세부 정보는 데이터 권한 정의를 참조하세요.
개발 워크플로
일반적인 개발 주기는 다음 패턴을 따릅니다.
- 데이터 모델 정의 또는 수정 - 데코레이터를 사용하여 TypeScript 클래스 추가 또는 업데이트
-
원격 백 엔드를 사용하여 로컬로 테스트 -
npm run dev실행하여 Fabric 앱 백 엔드에 대한 프런트 엔드 코드 변경 내용을 테스트합니다. -
Fabric에 배포 -
npx rayfin up을 실행하여 관리형 Fabric 서비스에 배포하고 스키마 변경 내용을 적용합니다.
TypeScript 모델의 변경 내용은 데이터베이스 스키마에서 API 엔드포인트, 클라이언트 형식으로 전체 스택을 통해 자동으로 전파됩니다.
Authorization
사용 권한은 데코레이터를 사용하여 @role 데이터 모델과 함께 정의됩니다.
@entity()
@role('authenticated', ['create', 'read', 'update', 'delete'], {
policy: (claims, item) => claims.sub.eq(item.userId)
})
export class UserDocument {
@uuid() id!: string;
@text() userId!: string;
@text() content!: string;
}
이 접근 방식은 다음을 보장합니다:
- 보안 규칙은 보호하는 데이터 옆에 있습니다.
- 타입 안전한 정책 표현식은 컴파일 시 오류를 감지합니다.
- 엔터티 필드를 리팩터링하면 권한 검사가 자동으로 업데이트됩니다.