노션 클로닝 회고

자바스크립트와 더 친해진 것 같다..!

2023-07-18

노션 프로젝트 회고록

마크다운 이미지

보러가기

노션 클로닝 회고를 kpt방법으로 진행해보려고 합니다! kpt방법은

이 세 단계에 거쳐서 회고를 하는 것입니다!.

프로젝트 요구사항

먼저 기본 요구 사항은 다음과 같습니다

다음으로 보너스 요구사항은 다음과 같습니다.

기본사항만큼은 제대로 지키는 것을 목표로 개발을 진행했습니다


최종 컴포넌트 구조

좌측의 Document들의 리스트들과 관련된 컴포넌트들을 DocumentPage에서, 편집기와 관 련된 컴포넌트들은 DocumentEditPage에서 조율하도록 하였습니다.

최종 컴포넌트 구조

Keep

가장 좋았던 점은 컴포넌트를 어떻게 독립적으로 구성하면 좋을지, 컴포넌트는 어떤 역할을 해야만 하는지 배운 것입니다.

기존 제가 짰던 코드들을 보면, 되게 명령형적으로 코드를 짠 것을 볼 수 있습니다.. 부끄럽지만,실제 제가 1년 전에 ..짰던 코드를 보면

DOM요소를 가져와서 ->  어떤 연산을 해! 하는 명령형 코드로 작성된 것을 볼 수 있습니다.
이러면 코드를 다시 사용하기에도 모호해지고, 특정 파일에만 종속적인 코드가 되어버립니다!
const FindEqualItem = document.querySelector('.item.OperCalculate');
/*
수식을 저장할 거임
*/

const StoreExpress = document.querySelector('.item.StoreExpresstion');
/* 
=가 아닌 item 전부 찾아서 클릭하면 문자열 덧붙임
*/

const FindAllItem = document.querySelectorAll('.item:not(.OperCalculate)');
Array.from(FindAllItem).forEach((EachItem) => {
  EachItem.addEventListener('click', () => {
    FindAllItem[0].innerHTML += EachItem.innerHTML;
  });
});
/*

AC->누르면 둘 다 초기화 해줌
*/
const Init = document.querySelector('.item.OperInit');
Init.addEventListener('click', () => {
  FindAllItem[0].innerHTML = '';
  StoreExpress.innerHTML = '';
});

이렇게 한 파일안에서 종속적인 코드가 아닌, 독립적으로 다시 쓸 수 있는 컴포넌트를 만들고 설계하는 법을 배운게 가장 좋았던 점입니다!

이번 과제를 하면서 가장 크게 중점을 둔 것은 아래의 3가지 항목입니다!

실제로 이렇게 명확히 컴포넌트의 역할에 집중하다보니, 틀린부분을 찾았을때 고치기 에도 매우 쉬워졌습니다. 추가적인 요구사항이 들어왔을떄에도 잘 적용할 수 있을 것 같았어요!

Problem

과제를 하면서 마주친 문제는 총 2가지입니다.

편집중일떄 -> 문서의 리스트의 상태를 바꿔서 문서의 리스트들을 다시 그려야 할 필요가 있었습니다.

과제뿐만 아니라,, 실제 현업에서 어떻게 API 실패를 처리하는지 가장 궁금하기도 했던 주제였습니다!

마크다운 이미지

Try

//App.js

//편집기의 제목이 바뀌면 리스트들을 다시 그리는 함수를 props로 전달!!
const documentEditPage = new DocumentEditPage({
  $target,
  initalState: {
    documentId: 'new',
    document: {
      title: '',
      content: '',
    },
  },
  onChangeEditorTitle: () => {
    documentPage.render();
  },
});

다만 이 방법이 적절한가?를 스스로 생각해보았을떄, 지금 프로젝트보다 더 복잡한 구 조, 컴포넌트가 많이 생기는 구조에서는 적절치 못하다는 느낌을 받았습니다.

어쩌면 지금의 구조보다 더 복잡한 구조가 된다면, 전역적으로 관리할 저장소가 필요 하다는 느낌을 받았어요!

const request = async (url, options = {}) => {
  const res = await fetch(`${API_ENDPOINT}${url}`, {
    ...options,
    headers: {
      'Content-type': 'application/json',
      'x-username': `${USER_NAME}`,
    },
  });

  if (res.ok) {
    return res.json();
  }
  switch (res.status) {
    case 400:
      throw new Error(API_ERROR.ERROR_400);
    case 401:
      throw new Error(API_ERROR.ERROR_401);
    case 403:
      throw new Error(API_ERROR.ERROR_403);
    case 404:
      throw new Error(API_ERROR.ERROR_404);
    default:
      throw new Error(API_ERROR.ERROR_DEFAULT);
  }
};

느낀점

노션 클로닝 프로젝트 동안, 컴포넌트의 역할, 자바스크립트로 컴포넌트를 어떻게 만 드는지 많이 깨달았던 것 같습니다. 개발을 계속 하면서 제가 데브코스에서 꼭 이루고 싶었던, 순수 자바스크립트를 잘 알고, 잘 다루는 사람에 조금이나마 가까워 진 느낌 이였어요.

마크다운 이미지

실제 과제의 코드는 아래의 링크에서 보실 수 있습니다!

PR링크