
โ 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 |
|---|