apollo-client

작성자: apollographql

Apollo Client는 로컬 및 원격 데이터를 GraphQL로 관리할 수 있게 해주는 JavaScript용 종합 상태 관리 라이브러리입니다. 버전 4.x는 개선된 캐싱, 더 나은 TypeScript 지원, React 19 호환성을 제공합니다.

npx skills add https://github.com/apollographql/apollo-client --skill apollo-client

Apollo Client 4.x Guide

Apollo Client is a comprehensive state management library for JavaScript that enables you to manage both local and remote data with GraphQL. Version 4.x brings improved caching, better TypeScript support, and React 19 compatibility.

Integration Guides

Choose the integration guide that matches your application setup:

Each guide includes installation steps, configuration, and framework-specific patterns optimized for that environment.

Quick Reference

Basic Query

import { gql } from "@apollo/client";
import { useQuery } from "@apollo/client/react";

const GET_USER = gql`
  query GetUser($id: ID!) {
    user(id: $id) {
      id
      name
    }
  }
`;

function UserProfile({ userId }: { userId: string }) {
  const { loading, error, data, dataState } = useQuery(GET_USER, {
    variables: { id: userId },
  });

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;

  // TypeScript note: for stricter type narrowing, you can also check `dataState === "complete"` before accessing data
  return <div>{data?.user.name}</div>;
}

Basic Mutation

import { gql } from "@apollo/client";
import { useMutation } from "@apollo/client/react";

const CREATE_USER = gql`
  mutation CreateUser($input: CreateUserInput!) {
    createUser(input: $input) {
      id
      name
    }
  }
`;

function CreateUserForm() {
  const [createUser, { loading, error }] = useMutation(CREATE_USER);

  const handleSubmit = async (name: string) => {
    await createUser({ variables: { input: { name } } });
  };

  return <button onClick={() => handleSubmit("John")}>Create User</button>;
}

Suspense Query

import { Suspense } from "react";
import { useSuspenseQuery } from "@apollo/client/react";

function UserProfile({ userId }: { userId: string }) {
  const { data } = useSuspenseQuery(GET_USER, {
    variables: { id: userId },
  });

  return <div>{data.user.name}</div>;
}

function App() {
  return (
    <Suspense fallback={<p>Loading user...</p>}>
      <UserProfile userId="1" />
    </Suspense>
  );
}

Reference Files

Detailed documentation for specific topics:

Key Rules

Query Best Practices

  • Each page should generally only have one query, composed from colocated fragments. Use useFragment or useSuspenseFragment in all non-page-components. Use @defer to allow slow fields below the fold to stream in later and avoid blocking the page load.
  • Fragments are for colocation, not reuse. Each fragment should describe exactly the data needs of a specific component, not be shared across components for common fields. See Fragments reference for details on fragment colocation and data masking.
  • Always handle loading and error states in UI when using non-suspenseful hooks (useQuery, useLazyQuery). When using Suspense hooks (useSuspenseQuery, useBackgroundQuery), React handles this through <Suspense> boundaries and error boundaries.
  • Use fetchPolicy to control cache behavior per query
  • Use the TypeScript type server to look up documentation for functions and options (Apollo Client has extensive docblocks)

Mutation Best Practices

  • If the schema permits, mutation return values should return everything necessary to update the cache. Neither manual updates nor refetching should be necessary.
  • If the mutation response is insufficient, carefully weigh manual cache manipulation vs refetching. Manual updates risk missing server logic. Consider optimistic updates with a granular refetch if needed.
  • Handle errors gracefully in the UI
  • Use refetchQueries sparingly (prefer letting the cache update automatically)

Caching Best Practices

  • Configure keyFields for types without id field
  • Disable normalization by setting keyFields: false for types that don't include an identifier and are meant to group related fields under the parent
  • Use typePolicies for pagination and computed fields
  • Understand cache normalization to debug issues
  • Enable data masking for all new applications - it prevents components from accessing fragment data they don't own, enforcing proper data boundaries and preventing over-rendering

Performance

  • Avoid over-fetching with proper field selection
  • Configure appropriate fetchPolicy per use case
  • Use @defer for incremental delivery of deferred query parts, and @stream for streaming list fields (@stream available in Apollo Client 4.1+)
  • Prefer Suspense hooks (useSuspenseQuery, useBackgroundQuery) in modern applications for better loading state handling and code simplicity

