Meerkit
Meerkit
HomeDocsComponentsAPI
GitHub

Getting Started

5
IntroductionInstallationProject StructureThemingDeployment

CLI

6
CLI Overviewinit & setupstart, stop & openstatus, check, env & logsdbadd, test & update

Core Concepts

5
AuthenticationRoles & PermissionsData ModelLogin LockoutSecurity

Guides

3
Protect a pageAdd a roleCall your own API

Components

24

사용자 화면12

Login FormSignup FormEmail VerificationTerms AgreementGoogle LoginPassword ResetProfile & PasswordNicknameAuth DialogProfile ImageUser AvatarUser Menu

관리자 화면6

Member TableMember DirectoryMember AI UsageMember AI Usage HistoryRole ManagerRole Select

공통5

Address FieldFile DropzoneLoadingDateRoute Guards

AI Components

4
AI Prompt InputThinking IndicatorAPI Key InputVoice

API

6
OverviewHealthAuthUsers · 내 정보Users · 관리자LLM

Reference

2
Hooks & StateFAQ

Call your own API

내 백엔드 API를 토큰이 자동으로 붙는 클라이언트로 호출합니다.

내 서비스의 백엔드 API를 호출할 때는 킷의 api 클라이언트를 그대로 씁니다. 로그인 토큰이 자동으로 붙고, 토큰이 만료되면 알아서 갱신한 뒤 다시 시도합니다.

What the client does

  • 모든 요청에 Authorization: Bearer ...를 자동으로 붙입니다.
  • 401이 오면 리프레시 쿠키로 토큰을 한 번 갱신하고 요청을 재시도합니다.
  • 갱신에도 실패하면 로그아웃 상태가 되어 로그인 안내가 나옵니다.
  • 주소는 /api 아래로 나가고, Next.js 프록시가 백엔드로 전달합니다.

1. Write the API function

src/app/(service)/reports/
├── api.ts            서버 호출 함수
├── queries.ts        TanStack Query 훅
└── ReportsPage.tsx
app/(service)/reports/api.ts
import { api } from "@/meerkit";

export interface Report {
  id: number;
  title: string;
}

export const reportsApi = {
  list: () => api.get<Report[]>("/reports").then((r) => r.data),
  create: (title: string) => api.post<Report>("/reports", { title }).then((r) => r.data),
};

2. Wrap it in a hook

서버 데이터는 TanStack Query에 맡깁니다. 쿼리 키는 ["meerkit", ...]와 겹치지 않게 서비스 이름으로 시작하세요.

queries.ts
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { reportsApi } from "./api";

const key = ["reports"] as const;

export const useReports = () => useQuery({ queryKey: key, queryFn: reportsApi.list });

export function useCreateReport() {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: reportsApi.create,
    onSuccess: () => queryClient.invalidateQueries({ queryKey: key }),
  });
}

3. Use it in the screen

ReportsPage.tsx
"use client";

import { RequireAuth } from "@/meerkit";
import { useReports } from "./queries";

function List() {
  const { data, isLoading, isError } = useReports();
  if (isLoading) return <p>불러오는 중…</p>;
  if (isError) return <p>목록을 불러오지 못했습니다.</p>;
  return <ul>{data?.map((r) => <li key={r.id}>{r.title}</li>)}</ul>;
}

export const ReportsPage = () => (
  <RequireAuth>
    <List />
  </RequireAuth>
);

Handling errors

Status의미권장 처리
400 / 422입력값 오류서버가 준 detail을 폼 아래에 표시
401로그인 필요 (갱신도 실패)클라이언트가 이미 처리. 화면은 RequireAuth가 안내
403역할이 허용되지 않음접근 권한 없음 안내
404대상 없음빈 상태 또는 안내 표시
5xx서버 오류재시도 안내

오류 메시지 꺼내기

tsx
import { isAxiosError } from "axios";

function message(error: unknown) {
  if (isAxiosError(error)) return error.response?.data?.detail ?? "요청에 실패했습니다.";
  return "알 수 없는 오류가 발생했습니다.";
}
axios를 직접 만들어 쓰면 토큰이 붙지 않습니다. 서비스 API는 항상 킷의 api를 사용하세요.
Add a roleOverview
© Meerkit. All rights reserved.GitHub