등록 바로 적용되게

류한선·2024년 5월 7일

4차 프로젝트

목록 보기
26/53
'use client'

import { useState } from 'react';
import api from '@/util/api';
import { useRouter } from 'next/navigation'; // 수정

export default function ArticleCreate() {
    const router = useRouter();
    const [article, setArticle] = useState({ subject: '', content: '' });

    const handleSubmit = async (e) => {
        e.preventDefault();

        try {
            await api.post('/articles', article);
            // 등록 성공 시, 이전 페이지로 이동하거나 사용자에게 알림을 제공할 수 있습니다.
            router.push('/article');
        } catch (error) {
            console.error('등록 중 에러:', error);
        }
    };

    const handleChange = (e) => {
        const { name, value } = e.target;
        setArticle({ ...article, [name]: value });
    };

    return (
        <>
            <h3>글 등록</h3>
            <form onSubmit={handleSubmit}>
                <div>
                    <label>제목:</label>
                    <input type="text" name="subject" value={article.subject} onChange={handleChange} />
                </div>
                <div>
                    <label>내용:</label>
                    <textarea name="content" value={article.content} onChange={handleChange} />
                </div>
                <button type="submit">등록</button>
            </form>
        </>
    );
}


'use client'

import { useState } from 'react';
import api from '@/util/api';
import { useRouter } from 'next/navigation'; // 수정
import { useQueryClient } from '@tanstack/react-query';

export default function ArticleCreate() {
    const router = useRouter();
    const queryClient = useQueryClient(); // QueryClient 인스턴스 생성

    const [article, setArticle] = useState({ subject: '', content: '' });

    const handleSubmit = async (e) => {
        e.preventDefault();

        try {
            await api.post('/articles', article);
            // 등록 성공 시, 이전 페이지로 이동하거나 사용자에게 알림을 제공할 수 있습니다.
            queryClient.invalidateQueries('articles'); // 해당 쿼리 무효화
            router.push('/article');
        } catch (error) {
            console.error('등록 중 에러:', error);
        }
    };

    const handleChange = (e) => {
        const { name, value } = e.target;
        setArticle({ ...article, [name]: value });
    };

    return (
        <>
            <h3>글 등록</h3>
            <form onSubmit={handleSubmit}>
                <div>
                    <label>제목:</label>
                    <input type="text" name="subject" value={article.subject} onChange={handleChange} />
                </div>
                <div>
                    <label>내용:</label>
                    <textarea name="content" value={article.content} onChange={handleChange} />
                </div>
                <button type="submit">등록</button>
            </form>
        </>
    );
}


이렇게 하니까 됐다.

import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

queryClient.invalidateQueries('articles'); // 해당 쿼리 무효화
이거가 뭔지 자세히 설명해줘
ChatGPT
useQueryClient는 React Query에서 제공하는 훅 중 하나입니다. 이 훅은 현재 React 컴포넌트 내에서 사용되고 있는 QueryClient 인스턴스를 반환합니다. QueryClient는 데이터 캐시 및 관리, 쿼리와 뮤테이션의 실행, 캐시된 데이터의 재사용 등을 관리하는 핵심 객체입니다.

queryClient.invalidateQueries('articles')는 QueryClient에게 특정 쿼리를 무효화하도록 지시하는 메서드입니다. 여기서 'articles'는 무효화하려는 쿼리의 키입니다. 이는 해당 키에 연결된 모든 캐시된 데이터를 제거하고, 필요할 경우 해당 쿼리를 다시 실행하여 최신 데이터를 다시 가져오게 됩니다.

따라서 위의 코드는 게시글을 등록한 후에 articles라는 쿼리를 다시 실행하여 최신 데이터를 가져오도록 요청하는 것입니다. 이로써 새로운 게시글이 즉시 목록에 반영되도록 합니다.

User
'articles'는 무효화 하면 어떻게 되는데?
ChatGPT
'articles'를 무효화하면 React Query는 해당 쿼리에 연결된 데이터를 캐시에서 제거합니다. 이것은 캐시된 데이터가 현재 상태와 동기화되지 않았다는 것을 의미합니다. 그런 다음 필요할 경우 새로운 데이터를 가져와서 다시 캐시하고 컴포넌트에 반영합니다.

여기서 'articles'는 게시글 목록을 가져오는 쿼리의 키입니다. 게시글이 새로 등록되었을 때 이 쿼리를 무효화하면 React Query는 해당 쿼리를 새로 고치도록 트리거하고, 최신 게시글 목록을 다시 가져와서 캐시에 저장합니다. 따라서 무효화가 발생하면 새로운 게시글이 즉시 목록에 반영될 것입니다.

User
articles 이 무슨 역할을 하고 있었는데?
ChatGPT
'articles'는 게시글 목록을 가져오는데 사용되는 쿼리의 식별 키(key)입니다. React Query에서는 쿼리를 사용하여 데이터를 가져오고 관리합니다. 각각의 쿼리는 고유한 식별 키를 갖게 되며, 이 키를 사용하여 해당 쿼리에 연결된 데이터를 캐시하고 관리합니다.

여기서 'articles'는 게시글 목록을 가져오는 쿼리의 키로 사용되고 있습니다. 이 쿼리는 게시글 목록을 가져오는데 사용되며, 데이터의 캐시와 관련된 작업 및 데이터의 무효화(invalidation) 등에 사용됩니다.

즉, 'articles'는 React Query가 게시글 목록 데이터를 관리하기 위해 사용하는 식별 키이며, 이를 통해 해당 데이터를 캐시하고 다시 불러오는 작업을 수행할 수 있습니다.

0개의 댓글