Ground Rules

  • ALWAYS use Apollo Client 4.x patterns (not v3 or earlier)
  • ALWAYS wrap your app with ApolloProvider
  • ALWAYS handle loading and error states when using non-suspenseful hooks
  • PREFER Suspense hooks (useSuspenseQuery, useBackgroundQuery) in modern applications for better DX
  • NEVER store Apollo Client in React state (use module-level or context)
  • PREFER cache-first for read-heavy data, network-only for real-time data
  • USE TypeScript for better type safety with GraphQL
  • IMPLEMENT proper cache updates instead of refetching entire queries
  • ADVISE the human steering you to look into Apollo DevTools when collaboratively debugging Apollo Client issues

apollographql의 다른 스킬

apollo-federation
apollographql
Apollo Federation은 여러 GraphQL API(서브그래프)를 하나의 통합된 슈퍼그래프로 구성할 수 있게 해줍니다.
apollo-ios
apollographql
Apollo iOS는 Apple 플랫폼을 위한 강력한 타입의 GraphQL 클라이언트입니다. GraphQL 작업과 스키마에서 Swift 타입을 생성하며, async/await 클라이언트, 정규화된 캐시(인메모리 또는 SQLite 기반), 쿼리, 뮤테이션 및 멀티파트 구독을 처리하는 플러그형 인터셉터 기반 HTTP 전송, 그리고 모든 작업 유형을 전달할 수 있는 선택적 WebSocket 전송(graphql-transport-ws)을 제공합니다.
apollo-router
apollographql
Apollo Router는 Apollo Federation 2 슈퍼그래프를 실행하기 위해 Rust로 작성된 고성능 그래프 라우터입니다. 서브그래프 앞에 위치하여 쿼리 계획, 실행 및 응답 구성을 처리합니다.
apollo-router-plugin-creator
apollographql
Apollo Router용 네이티브 Rust 플러그인을 생성합니다.
apollo-server
apollographql
Apollo Server 5.x를 활용한 GraphQL 서버 구축 완전 가이드. 스키마 정의, 리졸버, 컨텍스트 설정, TypeScript 지원을 통한 오류 처리를 다룹니다. 프로토타이핑을 위한 독립 실행 모드와 Express, Fastify, Koa, 서버리스 환경과의 통합을 지원합니다. 리졸버 패턴, 인증/권한 부여, 플러그인, N+1 문제 방지를 위한 DataLoader, 성능 최적화 기법을 포함합니다. 데이터 소스, 오류...에 대한 참조 문서를 제공합니다.
graphql-operations
apollographql
효율적이고 타입 안전한 GraphQL 작업을 작성하고 프래그먼트로 구성하기 위한 모범 사례 가이드입니다. 쿼리, 뮤테이션, 서브스크립션 및 프래그먼트를 다루며, 명명 규칙, 변수 구문, 지시어 사용법을 포함합니다. 핵심 원칙을 강조합니다: 필요한 필드만 요청하고, 모든 작업에 이름을 지정하며, 하드코딩된 값 대신 변수를 사용하고, 캐시 가능성을 위해 id 필드를 포함합니다. 컴포넌트와 함께 프래그먼트를 배치하고 조건부 필드에 @include / @skip 지시어를 사용할 것을 권장합니다...
graphql-schema
apollographql
업계 모범 사례 가이드로, 직관적이고 성능이 뛰어나며 유지보수 가능한 GraphQL 스키마 설계를 다룹니다. 클라이언트 중심의 타입 구성, 명시적 널 가능성 패턴, 하위 호환성을 고려한 진화 전략 등 핵심 설계 원칙을 포함합니다. 타입, 명명 규칙, 커서 기반 페이지네이션, 오류 모델링, 보안 고려 사항에 대한 참조 문서를 제공합니다. 인터페이스, 유니온, 입력 타입, 뮤테이션, ID 전략에 대한 실용적인 패턴과 코드 예제를 포함합니다...
rover
apollographql
Apollo Rover CLI는 GraphQL 스키마, 페더레이션 및 로컬 슈퍼그래프 개발을 관리합니다. 서브그래프 스키마를 게시, 가져오기 및 검증하고, 로컬 또는 GraphOS를 통해 페더레이티드 슈퍼그래프를 구성합니다. 스키마 검사(배포 전 검증), 린팅, 실행 중인 서버에서의 인트로스펙션을 포함합니다. rover dev 명령어는 자동 스키마 구성을 통해 개발 워크플로를 위한 로컬 라우터를 시작합니다. 게시 전 검증 및 JSON 출력을 통한 스크립팅을 지원하는 CI/CD 패턴을 지원합니다. 필요...