React μ ν리μΌμ΄μ
μμ μλ² μνλ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬νλ λ°©λ² μ€ νλλ TanStack Queryλ₯Ό μ¬μ©νλ κ²μ
λλ€.
μ€λμ μλ² λ°μ΄ν°λ₯Ό μ
λ°μ΄νΈν λ μ μ©ν useMutation ν
μ μ΄ν΄λ³΄κ³ , μ κ° μ€μνλ κ²½νμ 곡μ νλ € ν©λλ€.
TanStack Query(ꡬ React Query)λ μλ² μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ‘, λ€μκ³Ό κ°μ ν΅μ¬ κΈ°λ₯μ μ 곡ν©λλ€:
β λ°μ΄ν° νμΉ(Fetching) λ° μΊμ± β API λ°μ΄ν°λ₯Ό μλμΌλ‘ μΊμ±νμ¬ λΆνμν λ€νΈμν¬ μμ²μ μ€μ
λλ€.
β μλ κ°±μ (Refetching) β λ°μ΄ν°κ° λ³κ²½λλ©΄ μλμΌλ‘ μ΅μ μνλ‘ λκΈ°νλ©λλ€.
β μ μ μν λκΈ°ν β μ¬λ¬ μ»΄ν¬λνΈμμ κ°μ λ°μ΄ν°λ₯Ό 곡μ ν λ νΈλ¦¬ν©λλ€.
β λ‘λ© & μλ¬ νΈλ€λ§ β λ‘λ©, μ±κ³΅, μλ¬ μνλ₯Ό μλμΌλ‘ κ΄λ¦¬ν©λλ€.
π‘ μλ₯Ό λ€μ΄, λ²νΌμ λλ¬ API λ°μ΄ν°λ₯Ό μ
λ°μ΄νΈν λ, useMutationμ νμ©νλ©΄ κΉλνκ² μ²λ¦¬ν μ μμ΅λλ€.
useMutation ν
μ λ°μ΄ν°λ₯Ό λ³κ²½νλ API μμ²(POST, PUT, DELETE) μ κ΄λ¦¬ν λ μ¬μ©λ©λλ€.
useQueryλ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ λ μ¬μ©νμ§λ§, useMutationμ λ°μ΄ν°λ₯Ό λ³κ²½(μ
λ°μ΄νΈ, μμ , μΆκ°) ν λ μ¬μ©ν©λλ€.μλλ useMutationμ μ¬μ©νμ¬ νΉμ λ°μ΄ν°λ₯Ό μ
λ°μ΄νΈνλ μμ μ
λλ€.
import { useMutation, useQueryClient } from "@tanstack/react-query";
import React from "react";
import { updateTestResultVisibility } from "../api/testResults";
import Button from "../components/Button";
const Example = ({ result }) => {
const queryClient = useQueryClient();
// β
useMutationμ μ¬μ©νμ¬ λ°μ΄ν° μ
λ°μ΄νΈ
const visibleToggleMutation = useMutation({
mutationFn: updateTestResultVisibility, // API νΈμΆ ν¨μ
onSuccess: () => {
// π μ±κ³΅νλ©΄ μΊμλ₯Ό 무ν¨ννμ¬ μ΅μ λ°μ΄ν° κ°μ Έμ€κΈ°
queryClient.invalidateQueries({ queryKey: ["testResults"] });
},
});
return (
<Button
primary="true"
text={result.visibility ? "λΉκ³΅κ°λ‘ μ ν" : "곡κ°λ‘ μ ν"}
onClickFunc={() =>
visibleToggleMutation.mutate({
id: result.id,
visibility: !result.visibility, // νμ¬ μν λ°μ
})
}
/>
);
};
export default Example;
μ¬μ€ μ²μμλ μλμ²λΌ mutateμ λ κ°μ μΈμλ₯Ό μ λ¬νμμ΅λλ€.
// β μλͺ»λ μ½λ: λ λ²μ§Έ μΈμλ μ΅μ
μΌλ‘ μΈμλ¨
visibleToggleMutation.mutate(result.id, !result.visibility);
μ΄λ κ² μμ±νλ©΄ λ λ²μ§Έ μΈμκ° mutationμ μ΅μ
μΌλ‘ ν΄μλμ΄ APIμ μ λλ‘ μ λ¬λμ§ μμ΅λλ€.
useMutationμ mutate ν¨μλ "νλμ κ°λ§" λ°λλ‘ μ€κ³λμ΄ μκΈ° λλ¬Έμ
λλ€.
// β
μ¬λ°λ₯Έ μ½λ: κ°μ²΄λ‘ λ¬Άμ΄μ μ λ¬
visibleToggleMutation.mutate({
id: result.id,
visibility: !result.visibility,
});
μ΄μ APIμ μ¬λ°λ₯Έ κ°μ΄ μ λ¬λλ©΄μ λ²νΌ ν΄λ¦ μ μ¦μ λ°μλκ³ , μ΅μ μνκ° μ μ§λ©λλ€. π
β useMutationμ λ°μ΄ν°λ₯Ό λ³κ²½(μ
λ°μ΄νΈ, μμ , μΆκ°)ν λ μ¬μ©
β mutate ν¨μλ νλμ κ°μ²΄λ₯Ό μ λ¬ν΄μΌ νλ€.
β onSuccessμμ queryClient.invalidateQueries(["testResults"])λ₯Ό νΈμΆνλ©΄ λ°μ΄ν°κ° μλμΌλ‘ μ΅μ μνλ‘ κ°±μ
π React νλ‘μ νΈμμ TanStack Queryλ₯Ό μ κ·Ή νμ©νλ©΄, API μν κ΄λ¦¬κ° λμ± νΈλ¦¬ν΄μ§λλ€.
μμΌλ‘λ λ€μν μν©μμ useMutationμ νμ©ν΄λ³΄μΈμ! ππ₯