아래는 apollo-client
의 세팅방식으로 React
를 사용한 서버에 apollo-client
를 적용하여 구성했다.
이 포스팅은 React
를 활용하기만 할 뿐 apollo-client
의 세팅을 위주로 작성되며 React
관련 내용은 다루지 않는다. React
세팅방법 참고
# npm 사용할 경우
> npm i @apollo/client graphql
# yarn 사용할 경우
> yarn add @apollo/client graphql
import { BrowserRouter } from 'react-router-dom';
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import { ApolloClient, InMemoryCache, ApolloProvider, createHttpLink } from '@apollo/client';
const httpLink = createHttpLink({
// 연결할 'apollo-server'의 url
uri: 'http://localhost:4000/graphql',
});
const client = new ApolloClient({
link: httpLink,
cache: new InMemoryCache(),
defaultOptions: {
watchQuery: {
// 각자 프로젝트에 맞게 설정
fetchPolicy: 'cache-and-network',
},
},
});
const rootElement = document.getElementById('root');
if (!rootElement) throw new Error('Failed to find the root element');
const root = ReactDOM.createRoot(rootElement);
root.render(
<ApolloProvider client={client}>
<BrowserRouter>
<App />
</BrowserRouter>
</ApolloProvider>
)
간단하게 정리하자면 apollo-client
서버를 생성하여 ApolloProvider
노드에게 파라미터로 전달해주고 ApolloProvider
노드로 React
의 App
노드를 감싸주면 된다. 참고로 BrowserRouter
는 React
의 라우팅을 위해 사용한다.
client
에게 전달한 httpLink
는 NodeJS
의 내장 라이브러리인 createHttpLink
함수를 통해 생성하였다. 이렇게 하면 server-side
의 apollo-server
와 연결이 되고 세팅은 다 끝났다고 볼 수 있다.
client
에게 전달한 InMemoryCache
객체는 Apollo
에 내장된 캐싱 기능을 하는 객체로 매우 핵심적인 기능중 하난데, apollo-client
에서는 React Query
처럼 useQuery
, useMutation
등의 hook
을 사용하여 API를 호출하는데 이 통신의 효율성을 위해 한번 쿼리된 결과를 캐싱하여 메모리에 저장해둔다.
이게 'Apollo란?' 포스팅에서 설명한 전역 상태 관리 기능에 사용되는 것이다. 쿼리된 결과를 메모리상에 저장해두기 때문에 다른 컴포넌트에게 그 값을 redux
등을 사용해 전달할 필요 없이 쿼리하여 메모리에서 가져다 쓸 수 있게 된다.
그러므로 watchQuery
에서 설정한 fetchPolicy
가 매우 중요한 것이다. 캐시처리를 어느정도로 할 지를 프로젝트의 성격이나 개발자의 취향 등에 맞게 설정하되 잘 설정하면 자원을 매우 절약할 수 있다.
[GraphQL] apollo-server 세팅하기 - NodeJS (apollo-server-express)