Apollo Client
https://www.apollographql.com/docs/react/
GraphQL
์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ๊ณผ ์๊ฒฉ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ํ์น, ์บ์, ์์ ํ ๋ ์ฌ์ฉํ๋ค.
๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์๋์ผ๋ก UI ์ ๋ฐ์ดํธ ํ๋ค.
ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ@apollo/client์ React๊ฐ ์ ๋ชฉ๋์ด ์๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ
ref. https://www.apollographql.com/docs/react/get-started/
1. ์ค์น
npm install @apollo/client graphql
@apollo/client
:Apollo Client
์ธํ ์ ํ์ํ ํจํค์ง๋ก, in-memory ์บ์, ๋ก์ปฌ์ํ ๊ด๋ฆฌ, ์๋ฌ ์ฒ๋ฆฌ, ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ค.
graphql
: GraphQL ์ฟผ๋ฆฌ ํ์ฑ์ ๋ด๋นํ๋ ํจํค์ง
2. ApolloClient
์ด๊ธฐํ
ApolloClient
์ด๊ธฐํ
2-1.
ํ์ํ ๋ชจ๋ ์ถ๊ฐ
import {
ApolloClient,
InMemoryCache,
ApolloProvider,
useQuery,
gql
} from "@apollo/client";
2-2. ApolloClient ์ด๊ธฐํ
uri
,cache
์์ฑ์ ๊ฐ์ง ์ค์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค.
const client = new ApolloClient({
uri: 'https://48p1r2roz4.sse.codesandbox.io',
cache: new InMemoryCache()
});
uri
GraphQL ์๋ฒURL
cache
InMemoryCache ์ธ์คํด์ค, Apollo Client
๊ฐ์ฟผ๋ฆฌ ํ์น ํ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ธฐ ์ํด
์ฌ์ฉ
์ฐธ๊ณ : ์๋ฐ์คํฌ๋ฆฝํธ ์ฌ์ฉ ์์
client
.query({
query: gql`
query GetRates {
rates(currency: "USD") {
currency
}
}
`
})
// ์๋ต์ data ์์ฑ ์ธ, loading ์ neworkStatus ์์ฑ ํ์ธ ๊ฐ๋ฅ
.then(result => console.log(result));
3. ๋ฆฌ์กํธ ์ฐ๋ํ๊ธฐ
์ฟผ๋ฆฌ๋ฅผ ์ฐ๋ํ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก UI๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์๋ค.
ApolloProvider
(๋ฆฌ์กํธ Context.Provider
์ ์ ์ฌ) ์ปดํฌ๋ํธ๋ก ๋ฆฌ์กํธ app๋ฅผ ๊ฐ์ธ Apollo Client Context
์์ ๋๋ค.
GraphQL data
๊ฐ ํ์ํ ์ปดํฌ๋ํธ ์ต ์์์ ๋์ด ์ด๋์๋ ์ ๊ทผํ ์ ์๊ฒ ํ๋ค.
import React from 'react';
import { render } from 'react-dom';
import {
ApolloClient,
InMemoryCache,
ApolloProvider,
useQuery,
gql
} from "@apollo/client";
const client = new ApolloClient({
uri: 'https://48p1r2roz4.sse.codesandbox.io',
cache: new InMemoryCache()
});
function App() {
return (
<div>
<h2>My first Apollo app ๐</h2>
</div>
);
}
render(
<ApolloProvider client={client}> <App /> </ApolloProvider>, document.getElementById('root'),
);
4. useQuery ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
useQuery
: UI ์ GraphQL ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฆฌ์กํธ ํ
// query ์
const EXCHANGE_RATES = gql`
query GetExchangeRates {
rates(currency: "USD") {
currency
rate
}
}
`;
// useQuery ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
// ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ ๋๋ง๋ค useQuery๊ฐ ์คํ๋๊ณ ๋ฐ์ดํฐ์ ๋ฐ๋ผ UI๊ฐ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋๋ค.
// ์๋ต ๊ฐ์ฒด๋ loading, error ์ํ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ธ data ์์ฑ์ ๊ฐ์ง๋ค.
function ExchangeRates() {
const { loading, error, data } = useQuery(EXCHANGE_RATES);
if (loading) return <p>Loading...</p>;
if (error) return <p>Error :(</p>;
return data.rates.map(({ currency, rate }) => (
<div key={currency}>
<p>
{currency}: {rate}
</p>
</div>
));
}
Last updated
Was this helpful?