The Official React Query Course - ๐ฎ query.gg
Master React Query with mystifying ease. Built in collaboration with the React Query core team.
query.gg
TanStack | High Quality Open-Source Software for Web Developers
Headless, type-safe, powerful utilities for complex workflows like Data Management, Data Visualization, Charts, Tables, and UI Components.
tanstack.com
๋ณดํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋์๋ ์ฌ๋ฌ๊ฐ์ง ์ด์ ๊ฐ ์กด์ฌํ์ง๋ง, ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ณธ์ธ์ด ์ง์ ํ๊ธฐ ์ด๋ ต๊ฑฐ๋ ๊น๋ค๋ก์ด ์์ ์ ์ด๋ฏธ ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ์ถ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋๋ ํ๋ ์์ํฌ)๋ฅผ ์ด์ฉํ์ฌ ์กฐ๊ธ ๋ ํธํ๊ฒ ์์ ํ๊ธฐ ์ํ ์ด์ ๊ฐ ๊ฐ์ฅ ํฝ๋๋ค.
The library for web and native user interfaces
๋น์ฅ ๋ฆฌ์กํธ๋ง ํด๋ UI๋ฅผ ํธํ๊ฒ ๊ตฌํํ๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฑ์ ์ด์ฉํ๋ ์ด์ ๊ฐ ์์ ๊ฐ๋ค๋ฉด, ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๊ฒฐํ๊ธฐ ๊น๋ค๋ก์ด ๋ถ๋ถ์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ถ์ํ ํด๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ผ๊ฒ์ ๋๋ค.
์ด๋ฒ ๊ธ์์ ๋ค๋ฃฐ ๋ฆฌ์กํธ ์ฟผ๋ฆฌ ๋ํ ์ด๋ ํ ๋ฌธ์ ์ ๋ํด์ ์ดํดํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ถ์ํ ํด๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์กํธ ์ฟผ๋ฆฌ๋ ์ด๋ค ๋ถ๋ถ์ ์ถ์ํํ์์๊น์?
๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ฆฌ์กํธ ํ ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
๋ฆฌ์กํธ ํ ์ ๋ฆฌ์กํธ๊ฐ ํด๋์คํ์์ ํจ์ํ์ผ๋ก ๋์ด์ค๋ฉด์ ์ฌ๋ฌ ๋ก์ง๋ค์ด ๋ฏธ๋ฆฌ ์ ์ ํด๋๊ณ ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ์ปจํธ๋กคํ ์ ์๊ฒ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ๋๋ค.
์ข ๋ ์์ธํ ์ดํด๋ณด๋ฉด ์์ ์ธ๊ธํ ๋๋ก ๋ฆฌ์กํธ๋ UI ๋ ๋๋ง์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฌ๊ธฐ์ ๋์์ค๋ค๋ ๊ฒ์ ์ฌ์ฉ์(๊ฐ๋ฐ์)๊ฐ ์ํ๋ง ์ปจํธ๋กคํ๋ฉด ๊ทธ๊ฑฐ์ ๋ฐ๋ฅธ UI๋ ๋ฆฌ์กํธ์์ ์์์ ๊ทธ๋ ค์ค๋๋ค.
๋ํ ์ด๋ ๊ฒ ์ํ์ ๋ก์ง ๊ทธ๋ฆฌ๊ณ UI๋ฅผ ์บก์ํํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด `Component`์ ๋๋ค.
๋ฆฌ์กํธ ํ์์๋ ์๊ฐ์ ์ธ ์์๋ฅผ ์บก์ํํด์ ์ปดํฌ๋ํธ๋ก ๊ด๋ฆฌํ๋ฏ์ด, ๋น์๊ฐ์ ์ธ ์์๋ ์บก์ํ๋ฅผ ํ์ฌ ์ฌ์ฌ์ฉ์ฑ๋ฑ์ ๋์ฌ์ฃผ๊ธฐ ์ํด `React Hooks`๋ฅผ ์ ๊ณตํด์ฃผ์์ต๋๋ค.
์๋ฅผ๋ค์ด state๋ฅผ ์์ฑํด์ฃผ๊ณ , ํด๋น state๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ๋ `useState`ํ ์ด ์์ต๋๋ค.
์ด๋ ๊ฒ ํ ๋ค์ ์ญ ์ดํด๋ณด๋ค๋ณด๋ฉด ๋ฌด์ธ๊ฐ ๋น ์ง๋๋์ด ๋ค์์์ต๋๋ค.
์ฌ์ค ํ๋ ์น/์ฑ์์ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ ๋น์๊ฐ์ ์์ ์ค ํ๋๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๋๋ค.
ํ์ง๋ง ๋ฆฌ์กํธ ํ ๋ค์ค ์ง์ ์ ์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ํ ์ ์กด์ฌํ์ง ์์ต๋๋ค.
๋ฌผ๋ก `useEffect`์ ๋ฐ์ดํฐ ํจ์นญ ๋ก์ง์ ๋ฃ์ด์ ๊ฐ์ ธ์จ ํ `useState`๋ก ๊ทธ๊ฒ์ ์ํํํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ์ด๊ฒ์ ์ง์ ์ ์ธ ๋ฐ์ดํฐ ํจ์นญ ๊ธฐ๋ฅ์ด๋ผ๊ณ ํ ์ ์์๊ฑฐ๊ฐ์ต๋๋ค.
๋ํ ์ด๋ ๊ฒ ๊ด๋ฆฌํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๊ณ ๋ คํด์ผํ ๊ฒ๋ค์ด ๋๋ฌด ๋ง์ต๋๋ค.
์์๋ ์๋์ ๊ฐ์ต๋๋ค
export default function App () {
const [id, setId] = React.useState(1)
const [data, setData] = React.useState(null)
React.useEffect(() => {
const handleFetchData = async () => {
setData(null)
const res = await fetch(`https://example.api.com/api/v1/${id}`)
const json = await res.json()
setData(json)
}
handleFetchData()
}, [id])
return (
<>
{/* ๋ฐ์ดํฐ ํ์ */}
</>
)
}
์์ ์ธ๊ธํ๋๋ก ์ด๋ ๊ฒ ๋ฐ์ดํฐ ํจ์นญ ๋ก์ง์ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด๊ฒ ์ข์ ์ฝ๋์ผ๊น์?
์ฌ๊ธฐ์๋ ๋ก๋ฉ, ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๋น ์ ธ์์ต๋๋ค... ์๋๋ ๋ก๋ฉ, ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ถ๊ฐ๋ ์ฝ๋์ ๋๋ค.
export default function App () {
const [id, setId] = React.useState(1)
const [data, setData] = React.useState(null)
const [isLoading, setIsLoading] = React.useState(true)
const [error, setError] = React.useState(null)
React.useEffect(() => {
const handleFetchData = async () => {
setData(null)
setIsLoading(true)
setError(null)
try {
const res = await fetch(`https://example.api.com/api/v1/${id}`)
if (!res.ok) {
throw new Error(`${id}์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์คํจํ์์ต๋๋ค.`)
}
const json = await res.json()
setData(json)
setIsLoading(false)
} catch (err) {
setError(e.message)
setIsLoading(false)
}
}
handleFetchData()
}, [id])
return (
<>
{/* ๋ฐ์ดํฐ ํ์ */}
</>
)
}
์ด์ ์๋ฒฝํ ๋ฐ์ดํฐ ํจ์นญ ์ฝ๋์ผ๊น์?
์๋๋๋ค. ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ๋งํ ์์๊ฐ ์กด์ฌํ๊ณ ๊ทธ ๋ถ๋ถ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค.
๋ง์ฝ ์ด๋ ํ ์ด์ ๋ก ์์ฒญ์ด ๋์์ ๋๋ฒ ๋ ๋ผ๊ฐ๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด => `id: 1`์ ๋ํ ์์ฒญ์ด ๋ ๋ผ๊ฐ ์งํ ๋ฐ๋ก `id: 2`์ ๋ํ ์์ฒญ์ด ๋ ๋ผ๊ฐ ๊ฒฝ์ฐ
ํด๋ผ์ด์ธํธ์์๋ ํ์ฌ id๋ 3์ด์ง๋ง ์ต์ข ๋์ฐฉํ ๋ฐ์ดํฐ๋ 2์ ๋ํ ๋ฐ์ดํฐ๋ผ๋ฉด ๋ทฐ๋ 2์ ๋ํ ๋ทฐ์ผ๊ฒ์ด๊ณ , ์ด๊ฑฐ๋ ์ํ์ ๋ทฐ์ ๋ถ์ผ์น๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๊ฑฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
export default function App () {
const [id, setId] = React.useState(1)
const [data, setData] = React.useState(null)
const [isLoading, setIsLoading] = React.useState(true)
const [error, setError] = React.useState(null)
React.useEffect(() => {
let ignore = false
const handleFetchData = async () => {
setData(null)
setIsLoading(true)
setError(null)
try {
const res = await fetch(`https://example.api.com/api/v1/${id}`)
if (ignore) {
return
}
if (!res.ok) {
throw new Error(`${id}์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์คํจํ์์ต๋๋ค.`)
}
const json = await res.json()
setData(json)
setIsLoading(false)
} catch (err) {
setError(e.message)
setIsLoading(false)
}
}
handleFetchData()
return () => {
ignore = true
}
}, [id])
return (
<>
{/* ๋ฐ์ดํฐ ํ์ */}
</>
)
}
๋จ ํ๋์ ๋ฐ์ดํฐ ํจ์นญ์ ์ํด ๋ก์ง์ ์ด๋ ๊ฒ ๊ธธ๊ฒ ์์ฑํด์ผํฉ๋๋ค. (๋ฌผ๋ก ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌ ๊ฐ๋ฅํฉ๋๋ค)
ํ์ง๋ง ์ด๋ ๊ฒ ํด๋ ์์ง ๋ฌธ์ ๊ฐ ๋จ์์์ต๋๋ค
๋ง์ฝ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์จ์ผํด์ ์์ ๋ก์ง์ ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌํ ํ A ์ปดํฌ๋ํธ์ B ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ๊ฐ์ ธ์ฌ๋, ๋ฐ์ดํฐ ์ค๋ณต / ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ์ผ์ด๋ ์ ์์ต๋๋ค.
์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ ์ค๋ณต์ ๋ถ๋ช ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๊ฒ์ด์ง๋ง, ๊ฐ ์ปดํฌ๋ํธ๋ ๊ณ ์ ํ ์ธ์คํด์ค์ด๋ฏ๋ก ๋ ์ปดํฌ๋ํธ ๋ชจ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ก๋ฉ ํ์๋ฅผ ํด์ฃผ์ด์ผํ ๊ฒ์ ๋๋ค.
๋๋ฒ์งธ ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฌธ์ ๋ ๋ ๋ฌธ์ ๊ฐ๋ฉ๋๋ค.
๋ง์ฝ์ A ์ปดํฌ๋ํธ์์๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๋๋ฐ ์ฑ๊ณตํ์์ง๋ง, B์์๋ ์คํจํ๋ค๋ฉด ์ด๋ ๋ฆฌ์กํธ์ ๊ทผ๋ณธ์ ์ธ ์์ด๋์ด์ธ ์์ธก์ฑ์ ๋ฌด๋ํธ๋ฆด๊ฒ์ ๋๋ค.
์๋๋ฉด A ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ฌ๋๋ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๊ฐ a์์ง๋ง ๋ช์ดํ B ์ปดํฌ๋ํธ์์ ๊ฐ์ ธ์ฌ๋์๋ a-1์ผ์๋์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Context API๋ฅผ ๋์ ํ์ฌ ์ ์ญ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ ์๊ฐ ์ด์ `useState`, `useEffect`, `Context`๋ฅผ ๋ชจ๋ ๊ด๋ฆฌํด์ผํ๋ ์ด๋ ค์์ด ์๊ธฐ๋ฉฐ, Context API์ ์ต์ ํ ๋ฌธ์ ๋ ๊ณ ๋ คํด์ผํฉ๋๋ค
๋ง์ฝ ๋ค๋ฅธ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ ์ฌ์ ํ ์๋ฒ ์ํ๋ฅผ ํด๋ผ์ด์ธํธ ์ํ๋ก ๊ด๋ฆฌํ๋ ๋ฌธ์ ,, ์ฆ ๋น๋๊ธฐ ์ํ๋ฅผ ๋๊ธฐ ์ํ๋ก ๊ด๋ฆฌํ๋ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ ๋์์ ์ค ์ ์๋ ๊ฒ์ด React Query์ ๋๋ค.
์ดํ ๊ธ์์ React Query์ ๋ํด์ ํ๋์ฉ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค
02 - React Query with Suspense
[React] React Query ์์๋ณด๊ธฐ 02 - React Query with Suspense
Suspense์ ํ์์ฑ์๋ฒ ์ํ๋ฅผ ๋ค๋ฃฐ ๋, ์ค์ํ๊ฒ ๊ณ ๋ คํด์ผ ํ ์ ์ค ํ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์์ ๊ณผ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์์ ์ฌ์ด์ ์ผ์ ํ ์๊ฐ์ด ์กด์ฌํ๋ค๋ ์ ์ ๋๋ค.์ด ๋ง์ ์ฆ, ๋ฐ์ดํฐ
joseph0926.tistory.com
[React] React Query ์์๋ณด๊ธฐ 03 - React Query with SSR
React ์ฑ์ ์ ํต์ ์ธ ๋ฐฉ์๊ณผ ๋ณํ๊ธฐ๋ณธ์ ์ผ๋ก React๋ SPA์ ๋๋ค.์ด ๋ง์ ์ฆ ์ด๊ธฐ์ HTML ๊ป๋ฐ๊ธฐ์ js ๋ฒ๋ค์ ์ ๊ณตํ๊ณ ์ดํ์๋ js๋ฅผ ์ด์ฉํ์ฌ ์ปจํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ ๋ป์ ๋๋ค.ํ์ง
joseph0926.tistory.com
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
The Official React Query Course - ๐ฎ query.gg
Master React Query with mystifying ease. Built in collaboration with the React Query core team.
query.gg
TanStack | High Quality Open-Source Software for Web Developers
Headless, type-safe, powerful utilities for complex workflows like Data Management, Data Visualization, Charts, Tables, and UI Components.
tanstack.com
๋ณดํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋์๋ ์ฌ๋ฌ๊ฐ์ง ์ด์ ๊ฐ ์กด์ฌํ์ง๋ง, ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ณธ์ธ์ด ์ง์ ํ๊ธฐ ์ด๋ ต๊ฑฐ๋ ๊น๋ค๋ก์ด ์์ ์ ์ด๋ฏธ ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ์ถ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋๋ ํ๋ ์์ํฌ)๋ฅผ ์ด์ฉํ์ฌ ์กฐ๊ธ ๋ ํธํ๊ฒ ์์ ํ๊ธฐ ์ํ ์ด์ ๊ฐ ๊ฐ์ฅ ํฝ๋๋ค.
The library for web and native user interfaces
๋น์ฅ ๋ฆฌ์กํธ๋ง ํด๋ UI๋ฅผ ํธํ๊ฒ ๊ตฌํํ๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฑ์ ์ด์ฉํ๋ ์ด์ ๊ฐ ์์ ๊ฐ๋ค๋ฉด, ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๊ฒฐํ๊ธฐ ๊น๋ค๋ก์ด ๋ถ๋ถ์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ถ์ํ ํด๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ผ๊ฒ์ ๋๋ค.
์ด๋ฒ ๊ธ์์ ๋ค๋ฃฐ ๋ฆฌ์กํธ ์ฟผ๋ฆฌ ๋ํ ์ด๋ ํ ๋ฌธ์ ์ ๋ํด์ ์ดํดํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ถ์ํ ํด๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์กํธ ์ฟผ๋ฆฌ๋ ์ด๋ค ๋ถ๋ถ์ ์ถ์ํํ์์๊น์?
๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ฆฌ์กํธ ํ ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
๋ฆฌ์กํธ ํ ์ ๋ฆฌ์กํธ๊ฐ ํด๋์คํ์์ ํจ์ํ์ผ๋ก ๋์ด์ค๋ฉด์ ์ฌ๋ฌ ๋ก์ง๋ค์ด ๋ฏธ๋ฆฌ ์ ์ ํด๋๊ณ ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ์ปจํธ๋กคํ ์ ์๊ฒ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ๋๋ค.
์ข ๋ ์์ธํ ์ดํด๋ณด๋ฉด ์์ ์ธ๊ธํ ๋๋ก ๋ฆฌ์กํธ๋ UI ๋ ๋๋ง์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฌ๊ธฐ์ ๋์์ค๋ค๋ ๊ฒ์ ์ฌ์ฉ์(๊ฐ๋ฐ์)๊ฐ ์ํ๋ง ์ปจํธ๋กคํ๋ฉด ๊ทธ๊ฑฐ์ ๋ฐ๋ฅธ UI๋ ๋ฆฌ์กํธ์์ ์์์ ๊ทธ๋ ค์ค๋๋ค.
๋ํ ์ด๋ ๊ฒ ์ํ์ ๋ก์ง ๊ทธ๋ฆฌ๊ณ UI๋ฅผ ์บก์ํํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด `Component`์ ๋๋ค.
๋ฆฌ์กํธ ํ์์๋ ์๊ฐ์ ์ธ ์์๋ฅผ ์บก์ํํด์ ์ปดํฌ๋ํธ๋ก ๊ด๋ฆฌํ๋ฏ์ด, ๋น์๊ฐ์ ์ธ ์์๋ ์บก์ํ๋ฅผ ํ์ฌ ์ฌ์ฌ์ฉ์ฑ๋ฑ์ ๋์ฌ์ฃผ๊ธฐ ์ํด `React Hooks`๋ฅผ ์ ๊ณตํด์ฃผ์์ต๋๋ค.
์๋ฅผ๋ค์ด state๋ฅผ ์์ฑํด์ฃผ๊ณ , ํด๋น state๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ๋ `useState`ํ ์ด ์์ต๋๋ค.
์ด๋ ๊ฒ ํ ๋ค์ ์ญ ์ดํด๋ณด๋ค๋ณด๋ฉด ๋ฌด์ธ๊ฐ ๋น ์ง๋๋์ด ๋ค์์์ต๋๋ค.
์ฌ์ค ํ๋ ์น/์ฑ์์ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ ๋น์๊ฐ์ ์์ ์ค ํ๋๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๋๋ค.
ํ์ง๋ง ๋ฆฌ์กํธ ํ ๋ค์ค ์ง์ ์ ์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ํ ์ ์กด์ฌํ์ง ์์ต๋๋ค.
๋ฌผ๋ก `useEffect`์ ๋ฐ์ดํฐ ํจ์นญ ๋ก์ง์ ๋ฃ์ด์ ๊ฐ์ ธ์จ ํ `useState`๋ก ๊ทธ๊ฒ์ ์ํํํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ์ด๊ฒ์ ์ง์ ์ ์ธ ๋ฐ์ดํฐ ํจ์นญ ๊ธฐ๋ฅ์ด๋ผ๊ณ ํ ์ ์์๊ฑฐ๊ฐ์ต๋๋ค.
๋ํ ์ด๋ ๊ฒ ๊ด๋ฆฌํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๊ณ ๋ คํด์ผํ ๊ฒ๋ค์ด ๋๋ฌด ๋ง์ต๋๋ค.
์์๋ ์๋์ ๊ฐ์ต๋๋ค
export default function App () {
const [id, setId] = React.useState(1)
const [data, setData] = React.useState(null)
React.useEffect(() => {
const handleFetchData = async () => {
setData(null)
const res = await fetch(`https://example.api.com/api/v1/${id}`)
const json = await res.json()
setData(json)
}
handleFetchData()
}, [id])
return (
<>
{/* ๋ฐ์ดํฐ ํ์ */}
</>
)
}
์์ ์ธ๊ธํ๋๋ก ์ด๋ ๊ฒ ๋ฐ์ดํฐ ํจ์นญ ๋ก์ง์ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด๊ฒ ์ข์ ์ฝ๋์ผ๊น์?
์ฌ๊ธฐ์๋ ๋ก๋ฉ, ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๋น ์ ธ์์ต๋๋ค... ์๋๋ ๋ก๋ฉ, ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ถ๊ฐ๋ ์ฝ๋์ ๋๋ค.
export default function App () {
const [id, setId] = React.useState(1)
const [data, setData] = React.useState(null)
const [isLoading, setIsLoading] = React.useState(true)
const [error, setError] = React.useState(null)
React.useEffect(() => {
const handleFetchData = async () => {
setData(null)
setIsLoading(true)
setError(null)
try {
const res = await fetch(`https://example.api.com/api/v1/${id}`)
if (!res.ok) {
throw new Error(`${id}์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์คํจํ์์ต๋๋ค.`)
}
const json = await res.json()
setData(json)
setIsLoading(false)
} catch (err) {
setError(e.message)
setIsLoading(false)
}
}
handleFetchData()
}, [id])
return (
<>
{/* ๋ฐ์ดํฐ ํ์ */}
</>
)
}
์ด์ ์๋ฒฝํ ๋ฐ์ดํฐ ํจ์นญ ์ฝ๋์ผ๊น์?
์๋๋๋ค. ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ๋งํ ์์๊ฐ ์กด์ฌํ๊ณ ๊ทธ ๋ถ๋ถ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค.
๋ง์ฝ ์ด๋ ํ ์ด์ ๋ก ์์ฒญ์ด ๋์์ ๋๋ฒ ๋ ๋ผ๊ฐ๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด => `id: 1`์ ๋ํ ์์ฒญ์ด ๋ ๋ผ๊ฐ ์งํ ๋ฐ๋ก `id: 2`์ ๋ํ ์์ฒญ์ด ๋ ๋ผ๊ฐ ๊ฒฝ์ฐ
ํด๋ผ์ด์ธํธ์์๋ ํ์ฌ id๋ 3์ด์ง๋ง ์ต์ข ๋์ฐฉํ ๋ฐ์ดํฐ๋ 2์ ๋ํ ๋ฐ์ดํฐ๋ผ๋ฉด ๋ทฐ๋ 2์ ๋ํ ๋ทฐ์ผ๊ฒ์ด๊ณ , ์ด๊ฑฐ๋ ์ํ์ ๋ทฐ์ ๋ถ์ผ์น๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๊ฑฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
export default function App () {
const [id, setId] = React.useState(1)
const [data, setData] = React.useState(null)
const [isLoading, setIsLoading] = React.useState(true)
const [error, setError] = React.useState(null)
React.useEffect(() => {
let ignore = false
const handleFetchData = async () => {
setData(null)
setIsLoading(true)
setError(null)
try {
const res = await fetch(`https://example.api.com/api/v1/${id}`)
if (ignore) {
return
}
if (!res.ok) {
throw new Error(`${id}์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์คํจํ์์ต๋๋ค.`)
}
const json = await res.json()
setData(json)
setIsLoading(false)
} catch (err) {
setError(e.message)
setIsLoading(false)
}
}
handleFetchData()
return () => {
ignore = true
}
}, [id])
return (
<>
{/* ๋ฐ์ดํฐ ํ์ */}
</>
)
}
๋จ ํ๋์ ๋ฐ์ดํฐ ํจ์นญ์ ์ํด ๋ก์ง์ ์ด๋ ๊ฒ ๊ธธ๊ฒ ์์ฑํด์ผํฉ๋๋ค. (๋ฌผ๋ก ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌ ๊ฐ๋ฅํฉ๋๋ค)
ํ์ง๋ง ์ด๋ ๊ฒ ํด๋ ์์ง ๋ฌธ์ ๊ฐ ๋จ์์์ต๋๋ค
๋ง์ฝ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์จ์ผํด์ ์์ ๋ก์ง์ ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌํ ํ A ์ปดํฌ๋ํธ์ B ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ๊ฐ์ ธ์ฌ๋, ๋ฐ์ดํฐ ์ค๋ณต / ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ์ผ์ด๋ ์ ์์ต๋๋ค.
์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ ์ค๋ณต์ ๋ถ๋ช ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๊ฒ์ด์ง๋ง, ๊ฐ ์ปดํฌ๋ํธ๋ ๊ณ ์ ํ ์ธ์คํด์ค์ด๋ฏ๋ก ๋ ์ปดํฌ๋ํธ ๋ชจ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ก๋ฉ ํ์๋ฅผ ํด์ฃผ์ด์ผํ ๊ฒ์ ๋๋ค.
๋๋ฒ์งธ ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฌธ์ ๋ ๋ ๋ฌธ์ ๊ฐ๋ฉ๋๋ค.
๋ง์ฝ์ A ์ปดํฌ๋ํธ์์๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๋๋ฐ ์ฑ๊ณตํ์์ง๋ง, B์์๋ ์คํจํ๋ค๋ฉด ์ด๋ ๋ฆฌ์กํธ์ ๊ทผ๋ณธ์ ์ธ ์์ด๋์ด์ธ ์์ธก์ฑ์ ๋ฌด๋ํธ๋ฆด๊ฒ์ ๋๋ค.
์๋๋ฉด A ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ฌ๋๋ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๊ฐ a์์ง๋ง ๋ช์ดํ B ์ปดํฌ๋ํธ์์ ๊ฐ์ ธ์ฌ๋์๋ a-1์ผ์๋์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Context API๋ฅผ ๋์ ํ์ฌ ์ ์ญ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ ์๊ฐ ์ด์ `useState`, `useEffect`, `Context`๋ฅผ ๋ชจ๋ ๊ด๋ฆฌํด์ผํ๋ ์ด๋ ค์์ด ์๊ธฐ๋ฉฐ, Context API์ ์ต์ ํ ๋ฌธ์ ๋ ๊ณ ๋ คํด์ผํฉ๋๋ค
๋ง์ฝ ๋ค๋ฅธ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ ์ฌ์ ํ ์๋ฒ ์ํ๋ฅผ ํด๋ผ์ด์ธํธ ์ํ๋ก ๊ด๋ฆฌํ๋ ๋ฌธ์ ,, ์ฆ ๋น๋๊ธฐ ์ํ๋ฅผ ๋๊ธฐ ์ํ๋ก ๊ด๋ฆฌํ๋ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ ๋์์ ์ค ์ ์๋ ๊ฒ์ด React Query์ ๋๋ค.
์ดํ ๊ธ์์ React Query์ ๋ํด์ ํ๋์ฉ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค
02 - React Query with Suspense
[React] React Query ์์๋ณด๊ธฐ 02 - React Query with Suspense
Suspense์ ํ์์ฑ์๋ฒ ์ํ๋ฅผ ๋ค๋ฃฐ ๋, ์ค์ํ๊ฒ ๊ณ ๋ คํด์ผ ํ ์ ์ค ํ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์์ ๊ณผ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์์ ์ฌ์ด์ ์ผ์ ํ ์๊ฐ์ด ์กด์ฌํ๋ค๋ ์ ์ ๋๋ค.์ด ๋ง์ ์ฆ, ๋ฐ์ดํฐ
joseph0926.tistory.com
[React] React Query ์์๋ณด๊ธฐ 03 - React Query with SSR
React ์ฑ์ ์ ํต์ ์ธ ๋ฐฉ์๊ณผ ๋ณํ๊ธฐ๋ณธ์ ์ผ๋ก React๋ SPA์ ๋๋ค.์ด ๋ง์ ์ฆ ์ด๊ธฐ์ HTML ๊ป๋ฐ๊ธฐ์ js ๋ฒ๋ค์ ์ ๊ณตํ๊ณ ์ดํ์๋ js๋ฅผ ์ด์ฉํ์ฌ ์ปจํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ ๋ป์ ๋๋ค.ํ์ง
joseph0926.tistory.com