본문 바로가기
프론트엔드로 가는 길/portfolio 제작 여정기 👩🏻‍💻

08. 자살예방웹사이트 - 게시글 수정페이지 value값 넣기

by woody-j 2023. 9. 14.

게시글 수정 어떻게하지

 

고민해보자.. 음.. postId로 내 게시글을 작성하던 시점으로 돌아가서 기존에 저장된 데이터를 value에 보여주면 되지않을까?

일단 내가 하고 싶은 건 게시글 작성 폼으로 다시 돌아가서 수정하게 하는 것

 

[Cloud FireStore - posts Data]

[EditPostForm]

난 참 비동기가 헷갈린다. 확실히하고 넘어가야겠다.

 

  useEffect(() => {
    // Firebase Firestore에서 해당 게시물의 정보를 가져오는 비동기 함수
    async function fetchPost() {
      try {
        const postRef = doc(collection(db, "posts"), postId); 
        const docSnap = await getDoc(postRef);

        if (docSnap.exists()) {
        // 게시물 정보를 가져온다
          const postData = docSnap.data(); 
          setDetailPost({ ...postData, postId });
          console.log(detailPost, "detailPost");
        } else {
          console.log("게시물을 찾을 수 없습니다.");
        }
      } catch (error) {
        console.error("게시물을 불러오는 중 오류가 발생했습니다.", error);
      }
    }
// 게시물 정보를 가져오는 함수 호출
    fetchPost(); 
  }, [postId]);

console.log(detailPost, "detailPost"); 를 한 결과

detailPost가 null로 뜨는 이유는 fetchPost 함수가 비동기로 데이터를 가져오기 때문이다

fetchPost 함수가 실행되는 동안은 데이터가 아직 로드되지 않았으므로 detailPost가 null일 수 밖에..

 

동기 : 순차진행


직렬적으로 태스크를 수행하는 방식이다.
즉, 요청을 보낸 후 응답을 받아야지만 다음 동작이 이루어지는 방식이다. 어떠한 태스크를 처리할 동안 나머지 태스크는 대기한다.
실제로 cpu가 느려지는 것은 아니지만 시스템의 전체적인 효율이 저하된다고 할 수 있다.


비동기: 동시진행


병렬적으로 태스크를 수행하는 방식이다.
요청을 보낸 후 응답의 수락 여부와는 상관없이 다음 태스크가 동작하는 방식이다.
a 태스크가 실행되는 시간 동안 b 태스크를 할 수 있으므로 자원을 효율적으로 사용할 수 있다.
이때, 비동기 요청시 응답 후 처리할 '콜백 함수'를 함께 알려준다. 따라서 해당 태스크가 완료되었을 때, '콜백 함수'가 호출된다.

 

-> 문제 : 여러 개의 콜백 함수가 중첩되어 복잡도가 높아지는 콜백 헬 발생 할 수 있음

 

[해결방안]

fetchPost 함수가 데이터를 가져온 후에 폼 컨트롤의 초기값을 설정해한다.

fetchPost 함수가 데이터를 가져온 후에 setDetailPost를 호출하면,

컴포넌트가 리렌더링되고 detailPost가 새로운 값으로 업데이트됩니다.

그리고나서 폼 컨트롤의 초기값을 설정할 수 있다.

 

useEffect(() => {
    async function fetchPost() {
      try {
        const postRef = doc(collection(db, "posts"), postId);
        const docSnap = await getDoc(postRef);

        if (docSnap.exists()) {
          const postData = docSnap.data();
          setDetailPost({ ...postData, postId });
        } else {
          console.log("게시물을 찾을 수 없습니다.");
        }
      } catch (error) {
        console.error("게시물을 불러오는 중 오류가 발생했습니다.", error);
      }
    }

    fetchPost();
  }, [postId]);

  // detailPost가 업데이트될 때마다 초기값 설정
  useEffect(() => {
    if (detailPost) {
       setTitle(detailPost.title);
      setContent(detailPost.content);
    }
  }, [detailPost]);

 

 

참고 블로그 :https://velog.io/@khy226/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%9E%80-Promise-asyncawait-%EA%B0%9C%EB%85%90https://lunuloopp.tistory.com/entry/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%9D%B4%ED%95%B4-callback%ED%95%A8%EC%88%98-promise-async-await