프론트엔드/GraphQL
[GraphQL] 3. useQuery
zzocco94
2023. 2. 15. 14:44
노마드 코더의 [GraphQL로 영화 웹 앱 만들기]
강의를 보고 정리한 글입니다.
장점
GraphQL의 useQuery hook을 사용하면 선언형으로 코드를 작성할 수 있다.
선언형 코드 : 원하는 걸 설명하기 위한 코드만을 적는다
명령형 코드 : 모든 단계의 코드를 적는다.
명령형
- 쿼리 요청을 보내고 -> state에 저장한다
function Movies() {
const [movies, setMovies] = useState([]);
const client = useApolloClient();
useEffect(() => {
client
.query({
query: gql`
{
allMovies {
title
id
}
}
`,
})
.then((result) => setMovies(result.data.allMovies));
}, [client]);
}
...
}
선언형
- 무엇을 원하는지 적는다
const ALL_MOVIES = gql`
query getMovies {
allMovies {
title
id
}
}
`;
function Movies() {
const { data } = useQuery(ALL_MOVIES);
...
}
사용법 : 변수가 없을 때
- data, loading, error
const ALL_MOVIES = gql`
query getMovies {
allMovies {
title
id
}
}
`;
function Movies() {
const { data, loading, error } = useQuery(ALL_MOVIES);
if (loading) return <h1>loading...</h1>;
if (error) return <h1>Colud not fetch :(</h1>;
return (
<ul>
{data.allMovies.map(movie => <li key={movie.id}>{movie.title}</li>)}
</ul>
);
}
사용법 : 변수가 있을 때
- variables에 필요한 변수를 작성한다.
import { gql, useQuery } from "@apollo/client";
import { useParams } from "react-router-dom";
const GET_MOVIE = gql`
query getMovie($movieId: String!) {
movie(id: $movieId) {
id
title
}
}
`;
function Movie() {
const { id } = useParams();
const { data, loading, error } = useQuery(GET_MOVIE, {
variables: {
movieId: id,
},
});
if (loading) <h1>Fetching Movie...</h1>;
if (error) <h1>Could not fetch :(</h1>;
return <div>{data.movie.title}</div>;
}
export default Movie;
InMemoryCache
쿼리 결과가 브라우저 메모리에 있는 cache에 저장되기 때문에
최초의 fetch 이후에는 fetch를 하지 않고 loading 없이 화면을 볼 수 있다.