10.04 항해 22일차 TIL

한우석·2021년 10월 4일

이때까지 강의를 들으면서 한번도 숙제 해설 영상을 본적이 없었는데 이번 숙제를 하면서 도저히 답이 보이지 않아 해설 영상을 보며 숙제를 완성 하였다.

업데이트 기능을 하는 미들웨어를 구현해야 했는데 혼자서도 뭔가 될 것 같아서 계속 해보다가 5시간을 삽질 하고나서 더 하다가는 한달 뒤에나 과제를 시작하겠다 싶어서 결국 해설 영상을 보았는데 해설 영상을 보고 나서도 코드 자체가 이해가 되지 않아 한줄 한줄 나름대로 해석을 해가며 작성 해보았다.

달아놓은 주석이 100% 맞는다는 확신은 없지만 어느정도 코드의 흐름을 이해 하는데 도움이 된 것 같다..

그리고 느낀 점이 답을 보지 않고 풀더라도 해설 영상을 보며 조금 더 효율적인 코드를 설계하는 법을 배우는게 더 좋은 방법인 것 같다.

아래는 post를 업데이트 하는 미들웨어 코드를 해석한 것이다.

// update middleware
// 파라미터로 게시글을 구분하기 위한 post id와 업데이트한 내용인 post를 받는다
const editPostFB = (post_id = null, post = {}) => {
  return function (dispatch, getState, { history }) {
    // post_id가 없다면 return한다.
    if (!post_id) {
      console.log("게시물 정보가 없어요!");
      return;
    }
	
    // preview를 state에서 가져온다.
    const _image = getState().image.preview;
// findIndex를 사용하여 state에 있는 게시글 중 파라미터로 받은 post_id와 같은 id값을 가진 게시글을 가져온다.
    const _post_idx = getState().post.list.findIndex((p) => p.id === post_id);
    const _post = getState().post.list[_post_idx];

    console.log(_post);

    // firestore에서 post 콜렉션을 가져온다.
    const postDB = firestore.collection("post");
	
    // preview값이 기존에 있는 이미지와 같을 때(이미지를 변경하지 않음)
    if (_image === _post.image_url) {
      
      // postDB의 post_id를 가진 항목을
      postDB
        .doc(post_id)
      // post로 업데이트 한다.
        .update(post)
      //후처리가 끝나면 editPost함수를 호출하여 Post를 수정한다.
        .then((doc) => {
          dispatch(editPost(post_id, { ...post }));
        // 수정 후 홈으로 돌아간다.
          history.replace("/");
        });

      return;
      // preview값이 기존에 있는 이미지와 다를 때 (이미지를 변경 함)
    } else {
      //state에서 user의 uid를 가져온다.
      const user_id = getState().user.user.uid;
      //"images/uid_현재시간" 의 형식으로 참조를 만든다
      const _upload = storage
        .ref(`images/${user_id}_${new Date().getTime()}`)
      // 이미지를 data_url형식으로 storage에 추가한다.
        .putString(_image, "data_url");

      // data_url을 이미지 주소로 변환해서 가져온다.
      _upload.then((snapshot) => {
        snapshot.ref
          .getDownloadURL()
          .then((url) => {
            console.log(url);

            return url;
          })
        	//체이닝으로 url을 가져온다.
          .then((url) => {
           //post정보와 변경 된 이미지를 업데이트 한다.
            postDB
              .doc(post_id)
              .update({ ...post, image_url: url })
              .then((doc) => {
                dispatch(editPost(post_id, { ...post, image_url: url }));
                history.replace("/");
              });
          })
        // 에러 발생 시 alert를 띄운다.
          .catch((err) => {
            window.alert("앗! 이미지 업로드에 문제가 있어요!");
            console.log("앗! 이미지 업로드에 문제가 있어요!", err);
          });
      });
    }
  };
};
profile
H/W 개발자에서 프론트 엔드 개발자로 전향 하고 있는 초보 개발자

0개의 댓글