GraphQL - GraphQL Client ์‹œ์ž‘ํ•˜๊ธฐ

2026. 1. 7. 14:40ยท๐Ÿงฌ GraphQL

GraphQL

 

 

โœ… GraphQL Client๋ฅผ ์ƒ์„ฑํ•ด GraphQL Server์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ


์ผ๋‹จ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” GraphQL Server๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

 

Apollo Client์™€ GraphQL ์„ค์น˜

(์„œ๋ฒ„ ๋งŒ๋“ค ๋•Œ๋Š” apollo-server๋ฅผ ์„ค์น˜ํ–ˆ์—ˆ์Œ)

npm i apollo/client graphql

 

<client.js>

๋ฐ‘ ์ฝ”๋“œ๋Š” client๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์šฉ๋„

import { HttpLink } from "@apollo/client";
import { ApolloClient, gql, InMemoryCache } from "@apollo/client";

const cache = new InMemoryCache();
const client = new ApolloClient({
  link: new HttpLink({
    uri: "http://localhost:4000/",
  }),
  cache,
});

client
  .query({
    query: gql`
      {
        allMovies {
          title
        }
      }
    `,
  })
  .then((data) => console.log(data));

export default client;

 

๊ทธ๋ฆฌ๊ณ  client๋ฅผ index.js์—์„œ import๋งŒ ์‹œ์ผœ๋„ GraphQL Server์—์„œ data๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

<ApolloProvider>, useApolloClient()


์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๊ณณ์—์„œ client์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ApolloProvider๋ฅผ ์‚ฌ์šฉํ•ด์ค€๋‹ค.

import client from "./client";
import { ApolloProvider } from "@apollo/client/react";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <ApolloProvider client={client}>
      <App />
    </ApolloProvider>
  </React.StrictMode>

 

๊ทธ๋ฆฌ๊ณ  client๋ฅผ ์‚ฌ์šฉํ•  ๊ณณ์—์„œ useApolloClient()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

  const client = useApolloClient();
  useEffect(() => {
    client
      .query({
        query: gql`
          {
            allMovies {
              title
              id
            }
          }
        `,
      })
      .then((result) => setMovies(result.data.allMovies));
  }, [client]);

 

(GraphQL๋กœ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋Š” Apollo ํด๋ผ์ด์–ธํŠธ๊ฐ€ json() ๋ณ€ํ™˜์„ ๋Œ€์‹  ํ•ด์ฃผ์–ด์„œ REST API์™€ ๊ฐ™์ด json()์œผ๋กœ ์ˆ˜๋™ ๋ณ€ํ™˜ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.)

 

 

โœ… useQuery


React Query์™€ ๋น„์Šทํ•˜๊ฒŒ Apollo Client์—๋„ useQuery hook์ด ์žˆ๋‹ค.

import { gql } from "@apollo/client";
import { useQuery } from "@apollo/client/react";
import { useParams } from "react-router-dom";

const GET_MOVIE = gql`
  query getMovie($movieId: String!) {
    movie(id: $movieId) {
      id
      title
    }
  }
`;

export default function Movie() {
  const { id } = useParams();
  const { data, loading } = useQuery(GET_MOVIE, {
    variables: {
      movieId: id,
    },
  });
  console.log(data);
  if (loading) {
    return <h1>Fetching Movie...</h1>;
  }
  return <div>{data.movie.title}</div>;
}

 

์–˜๋„ cache ๋จ.

 

 

โœ… Apollo  Client Devtools


 

์—ฌ๋Ÿฌ ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ

 

 

โœ… Local Only Fields


Apollo ํด๋ผ์ด์–ธํŠธ ์ฟผ๋ฆฌ์—๋Š” GraphQL ์„œ๋ฒ„์˜ ์Šคํ‚ค๋งˆ์— ์ •์˜๋˜์ง€ ์•Š์€ ๋กœ์ปฌ ์ „์šฉ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @client ์ง€์‹œ๋ฌธ์€ isLiked๊ฐ€ ๋กœ์ปฌ ์ „์šฉ ํ•„๋“œ์ž„์„ Apollo Client์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

const GET_MOVIE = gql`
  query getMovie($movieId: String!) {
    movie(id: $movieId) {
      id
      title
      medium_cover_image
      rating
      isLiked @client
    }
  }
`;

 

import { HttpLink } from "@apollo/client";
import { ApolloClient, InMemoryCache } from "@apollo/client";
import { LocalState } from "@apollo/client/local-state";

const cache = new InMemoryCache();
const client = new ApolloClient({
  link: new HttpLink({
    uri: "http://localhost:4000/",
  }),
  cache,
  localState: new LocalState(),
});

export default client;

 

โœ… readFragment & writeFragment


readFragment๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ์—†์ด cache์—์„œ random-access(์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ , ์›ํ•˜๋Š” ์œ„์น˜๋ฅผ ๋ฐ”๋กœ ์ ‘๊ทผํ•œ๋‹ค)๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

writeFragment๋Š” ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ cache์˜ data๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
(writeFragment๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ GraphQL ์„œ๋ฒ„์— ํ‘ธ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.)

  const onClick = () => {
    cache.writeFragment({
      id: `Movie:${id}`,
      fragment: gql`
        fragment MovieFragment on Movie {
          isLiked
        }
      `,
      data: {
        isLiked: !data?.movie?.isLiked,
      },
    });
  };

 

ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” useQuery์•ˆ์˜ client๋‚ด์—์„œ ๊ฐ€์ ธ์˜จ cache๋กœ writeFragment๋ฅผ ์‚ฌ์šฉํ•˜์˜€์ง€๋งŒ, client.writeFragment๋กœ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

'๐Ÿงฌ GraphQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

GraphQL - GraphQL Server ์‹œ์ž‘ํ•˜๊ธฐ  (0) 2026.01.02
'๐Ÿงฌ GraphQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • GraphQL - GraphQL Server ์‹œ์ž‘ํ•˜๊ธฐ
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    0๋ ˆ๋ฒจ
    API
    React Native
    SQL
    Python
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    react router
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    Prisma
    tailwindcss
    ๋ชจ๋”ฅ๋‹ค
    dev setup
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    next.js 14
    Next.js
    mongoDB
    Firebase
    PostgreSQL
    MySQL
    next.js 12
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
GraphQL - GraphQL Client ์‹œ์ž‘ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”