☝🏻 GraphQL은 최소한의 요청으로 내가 원하는 정보만 받아 데이터의 낭비와 API 횟수를 줄일 수 있다.
query {
teams {
id
manager
office
extension_number
mascot
cleaning_duty
project
}
}
query {
teams {
manager
office
}
}
query {
team(id: 1) {
manager
office
}
}
query {
team(id: 1) {
manager
office
members {
first_name
last_name
}
}
}
query {
teams {
manager
office
mascot
}
roles {
id
requirement
}
}
mutation {
// 추가 : postTeam
// 수정 : editTeam
// 삭제 : deleteTeam
postTeam (input: {
manager: "John Smith"
office: "104B"
extension_number: "#9982"
mascot: "Dragon"
cleaning_duty: "Monday"
project: "Lordaeron"
}) {
manager
office
extension_number
mascot
cleaning_duty
project
}
}
- Apollo Server: 백엔드 서버
- Apollo Client: 프론트엔드 웹
- 모듈 설치
npm install @apollo/client graphql
- 모듈 import
// ... import { ApolloProvider } from '@apollo/client'; import { ApolloClient, InMemoryCache } from '@apollo/client' // ...
// app.js
// ...
const client = new ApolloClient({
uri: 'http://localhost:4000',
cache: new InMemoryCache()
});
// ...
return (
<div className="App">
<ApolloProvider client={client}>
<header className="App-header">
<h1>Company Management</h1>
<nav>
<ul>
{NavMenus()}
</ul>
</nav>
</header>
<main>
{mainComp[menu]}
</main>
</ApolloProvider>
</div>
);
// ...
REST API의 axios 같은 역할로 해당 uri와 통신을 주고받을 수 있게 해준다.
내부 요소를 감싸줌으로써 내부 요소에서 Apollo Client를 통해 서버와 통신을 주고받을 수 있게 해준다.
요청 객체 만들기
// ...
const GET_ROLES = gql`
query GetRoles {
roles {
id
}
}
`;
// ...
요청 객체를 사용하여 데이터 받아오기
// ...
function AsideItems () {
const { loading, error, data } = useQuery(GET_ROLES);
if (loading) return <p className="loading">Loading...</p>
if (error) return <p className="error">Error :(</p>
//...
}
// ...
// ...
// delete 요청 변수
const DELETE_TEAM = gql`
mutation DeleteTeam($id: ID!) {
deleteTeam(id: $id) {
id
}
}
`
// ...
function execDeleteTeam () {
if (window.confirm('이 항목을 삭제하시겠습니까?')) {
// 함수 실행
deleteTeam({variables: {id: contentId}})
}
}
const [deleteTeam] = useMutation(
//요청 변수가 실행되고 이의 결과로 onCompleted가 실행
DELETE_TEAM, { onCompleted: deleteTeamCompleted })
//onCompleted의 실행 함수
function deleteTeamCompleted (data) {
console.log(data.deleteTeam)
alert(`${data.deleteTeam.id} 항목이 삭제되었습니다.`)
setContentId(0)
}
// ...
☝🏻 데이터는 삭제되었으나 리스트 새로고침이 필요하다면?
const { loading, error, data, refetch } = useQuery(GET_TEMAS)
// ...
let refetchTeams
// ...
const { loading, error, data, refetch } = useQuery(GET_TEMAS)
refetchTeams = refetch
// ...
function deleteTeamCompleted (data) {
// ...
alert(`${data.deleteTeam.id} 항목이 삭제되었습니다.`)
refetchTeams()
}
// ...
수정 및 추가도 같은 구조로 진행된다.
재사용되는 요소들을 Fragment로 분리
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_PEOPLE = gql`
query GetPeople {
people {
id
...names
...healthInfo
}
}
${Names}
${HealthInfo}
`;
얄코님의 유튜브 강좌를 보고 작성되었습니다.
얄코 강좌 바로가기>