| Spock | |
| 라이선스 | MIT |
| 구현 언어 | Rust |
| 플랫폼 | macOS · Linux · Windows |
| 최신 버전 | 0.5.3 |
| 링크 | 공식 사이트 · GitHub |
1. 개요
Spock. It's only logical.
(공식 슬로건)
(공식 슬로건)
Spock은 백엔드 계약(contract) 선언 언어이자 메타 프레임워크다. 데이터베이스 스키마, API, 검증, 권한, 뮤테이션, 외부 시스템 동기화 등 여러 계층에 흩어지는 제품 규칙을 하나의
.spock 파일에 선언하면 나머지 계층이 결정론적으로 파생된다는 것을 핵심 컨셉으로 내세운다.일반적인 백엔드 프레임워크와 달리 프로덕션 서빙을 목표로 하지 않는 프로토타입 언어를 표방하는 점이 특징이다. 백엔드를 실제로 실행해 제품을 검증하고 최종 산출물로는 완성된 스펙 — 공식 문서의 표현으로는 "실행 가능한 PRD" — 을 남긴다는 포지셔닝인데, UML·ERD 같은 다이어그램은 시스템을 설명만 할 뿐 실행하지 못하고, 상용 프로토타이핑 툴은 화면만 프로토타이핑할 뿐 백엔드는 가상에 머문다는 문제의식을 근거로 든다.
2. 특징
공식 문서는 배경 철학을 다음 한 문장으로 요약한다.데이터베이스가 단일 진실 공급원(single source of truth)이어야 하고, 뮤테이션은 그것이 바꾸는 데이터 곁에 살아야 한다.
방향성 자체는 Supabase의 멘탈 모델(Postgres 중심의 인증·스토리지·정책·자동 API)을 계승한다고 명시하고 있으며, 거기서 여전히 장황하거나 암묵적으로 남는 부분(수동 PL/pgSQL 함수, RLS의 난해함 등)을 전용 언어로 압축하겠다는 것이 차별점이다. SQL이 관계에, HCL이 인프라에, GraphQL SDL이 클라이언트 읽기에, Prisma가 스키마 모델링에 전용 언어를 부여한 계보를 이어 백엔드 계약 전체에 전용 언어를 주겠다는 시도로 볼 수 있다. 흥미로운 점은 실패 사례 분석을 문서 전면에 내세운다는 것인데, C\#의 LINQ가 좌초한 원인(번역 가능한 표현의 범위가 런타임에야 드러남, 읽기 전용, 호스트 언어에 갇힌 계약)을 조목조목 짚고 각각에 대응하는 설계 결정을 명시해 두었다.
2.1. 언어 구성
표면 문법은 의도적으로 작게 유지되며, 별도의 "모델" 추상화를 만드는 대신 SQL의 프리미티브를 그대로 키워드로 쓴다.| 키워드 | 역할 |
table | 영속 데이터. 지속되는 진실 |
view | 이름 붙은 공개 프로젝션. 읽기(및 필드가 허용하면 쓰기) 표면 |
fn / mut fn | 의도적으로 공개하지 않는 뮤테이션·백엔드 오퍼레이션 계약 |
여기에
error(실패 결과도 함수 계약의 일부), role·policy(행위자 분류와 권한 로직), seed(계약을 통한 초기 데이터 주입)가 예약된 1일차 개념으로 문서화되어 있다. 인증(auth)과 파일 스토리지는 프로젝트마다 재발명하지 않도록 언어 차원에 내장하는 노선을 취한다.#!syntax rust
table post {
id: uuid
title: text
visibility: "public" | "private" | "unlisted" = "public"
published: bool
}
view post_preview from post {
id: .id
title: .title
published: .published
}
2.2. 구현
컴파일러와 런타임은 Rust로 작성되었다. 소스를 검사된 계약 IR로 내린 뒤 임베디드 SQLite 런타임이 이를 로드해 REST·GraphQL·Studio(관리 UI)를 하나의 오리진에서 서빙하는 구조다. GraphQL 표면은 Hasura 방언을 미러링하는데, 덕분에 graphql-codegen 등 기존 GraphQL 생태계 도구를 수정 없이 그대로 쓸 수 있다. 배포는 npm 단일 패키지로 이루어지며 macOS(arm64/x64)·Linux(x64)·Windows(x64) 프리빌트 바이너리를 포함해 별도 툴체인 없이npx로 실행된다.3. Uhura
클라이언트 쪽은 자매 언어 Uhura가 담당한다. Spock 측 문서는 "타입은 생성하되 클라이언트는 만들지 않는다"를 독트린으로 못박고 클라이언트 언어를 별도 프로젝트로 분리했는데, Uhura는 선언적 UI 언어이자 결정론적 헤드리스 경험 런타임으로 비권위(non-authoritative) UI 세션 상태와 경험 전이를 소유하며 Spock을 정규 프로바이더로 삼는다. 어떤 사실도 두 언어에서 동시에 권위를 가질 수 없다는 원칙으로 경계를 긋는다.spock new로 프로젝트를 생성하면 Spock 백엔드와 Uhura 클라이언트가 한 오리진에서 함께 서빙된다.4. 사용법
#!syntax sh
npx spock new demo # 백엔드 + Uhura 클라이언트 생성
cd demo
npx spock dev # 개발 서버
# 언어 단독 사용
npx spock check app.spock
npx spock run app.spock
5. 여담
- 이름은 스타트렉의 스팍에서 따왔다. 슬로건 "It's only logical" 역시 스팍의 대사. 클라이언트 언어 Uhura도 같은 작품의 통신 장교 이름인데, 백엔드(논리)와 클라이언트(통신)의 역할 분담을 이름으로 표현한 셈이다.
- 공식 문서 스스로 모델의 한계를 명시하는 점도 눈에 띈다. 주문 매칭 엔진이나 협업 편집기처럼 "제품 자체가 알고리즘인" 도메인은 Spock의 영역이 아니라고 선을 긋고, SaaS·마켓플레이스·커머스·커뮤니티처럼 "대부분 규칙으로 이루어진" 앱을 홈그라운드로 규정한다.