๐ก ์ ๋ฐ์ดํฐ ํจ์น ๊ธฐ์ ์ ์ฃผ๋ชฉํด์ผ ํ ๊น์?
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ๋๋ถ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ณ ๊ด๋ฆฌํ๋์ง์ ๋ฌ๋ ค ์์ต๋๋ค. ์ด์ ์๋ `useState`์ `useEffect`๋ฅผ ์กฐํฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ง๋ง, ์ด๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ง์ ๋ฒ๊ทธ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ๊ธฐํ์ต๋๋ค.
- ๋ฐ์ดํฐ ์บ์ฑ(Caching)์ ๋ถ์ฌ๋ก ์ธํ ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ
- ํ๋ฉด์ด ๋ก๋ฉ๋๋ ๋์์ ์ง๋ฃจํ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ
- ์๋ก์ด ๋ฐ์ดํฐ ๋ฐ์์ ์ํ ์๋์ ์ธ ์ฌ์์ฒญ(Refetching)
- ๋ฐ์ดํฐ์ ์ต์ ์ํ๋ฅผ ๋ณด์ฅํ์ง ๋ชปํ๋ Stale Data ๋ฌธ์
์ค๋๋ , ์ด๋ฌํ ๊ณ ํต์ ํด๊ฒฐํด์ฃผ๋ ์๋ก์ด ํจ๋ฌ๋ค์์ด ๋ฑ์ฅํ์ต๋๋ค. ๋ฐ๋ก ์ ์ธ์ ๋ฐ์ดํฐ ํจ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ์จ์ ์ธ API ๋ช ์ธ์ ๋๋ค. ์ด ๊ธ์ ์ด๋ณด ๊ฐ๋ฐ์์ธ ๋น์ ์ด ์ด ํ์ ์ ์ธ ๋ณํ๋ฅผ ์ดํดํ๊ณ , ์ค๋ฌด์ ์ ์ฉํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ๋ด๊ณ ์์ต๋๋ค.
๐ React Query: ์ํ ๊ด๋ฆฌ, ๊ทธ ์ด์์ ๊ฐ์น
React Query(์ต๊ทผ์๋ TanStack Query๋ก ๋ถ๋ฆผ)๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋๋ค. ์ด๋ ์๋ฒ ์ํ(Server State)๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๋ฉฐ, ํ๋ก ํธ์๋์ ๋น๋๊ธฐ ๋ก์ง์ ํ๊ธฐ์ ์ผ๋ก ๋จ์ํํฉ๋๋ค.
⚡ ํต์ฌ ์๋ฆฌ: ์๋ฒ ์ํ ๊ด๋ฆฌ
๐ React Query์ 4๊ฐ์ง ์ด๋ฅ๋ ฅ
- ์๋ ์บ์ฑ (Caching): ์ด๋ฏธ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ๋ถํ์ํ ๋ฐ๋ณต ์์ฒญ์ ๋ง์ต๋๋ค.
- ์๋ ์ฌ์์ฒญ (Refetching): ์๋์ฐ ํฌ์ปค์ค, ๋คํธ์ํฌ ์ฌ์ฐ๊ฒฐ ๋ฑ ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ๋ก๋ฉ/์๋ฌ ์ํ ์ถ์ : `isLoading`, `isError` ๊ฐ์ ์ํ ํ๋๊ทธ๋ฅผ ์ ๊ณตํ์ฌ ๋ณต์กํ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
- ๋๊ด์ ์ ๋ฐ์ดํธ (Optimistic Updates): ์ฌ์ฉ์์ ๋์์ ์ฆ์ ๋ฐ์ํ์ฌ UX๋ฅผ ๊ฐ์ ํ๊ณ , ์ค์ ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
ํนํ `useQuery` ํ ํ๋๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๋ก๋ฉ, ์๋ฌ, ์บ์ฑ๊น์ง ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ ์ด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ๊ทน๋ํํฉ๋๋ค.
๐ GraphQL: ์ํ๋ ๋ฐ์ดํฐ๋ง ์ฝ ์ง์ด ๊ฐ์ ธ์ค๊ธฐ
GraphQL์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๋ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด(Query Language)์ด์ ๋ฐํ์์ ๋๋ค.
✨ GraphQL์ ํต์ฌ ๊ฐ์น
- ์ ํํ ๋ฐ์ดํฐ ์์ฒญ: ํด๋ผ์ด์ธํธ(ํ๋ก ํธ์๋)๊ฐ ํ์ํ ํ๋๋ง ๋ช ์์ ์ผ๋ก ์์ฒญํ๊ณ ๋ฐ์ต๋๋ค.
- ๋จ์ผ ์๋ํฌ์ธํธ: ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๋ํฌ์ธํธ๊ฐ ํ๋๋ก ํตํฉ๋์ด ๊ด๋ฆฌ๊ฐ ์ฉ์ดํฉ๋๋ค.
- Under-fetching ํด์: ์ฌ๋ฌ API ์์ฒญ์ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ํตํฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๐ GraphQL ์ฟผ๋ฆฌ์ ๊ตฌ์กฐ
user(id: "101") {
id
name
posts {
title
}
}
}
๐ก ์ต์ ํธ๋ ๋: ๋ ๊ธฐ์ ์ ์๋์ง ํจ๊ณผ
๐ฅ ์๋์ง ํจ๊ณผ ์์ฝ
| ๊ธฐ์ | ์ญํ ๋ฐ ๊ฐ์ | ์ ๊ณตํ๋ ๊ฐ์น |
|---|---|---|
| GraphQL | API ํต์ ์ต์ ํ (๋ฐ์ดํฐ๋ ๋ฐ ์์ฒญ ํ์ ๊ด๋ฆฌ) | ๋คํธ์ํฌ ํจ์จ์ฑ ์ฆ๋, ์ค๋ฒํจ์นญ ๋ฐฉ์ง |
| React Query | ํ๋ก ํธ์๋ ์ํ ๊ด๋ฆฌ (์บ์ฑ, ์ฌ์์ฒญ ๋ก์ง) | ๊ฐ๋ฐ ํธ์์ฑ ํฅ์, UX ์์ ์ฑ ํ๋ณด |
GraphQL์ '๋ฌด์์ ๊ฐ์ ธ์ฌ์ง'๋ฅผ ๊ฒฐ์ ํ๊ณ , React Query๋ '์ธ์ , ์ด๋ป๊ฒ ์บ์ฑํ๊ณ ์ฌ์์ฒญํ ์ง'๋ฅผ ๊ฒฐ์ ํ๋ ๊ฐ๋ ฅํ ์กฐํฉ์ ๋๋ค.
์ค์ฉ์ ์ธ ์ ์ฉ ํ
๋น์ ์ด ์ด ๊ธฐ์ ๋ค์ ์ฒ์ ์ ํ๋ค๋ฉด, ๋ค์์ ๋จ๊ณ๋ก ์ ๊ทผํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
- React Query๋ถํฐ ์์: ๊ธฐ์กด REST API ํ๊ฒฝ์์๋ useQuery ํ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์บ์ฑ๊ณผ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๋ ๊ฒฝํ์ ํด๋ณด์ธ์.
- GraphQL ๊ฐ๋ ํ์ต: ์ฟผ๋ฆฌ, ๋ฎคํ ์ด์ , ์คํค๋ง์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ตํ ๋ฐ์ดํฐ ์์ฒญ์ ์ ์ฐ์ฑ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ํตํฉ ์ ์ฉ: Apollo Client๋ Relay ๊ฐ์ GraphQL ์ ์ฉ ํด๋ผ์ด์ธํธ ๋์ , React Query์ GraphQL์ ํจ๊ป ์ฌ์ฉํ์ฌ ์บ์ฑ ๋ก์ง์ ํตํฉํ๋ ๋ฐฉ์์ ๊ณ ๋ คํด ๋ณด์ธ์. GraphQL ํต์ ์ React Query์ `queryFn`์ ์ ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
์ด๋ฌํ ์ต์ ๋๊ตฌ๋ค์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ด ๋ณด์ผ๋ฌ ํ๋ ์ดํธ(Boilerplate) ์ฝ๋ ์์ฑ ์๊ฐ์ ์ค์ด๊ณ , ์ง์ ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋๋ก ๋๋ ํ์์ ์ธ ์ง์์ ๋๋ค.
๐ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋ฏธ๋, ์ง๊ธ ์์ํ์ธ์!
๐ ํต์ฌ ์์ฝ
- React Query: ๋ณต์กํ ์๋ฒ ์ํ ๊ด๋ฆฌ ๋ก์ง์ ์๋ํํ์ฌ ๊ฐ๋ฐ ํธ์์ฑ์ ๊ทน๋ํํฉ๋๋ค.
- GraphQL: ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ง ์์ฒญํ๊ฒ ํ์ฌ ๋คํธ์ํฌ ํจ์จ์ฑ์ ํ์ ์ ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
- ๋ค์ ๋จ๊ณ: ๋น์ ์ ํ๋ก์ ํธ์ React Query๋ฅผ ์ ์ฉํ์ฌ ์บ์ฑ๊ณผ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ๋ฅผ ์์ํด๋ณด๊ณ , ์ ์ง์ ์ผ๋ก GraphQL ๋์ ์ ๊ฒํ ํด๋ณด์ธ์. ์ด๊ฒ์ด ๋ฐ๋ก ์ฐจ์ธ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก ๋์๊ฐ๋ ๊ธธ์ ๋๋ค.
์ด ๊ธฐ์ ๋ค์ ๋ง์คํฐํ๋ค๋ฉด, ๋น์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์์๊ฒ ๋์ฑ ๋น ๋ฅด๊ณ ์์ ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ ๊ฒ์ ๋๋ค.

๋๊ธ ์ฐ๊ธฐ