GraphQL Client
2022. 1. 20. 21:26ㆍWeb/GraphQL
- Apollo Client 모듈 설치 : npm install @apollo/client graphql
import { ApolloProvider, ApolloClient, InMemoryCache } from '@apollo/client';
- ApolloProvider : React에 ApolloClient를 연결시켜주기 위한 컴포넌트
- ApolloClient : React에 실제로 연결될 Client 생성자
- InMemoryCache : 쿼리 응답 개체를 내부 저장소에 저장시 사용하는 컴포넌트
// App.js
const client = new ApolloClient({
uri : 'http://localhost:4000',
cache : new InMemoryCache()
});
function App() {
return (
<div className="App">
<ApolloProvider client={client}>
...
</ApolloProvider>
</div>
)
}
- Query 사용법
- gql 요청 쿼리 작성
- useQuery hook 이용해서 쿼리문과 파라미터 설정(onCompleted 로 콜백 지정 가능)
import { useQuery, gql } from '@apollo/client';
const GET_ROLE = gql`
query GetRole($id: ID!) {
role(id: $id) {
id
requirement
members {
id
last_name
serve_years
}
equipments {
id
}
softwares {
id
}
}
}
`;
function Roles() {
...
function MainContents () {
console.log("[MainCotents] "+contentId)
const { loading, error, data, refetch } = useQuery(GET_ROLE, {
variables: {id: contentId}
})
if (loading) return <p className="loading">Loading...</p>
if (error) return <p className="error">Error :(</p>
if (data.role === null || contentId === '') return (<div className="roleWrapper">Select Role</div>)
return (
<div className="roleWrapper">
<h2>{data.role.id}</h2>
<div className="requirement"><span>{data.role.requirement}</span> required</div>
<h3>Members</h3>
<ul>
{data.role.members.map((member) => {
return (<li>{member.last_name}</li>)
})}
</ul>
<h3>Equipments</h3>
<ul>
{data.role.equipments.map((equipment) => {
return (<li>{equipment.id}</li>)
})}
</ul>
<h3>Softwares</h3>
{data.role.softwares.map((software) => {
return (<li>{software.id}</li>)
})}
<ul>
</ul>
</div>
);
}
...
}
- Mutation 사용법
- gql 요청 쿼리 작성
- useMutation hook 이용해서 쿼리문과 파라미터 설정, onCompleted 로 콜백 지정
import { useQuery, useMutation, gql } from '@apollo/client';
const DELETE_TEAM = gql`
mutation DeleteTeam($id: ID!) {
deleteTeam(id: $id) {
id
}
}
`;
function Teams() {
...
function execDeleteTeam () { // 클릭이벤트로 지정할 함수
if (window.confirm('이 항목을 삭제하시겠습니까?')) {
deleteTeam({variables: {id: contentId}})
}
}
const [deleteTeam] = useMutation(
DELETE_TEAM, { onCompleted: deleteTeamCompleted })
function deleteTeamCompleted (data) {
console.log(data.deleteTeam)
alert(`${data.deleteTeam.id} 항목이 삭제되었습니다.`)
refetchTeams();
setContentId(0)
}
...
}
- Fragment : gql에서 공통적으로 사용되는 필드셋을 묶어 반복적인 코드를 줄일 수 있음
const Names = gql`
fragment names on People {
first_name
last_name
}
`
const HealthInfo = gql`
fragment healthInfo on People {
sex
blood_type
}
`
const WorkInfo = gql`
fragment workInfo on People {
serve_years
role
team
from
}
`
const GET_PERSON = gql`
query GetPerson($id: ID!) {
person(id: $id) {
id
...names
...healthInfo
...workInfo
tools {
__typename
... on Software {
id
}
... on Equipment {
id
count
}
}
}
}
${Names}
${HealthInfo}
${WorkInfo}
`;
'Web > GraphQL' 카테고리의 다른 글
GraphQL Backend (0) | 2022.01.10 |
---|---|
GraphQL 개념 및 배경 (0) | 2022.01.09 |