React Query useMutation
의 사용법에 대해 설명드리겠습니다. useMutation
은 데이터를 생성, 수정, 삭제하는 비동기 작업을 처리하는 데 사용됩니다. 이는 React Query의 상태 관리와 비동기 로직을 간소화하고, 성공, 실패 및 진행 중 상태를 쉽게 관리할 수 있도록 돕습니다.
useMutation
사용법import { useMutation } from '@tanstack/react-query';
const mutation = useMutation({
mutationFn: async (data) => {
// 비동기 작업 (API 호출 등)
const response = await fetch('/api/resource', {
method: 'POST',
body: JSON.stringify(data),
headers: { 'Content-Type': 'application/json' },
});
return response.json();
},
onSuccess: (data) => {
// 성공 시 동작
console.log('Mutation 성공:', data);
},
onError: (error) => {
// 실패 시 동작
console.error('Mutation 실패:', error);
},
});
mutation.mutate()
를 호출하여 비동기 작업을 실행합니다.mutation.mutateAsync()
를 사용하면 Promise
를 반환하여 추가적인 비동기 로직과 결합할 수 있습니다.<button onClick={() => mutation.mutate({ id: 1, name: 'New Resource' })}>
Trigger Mutation
</button>
useMutation
주요 옵션mutationFn
mutationFn
은 Promise
를 반환해야 합니다.mutationFn: async (data) => {
return await fetch('/api/resource', {
method: 'POST',
body: JSON.stringify(data),
headers: { 'Content-Type': 'application/json' },
});
};
onSuccess
onSuccess: (data) => {
console.log('Success:', data);
queryClient.invalidateQueries(['resource']); // 특정 쿼리를 새로고침
};
onError
onError: (error) => {
console.error('Error occurred:', error);
alert('작업에 실패했습니다.');
};
onSettled
onSettled: () => {
console.log('작업 완료');
};
isPending
: Mutation이 진행 중인지 나타냅니다.isSuccess
: Mutation이 성공했는지 나타냅니다.isError
: Mutation이 실패했는지 나타냅니다.error
: 실패 시 반환된 에러 객체입니다.data
: 성공 시 반환된 데이터입니다.if (mutation.isPending) {
return <p>작업 진행 중...</p>;
}
if (mutation.isError) {
return <p>작업 실패: {mutation.error.message}</p>;
}
if (mutation.isSuccess) {
return <p>작업 성공: {mutation.data}</p>;
}
useMutation
의 실제 예제import { useMutation } from '@tanstack/react-query';
const updateComment = async ({ id, content }: { id: number; content: string }) => {
const response = await fetch(`/api/comments/${id}`, {
method: 'PUT',
body: JSON.stringify({ content }),
headers: { 'Content-Type': 'application/json' },
});
if (!response.ok) {
throw new Error('댓글 수정 실패');
}
return response.json();
};
const CommentEditor = ({ commentId, initialContent }: { commentId: number; initialContent: string }) => {
const [content, setContent] = useState(initialContent);
const mutation = useMutation({
mutationFn: updateComment,
onSuccess: () => {
alert('댓글이 수정되었습니다!');
},
onError: (error) => {
console.error(error);
alert('댓글 수정 중 오류가 발생했습니다.');
},
});
const handleSubmit = () => {
mutation.mutate({ id: commentId, content });
};
return (
<div>
<textarea value={content} onChange={(e) => setContent(e.target.value)} />
<button onClick={handleSubmit} disabled={mutation.isPending}>
{mutation.isPending ? '수정 중...' : '수정 완료'}
</button>
</div>
);
};
useMutation
기본 구조:
mutationFn
에 비동기 작업 정의.onSuccess
, onError
, onSettled
콜백 함수로 결과 처리.상태 관리:
isPending
, isError
, isSuccess
상태를 활용해 UI와 비동기 작업을 연동.주요 장점: