React

React와 Node.js 방명록 개발(8): 상세보기 및 수정 페이지 구현

atomicdev 2024. 11. 2. 12:40
728x90
 

상세보기 및 수정 페이지 구현

내용 요약 및 학습 목표

  1. 상세보기 페이지 구현
    • 특정 글의 내용을 확인하는 상세보기 페이지 구현
    • 글의 작성 내용, 작성자명, 작성 시간 등을 표시
    • React Query를 통해 특정 글의 데이터를 API로부터 가져오기
  2. 글 수정 페이지 구현
    • 글 수정 페이지에서 기존 내용을 수정할 수 있도록 구현
    • 작성 내용, 작성자명 등 기존 데이터를 폼에 채워서 수정 가능
    • 수정 후 저장/취소 버튼으로 데이터 반영 및 페이지 이동 설정
  3. React Router로 페이지 라우팅 설정
    • React Router를 사용해 상세보기와 수정 페이지로 이동
    • 각 페이지 간의 데이터 연동 설정하여 UX 개선

실습 세부 내용

  1. 상세보기 페이지 구현: 글 내용, 작성자, 작성시간 표시
    • 데이터 패칭: React Query를 사용해 특정 글의 데이터를 가져옵니다.
    • 상세보기 UI: 글의 작성 내용, 작성자, 작성 시간을 표시하는 UI를 구성합니다.
      // PostDetail.js
      import React from 'react';
      import { useParams, Link } from 'react-router-dom';
      import { useQuery } from 'react-query';
      import axios from 'axios';
      
      const fetchPost = async (id) => {
        const { data } = await axios.get(`http://localhost:5000/api/posts/${id}`);
        return data;
      };
      
      const PostDetail = () => {
        const { id } = useParams();
        const { data, isLoading, error } = useQuery(['post', id], () => fetchPost(id));
      
        if (isLoading) return <div>Loading...</div>;
        if (error) return <div>Error occurred</div>;
      
        return (
          <div>
            <h2>{data.title}</h2>
            <p>작성자: {data.name}</p>
            <p>{data.message}</p>
            <p>작성시간: {new Date(data.created_at).toLocaleString()}</p>
            <Link to={`/edit/${id}`} className="btn btn-primary">수정하기</Link>
            <Link to="/" className="btn btn-secondary">목록으로</Link>
          </div>
        );
      };
      
      export default PostDetail;
     
  2. 글 수정 페이지 구현: 기존 글을 수정할 수 있는 폼과 저장/취소 버튼
    • 수정 페이지 UI: 기존 글의 데이터를 불러와서 수정 가능한 폼을 만듭니다.
    • 수정 API 연동: 사용자가 수정한 데이터를 서버에 업데이트하도록 설정합니다.
    • 취소 기능: 사용자가 수정 작업을 취소할 수 있는 버튼을 추가합니다.
      // EditPost.js
      import React, { useState } from 'react';
      import { useParams, useNavigate } from 'react-router-dom';
      import { useQuery, useMutation } from 'react-query';
      import axios from 'axios';
      
      const fetchPost = async (id) => {
        const { data } = await axios.get(`http://localhost:5000/api/posts/${id}`);
        return data;
      };
      
      const EditPost = () => {
        const { id } = useParams();
        const navigate = useNavigate();
        const { data, isLoading } = useQuery(['post', id], () => fetchPost(id));
      
        const [name, setName] = useState(data ? data.name : '');
        const [message, setMessage] = useState(data ? data.message : '');
      
        const mutation = useMutation(
          (updatedPost) => axios.put(`http://localhost:5000/api/posts/${id}`, updatedPost),
          {
            onSuccess: () => navigate(`/post/${id}`),
          }
        );
      
        const handleSubmit = (e) => {
          e.preventDefault();
          mutation.mutate({ name, message });
        };
      
        if (isLoading) return <div>Loading...</div>;
      
        return (
          <form onSubmit={handleSubmit}>
            <div>
              <label>작성자:</label>
              <input
                type="text"
                value={name}
                onChange={(e) => setName(e.target.value)}
              />
            </div>
            <div>
              <label>메시지:</label>
              <textarea
                value={message}
                onChange={(e) => setMessage(e.target.value)}
              />
            </div>
            <button type="submit" className="btn btn-primary">저장</button>
            <button type="button" className="btn btn-secondary" onClick={() => navigate(-1)}>취소</button>
          </form>
        );
      };
      
      export default EditPost;
     
  3. React Router로 페이지 라우팅 설정
    • 라우터 설정: React Router에서 상세보기와 수정 페이지로 이동할 수 있도록 설정합니다.
    • 라우팅 적용: Link 컴포넌트를 사용해 글 목록에서 상세보기 페이지로, 상세보기에서 수정 페이지로 이동을 설정합니다.
      // App.js
      import React from 'react';
      import { QueryClient, QueryClientProvider } from 'react-query';
      import PostList from './components/PostList';
      import WriteForm from './components/WriteForm';
      
      const queryClient = new QueryClient();
      
      function App() {
        return (
          <QueryClientProvider client={queryClient}>
            <div className="App">
              <h1>Guestbook</h1>
              <WriteForm />
              <PostList />
            </div>
          </QueryClientProvider>
        );
      }
      
      export default App;
     

 

 

 

결론

이번 강의에서는 방명록의 상세보기와 수정 페이지를 구현하며, React Router를 통해 페이지 간 이동과 데이터 연동을 학습했습니다. React Query와 Redux를 함께 사용하여 데이터의 실시간 업데이트를 구현했으며, 이를 통해 더 완성도 높은 웹 애플리케이션을 구축할 수 있었습니다.

728x90