🌐 웹개발

Hasura

하수라

Hasura는 PostgreSQL 데이터베이스 위에 즉시 GraphQL API를 생성하는 오픈소스 엔진입니다. 코드 없이 CRUD 작업, 실시간 구독, 권한 제어가 가능하며, BaaS(Backend as a Service)로 빠른 프로토타이핑에 적합합니다.

📖 상세 설명

Hasura는 2018년 출시된 오픈소스 GraphQL 엔진으로, 기존 PostgreSQL 데이터베이스를 연결하면 테이블 구조를 분석하여 자동으로 GraphQL API를 생성합니다. 백엔드 코드를 작성하지 않고도 Query, Mutation, Subscription이 모두 작동하며, 실시간 데이터 동기화가 필요한 앱에 특히 유용합니다.

핵심 기능은 권한 시스템(Authorization)입니다. 행 수준(row-level) 보안을 GraphQL 레이어에서 선언적으로 정의할 수 있어, "사용자는 자신의 데이터만 볼 수 있다"는 규칙을 테이블마다 설정합니다. JWT나 webhook 기반 인증과 연동되며, x-hasura-* 헤더로 세션 변수를 전달받아 권한 규칙에 활용합니다.

Actions와 Remote Schemas로 Hasura의 한계를 극복합니다. Actions는 커스텀 비즈니스 로직(결제 처리, 이메일 발송 등)을 GraphQL mutation으로 노출하고, Remote Schemas는 외부 GraphQL 서버를 Hasura 스키마에 병합합니다. 이를 통해 마이크로서비스 아키텍처에서도 단일 GraphQL 엔드포인트를 제공할 수 있습니다.

Event Triggers는 데이터베이스 변경(INSERT, UPDATE, DELETE)을 감지하여 웹훅을 호출합니다. 이를 통해 데이터 변경 시 알림 발송, 검색 인덱스 갱신, 캐시 무효화 등의 비동기 작업을 트리거할 수 있습니다. Hasura Cloud는 관리형 서비스로, 모니터링, 캐싱, 레이트 리미팅을 제공합니다.

💻 코드 예제

# Hasura가 자동 생성하는 GraphQL API 예시

# 사용자 조회 (자동 생성된 Query)
query GetUsers {
  users(
    where: { is_active: { _eq: true } }
    order_by: { created_at: desc }
    limit: 10
  ) {
    id
    name
    email
    posts {
      id
      title
    }
  }
}

# 사용자 생성 (자동 생성된 Mutation)
mutation CreateUser {
  insert_users_one(object: {
    name: "김철수",
    email: "kim@example.com"
  }) {
    id
    created_at
  }
}

# 실시간 구독 (WebSocket 기반)
subscription OnNewMessage {
  messages(
    where: { room_id: { _eq: "room-123" } }
    order_by: { created_at: desc }
    limit: 1
  ) {
    id
    content
    user {
      name
    }
    created_at
  }
}

# ---- 권한 규칙 예시 (Hasura Console 메타데이터) ----
# users 테이블의 select 권한
# "자신의 데이터만 조회 가능"
{
  "role": "user",
  "permission": {
    "filter": {
      "id": { "_eq": "X-Hasura-User-Id" }
    },
    "columns": ["id", "name", "email", "created_at"],
    "allow_aggregations": false
  }
}

# ---- Actions 정의 (커스텀 mutation) ----
# REST API를 GraphQL mutation으로 래핑
type Mutation {
  sendEmail(to: String!, subject: String!, body: String!): EmailResult
}

# handler: https://my-api.com/send-email

# ---- JavaScript 클라이언트 사용 예시 ----
import { createClient } from 'graphql-ws';
import { GraphQLClient } from 'graphql-request';

const client = new GraphQLClient('https://my-hasura.hasura.app/v1/graphql', {
  headers: {
    'Authorization': `Bearer ${token}`,
    'x-hasura-role': 'user',
  },
});

// 실시간 구독
const wsClient = createClient({
  url: 'wss://my-hasura.hasura.app/v1/graphql',
  connectionParams: {
    headers: { 'Authorization': `Bearer ${token}` },
  },
});

🗣️ 실무 대화 예시

👨‍💻 스타트업 CTO
"MVP를 빠르게 만들어야 하는데, 백엔드 개발 리소스가 부족해요. GraphQL API를 직접 구현하기엔 시간이 오래 걸릴 것 같습니다."
👩‍💻 개발자
"Hasura 써보세요. PostgreSQL 스키마만 설계하면 GraphQL API가 바로 생성됩니다. 권한 설정도 콘솔에서 클릭 몇 번이면 되고, 실시간 구독도 기본 지원이라 채팅이나 알림 기능도 쉽게 구현해요. 커스텀 로직은 Actions로 추가하면 됩니다."
👨‍💼 기술 면접관
"Hasura 사용 시 주의해야 할 점은 무엇인가요?"
👨‍💻 지원자
"첫째, 복잡한 비즈니스 로직은 Actions나 별도 서비스로 분리해야 합니다. 둘째, 권한 규칙을 꼼꼼히 설정해야 데이터 노출을 방지할 수 있습니다. 셋째, N+1 쿼리 문제는 PostgreSQL 인덱스와 Hasura의 batching으로 해결하고, 복잡한 aggregation은 View로 미리 정의하는 게 좋습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기